文章目录
HDAPI和HLAPI
规则形状物体
不规则形状物体
不连续平面物体

touch is phantom omni
HD 之前已经很熟悉了,本篇博文主要是探究一下HL。


HDAPI和HLAPI


HLAPI设计用于高级触觉场景渲染。 它面向不熟悉触觉编程但希望快速轻松地将触觉添加到现有图形应用程序中的高级OpenGL开发人员。HDAPI是触觉的底层基础层。 它最适合已熟悉触觉范例并直接发送力的开发人员。 这包括对触觉研究,远程呈现和远程操纵感兴趣的人员。 专家仍然可以将HLAPI和HDAPI与QuickHaptics结合使用,以利用所有SDK。


HLAPI建立在HDAPI之上,与HDAPI相比,它以比HDAPI更大的灵活性为代价,提供了对触觉的更高级别的控制。 HLAPI的主要设计目的是让熟悉OpenGL编程的人易于使用。 例如,HLAPI程序员将不必担心诸如设计力方程,处理线程安全性以及为触觉渲染实现高效的数据结构之类的底层问题。 HLAPI遵循OpenGL API中的传统图形技术。 向对象添加触觉是一个相当琐碎的过程,类似于用于以图形方式表示对象的模型。 触觉特性(例如刚度和摩擦)也类似地抽象到了材料上。

HLAPI还提供事件处理功能,以简化与应用程序的集成。
例如,当使用HDAPI时,创建触觉/图形球体涉及编写图形代码并创建用于处理球体力的调度程序回调。 使用HLAPI时,该过程涉及创建图形球,然后在绘制图形球时使用所需的触觉形状类型调用hlBeginShape()。


HDAPI要求开发人员管理触觉设备的直接力渲染,而HLAPI根据几何图元,变换和材料属性处理触觉渲染的计算。使用HDAPI进行直接力绘制需要高效的力绘制/碰撞检测算法和数据结构。这是由于对触觉设备进行稳定的闭环控制所需的力刷新频率很高。 HLAPI在这方面有所不同,因为它使开发人员不必实施高效的力绘制算法,也不必管理伺服环路线程安全数据结构和状态的同步。


HLAPI允许开发人员从图形渲染循环中命令触觉渲染管道,这使得开发人员将触觉渲染引入现有图形循环驱动的应用程序的可能性大大提高。
HLAPI支持事件驱动的编程模型,该模型简化了涉及诸如触摸几何体,按钮单击和运动之类的事件的复杂触觉交互的实现。 HDAPI不提供事件作为API的一部分。但是,OpenHaptics工具箱确实提供了HapticDevice C ++实用程序类,该类提供了与HDAPI一起使用的基本事件回调基础结构。 HLAPI仅在笛卡尔空间级别上处理设备,而HDAPI可以访问较低级别的控制空间,例如原始编码器和电机关节扭矩值。

简单来说就是HD更偏向底层一点,因此用起来也更麻烦,你在建立一个模型时还要建立他的力反馈方程去进行碰撞检测等等。而HL则是在使用openGL渲染的时候进行的处理。

规则形状物体
可以看出力渲染和图形渲染都在glutDisplay()。
drawSceneGraphics()画出物体,drawSceneHaptics()根绝openGL画的图像和hlMaterialf()进行力的渲染。
这些都是API,因此在这里就没有做底层的探究。
在实际实验中会发现,力反馈并不稳定,并且经常会出现穿模的现象。

/*******************************************************************************
 GLUT callback for redrawing the view.
*******************************************************************************/
void glutDisplay()
{   
    drawSceneHaptics();

    drawSceneGraphics();

    glutSwapBuffers();
}

/*******************************************************************************
 The main routine for displaying the scene.  Gets the latest snapshot of state
 from the haptic thread and uses it to display a 3D cursor.
*******************************************************************************/
void drawSceneGraphics()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);           

    // Draw 3D cursor at haptic device position.
    drawCursor();

    // Draw a sphere using OpenGL.
    glutSolidSphere(0.5, 32, 32);
}

/*******************************************************************************
 The main routine for rendering scene haptics.
*******************************************************************************/
void drawSceneHaptics()
{    
    // Start haptic frame.  (Must do this before rendering any haptic shapes.)
    hlBeginFrame();

    // Set material properties for the shapes to be drawn.
    hlMaterialf(HL_FRONT_AND_BACK, HL_STIFFNESS, 0.7f);
    hlMaterialf(HL_FRONT_AND_BACK, HL_DAMPING, 0.1f);
    hlMaterialf(HL_FRONT_AND_BACK, HL_STATIC_FRICTION, 0.2f);
    hlMaterialf(HL_FRONT_AND_BACK, HL_DYNAMIC_FRICTION, 0.3f);

    // Start a new haptic shape.  Use the feedback buffer to capture OpenGL 
    // geometry for haptic rendering.
    hlBeginShape(HL_SHAPE_FEEDBACK_BUFFER, gSphereShapeId);

    // Use OpenGL commands to create geometry.
    glutSolidSphere(0.5, 32, 32);

    // End the shape.
    hlEndShape();

    // End the haptic frame.
    hlEndFrame();
}

不规则形状物体

原理应该和规则形状类似

//描述:
//本示例演示了HLAPI中的新渗透深度功能。
//该演示还包含用于加载3d OBJ模型并在其顶部以触觉方式高度映射纹理的特殊代码。
//这是一种简单的触觉位移映射技术。
//
//此示例还显示了如何根据《 OpenHaptics程序员指南》第6 - 38页给出的信息使用hdCallbacks集成HDAPI和HLAPI。
//
//此模拟中的所有模型和纹理均由mySmartSimulations,Inc.提供。
//
//注意:此演示具有专门为Phantom Omni设计的力和材料刚度,使用其他Phantom可能需要修改这些参数才能获得最佳性能。

不连续平面物体

HD中并没有具体关于他是怎么实现的,因此还是要通过研究HLAPI来看他的实现原理。