C++ OpenGL在视图空间中的旋转

C++ OpenGL在视图空间中的旋转,c++,opengl,opengl-compat,C++,Opengl,Opengl Compat,我想使在建模空间中定义的对象在查看空间中转换。通过单击并拖动鼠标(不同的deltaX和deltaY)来控制平移量。下面是运行良好的代码: (参考) 我还想相对于摄影机(屏幕)的x轴旋转对象,旋转量取决于再次拖动鼠标。但是, glTranslated(deltaX, deltaY, 0); 到 对象将被转换。你知道怎么解决这个问题吗?谢谢。我假设wld2cam[cameraIndex]是视图矩阵,cam2wld[cameraIndex]是反向视图矩阵: glLoadMatrixd(cam2wld

我想使在建模空间中定义的对象在查看空间中转换。通过单击并拖动鼠标(不同的deltaX和deltaY)来控制平移量。下面是运行良好的代码: (参考)

我还想相对于摄影机(屏幕)的x轴旋转对象,旋转量取决于再次拖动鼠标。但是,

glTranslated(deltaX, deltaY, 0);


对象将被转换。你知道怎么解决这个问题吗?谢谢。

我假设
wld2cam[cameraIndex]
是视图矩阵,
cam2wld[cameraIndex]
是反向视图矩阵:

glLoadMatrixd(cam2wld[cameraIndex].matrix());
GLT(deltaY,1,0,0);
glMultMatrixd(wld2cam[cameraIndex].matrix());
实际上,您要做的是围绕视图点旋转模型。旋转轴(1,0,0)是视图空间的x轴。如果相机到模型的距离较大且角度较小,则此旋转似乎是平移:

必须为旋转定义轴。比如世界的起源。在“世界的起源”空间中:

const GLdouble*viewMat=cam2wld[cameraIndex].matrix();
GLdouble pivotX=viewMat[12];
GLdouble pivotY=viewMat[13];
GLdouble pivotZ=viewMat[14];
glLoadMatrixd(cam2wld[cameraIndex].matrix());
GLX(数据透视X、数据透视Y、数据透视Z);
GLT(deltaY,1,0,0);
GLX(-pivotX,-pivotY,-pivotZ);
glMultMatrixd(wld2cam[cameraIndex].matrix());

如果要执行复杂的矩阵运算,建议使用以下库:

#包括
#包括
#包括
glm::dmat4 c2w=glm::make_mat4(cam2wld[cameraIndex].matrix());
glm::DMAT4T=glm::translate(glm::dmat4(1.0),glm::dvec3(deltaX,deltaY,0.0));
glm::dmat4 w2c=glm::make_mat4(wld2cam[cameraIndex].matrix());
glm::dmat4 o2w=glm::make_mat4(obj2wld.matrix());
glm::dmat最终=c2w*t*w2c*o2w;
glLoadMatrixd(glm::value_ptr(final));

旋转始终围绕原点进行。如果要围绕空间中的任意中心/轴旋转某个对象,则必须将其与resp组合。平移,在旋转之前将该中心移动到原点,然后恢复平移。也许,这有助于理解:。(它与OpenGL无关,但会涉及一些变换,在2D和3D中没有区别。)正如您所说,我需要在旋转之前定义轴和平移(我忘了提到我希望旋转的中心位于建模空间的中心)。谢谢
glTranslated(deltaX, deltaY, 0);
glRotated(deltaX + deltaY, 1, 0, 0);