返回原始的openGL原点坐标

时间:2014-01-31 13:34:32

标签: c++ qt opengl

我正在尝试解决有关手臂头像显示的问题。 我正在使用3D跟踪器通过我的串口向我发送坐标和角度。只要我只想在3D空间中显示“手”或木块,它就能很好地工作。 问题是:当我想绘制一个完整的手臂(让我们说手腕是“僵硬的”),所以唯一的自由度是肘部),我正在使用给定的坐标(我已经使用了gltranslatef'd和glmultmatrix'd),但我想绘制另一个四元素基元,其中2个顶点相对于跟踪器坐标(“肘部”的一部分)和2个顶点总是固定在相机旁边(“肩部”的一部分) )。但是,我无法摆脱我的翻译坐标系。 我的问题清楚了吗? 我的代码就像

cubeStretch = 0.15;

computeRotationMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glPushMatrix();
glTranslatef(handX, handY, handZ);
glMultMatrixf(*rotationMatrix);

glBegin(GL_QUADS);
/*some vertices for the "block of wood"*/
/*then a vertex which is relative to handX-handZ*/
glVertex3f(-cubeStretch, -cubeStretch+0.1, 5+cubeStretch);
/*and here I want to go back to the origin*/
gltranslatef(-handX, -handY, -handZ);
/*so the next vertex should preferably be next to the camera; the shoulder, so to say*/
glVertex3f(+0.5,-0.5,+0.5);

我已经知道最后三行不起作用,这只是我试过的方法之一。 我意识到可能很难理解我正在尝试做什么。任何人都知道如何回到“un-gltranslatef'd”坐标原点?

(我宁愿避免为此实施整个骨骼/关节系统。)

编辑:https://imagizer.imageshack.us/v2/699x439q90/202/uefw.png

在图片中你可以看到我到目前为止所拥有的东西。正如您所看到的,到目前为止,重点并不在于美观,而在于使用跟踪器坐标在屏幕上正确显示内容。

白色立方体是目标点,当手臂化身“触摸”它们时会变成红色(“手臂化身”在这里用作右边可怕棕色装置的一个词,但我想你知道我的意思)。我现在想要从“下臂”的后端(化身的宽端应该是手)连接到屏幕右侧。也许它现在更清楚了?

1 个答案:

答案 0 :(得分:1)

a)不推荐使用固定功能堆栈,不应使用它。使用适当的矩阵数学库(如GLM),在转换层次结构中制作分支节点的副本,以便您可以将它们用作不同分支的起点。

b)您可以使用glLoadIdentity随时将矩阵状态重置为标识。使用glPushMatrix和glPopMatrix可以创建堆栈。你知道堆栈是如何工作的,对吗?推送制作副本并将其添加到顶部,以下所有操作都会发生。 Poping删除顶部的元素,并返回上一次推送之前的状态。


更新

关于转换树,您可能会对以下内容感兴趣:

  

(我宁愿避免为此实施整个骨骼/关节系统。)

这实际上是最简单的方法。就固定功能OpenGL而言,骨关节只是glTranslate(…); glRotate(…)的组合。