在OpenGL中交换Y轴和Z轴

ws51t4hk  于 2022-10-18  发布在  其他
关注(0)|答案(1)|浏览(168)

因此,基本上我已经创建了一个在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()在不同位置的尝试次数。我希望有人能给我一个提示,我的思维过程哪里出了问题。

iswrvxsc

iswrvxsc1#

第一点:看在上帝的份上,使用着色器,而不是旧的OpenGL。
使用着色器,交换2个参数、更改

gl_Position = vec4(x, y, z, 1);

gl_Position = vec4(x, z, y, 1);

我建议您查看this教程中的着色器。
除此之外,在我看来,代码看起来应该可以工作,但如果不工作,我知道glRotate可能有多挑剔,所以我真的没有其他建议,在它工作之前尝试一下。
对不起,我不能给出一个完整的、直接的回答。

相关问题