因此,基本上我已经创建了一个在2D维度(X和Y)中渲染曲线的应用程序。这个应用程序还使用了触觉设备,它被表示为帧内的光标,其中也渲染了曲线。
我唯一想要实现的是将我的投影的y轴Map到我的触觉设备的触觉工作空间的z轴。所以基本上我想控制曲线和光标渲染的逻辑,只更改我的触觉工作空间使用的轴。我用了这个问题:Swap axis y and z
作为指导。实际上,我只需要使用glRotatef(90,1,0,0)来实现我想要的。我试着只旋转我的触觉工作空间的投影矩阵,但遗憾的是,这对我不起作用。
这是我的正常曲线:
这就是在尝试不同选项时的结果:
这是我的代码
重塑回调:
void reshapeCallback(int width, int height) {
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(minX, maxX, minY, maxY, -1, 11);
// glRotatef(90, 1, 0, 0) [4th Try]
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// glRotatef(90, 1, 0, 0) [5th Try]
updateWorkspace();
}
更新工作空间():
void updateWorkspace() {
GLdouble modelview[16];
GLdouble projection[16];
GLint viewport[4];
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
//glRotatef(90, 1, 0, 0) [2nd try]
glGetDoublev(GL_PROJECTION_MATRIX, projection);
//glRotatef(90, 1, 0, 0) [1st try]
glGetIntegerv(GL_VIEWPORT, viewport);
hlMatrixMode(HL_TOUCHWORKSPACE);
hlLoadIdentity();
//glRotatef(90, 1, 0, 0) [3rd try]
// Fit haptic workspace to view volume.
hluFitWorkspace(projection);
// Compute cursor scale.
gCursorScale = hluScreenToModelScale(modelview, projection, viewport);
gCursorScale *= CURSOR_SIZE_PIXELS;
}
DrawLine():
void drawLine() {
static GLuint displayList = 0;
if (displayList)
{
glCallList(displayList);
}
else
{
displayList = glGenLists(1);
glNewList(displayList, GL_COMPILE_AND_EXECUTE);
glPushAttrib(GL_ENABLE_BIT | GL_LIGHTING_BIT);
glDisable(GL_LIGHTING);
glLineWidth(2.0);
glBegin(GL_LINE_STRIP);
for (int i = 0; i < vertices.size(); i += 2) {
glVertex2f(vertices[i], vertices[i + 1]);
}
glEnd();
glPopAttrib();
glEndList();
}
}
我计算了glRotatef()在不同位置的尝试次数。我希望有人能给我一个提示,我的思维过程哪里出了问题。
1条答案
按热度按时间iswrvxsc1#
第一点:看在上帝的份上,使用着色器,而不是旧的OpenGL。
使用着色器,交换2个参数、更改
至
我建议您查看this教程中的着色器。
除此之外,在我看来,代码看起来应该可以工作,但如果不工作,我知道
glRotate
可能有多挑剔,所以我真的没有其他建议,在它工作之前尝试一下。对不起,我不能给出一个完整的、直接的回答。