C++ 如何更改对象';opengl中的s位置wrt相机?
我需要更改对象相对于摄影机位置的位置。我的意思是,我的物体应该总是在摄像机前面。它应该跟随相机的移动。我需要添加什么来添加我的对象绘制功能?然后您的对象位置应该始终位于:C++ 如何更改对象';opengl中的s位置wrt相机?,c++,opengl,C++,Opengl,我需要更改对象相对于摄影机位置的位置。我的意思是,我的物体应该总是在摄像机前面。它应该跟随相机的移动。我需要添加什么来添加我的对象绘制功能?然后您的对象位置应该始终位于: desiredPosition = cameraPosition + cameraDirection * offset; 如果使用的是旧式固定函数矩阵,则相对于摄影机定位对象的最简单方法是在从堆栈中删除摄影机矩阵后进行定位。例如,您可能有如下矩阵设置: glMatrixMode(GL_MODELVIEW); glLoadId
desiredPosition = cameraPosition + cameraDirection * offset;
如果使用的是旧式固定函数矩阵,则相对于摄影机定位对象的最简单方法是在从堆栈中删除摄影机矩阵后进行定位。例如,您可能有如下矩阵设置:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(...); //Or other camera functions.
for(/*each object*/)
{
glPushMatrix();
//Setup object matrices.
glTranslatef();
glRotatef();
//Setup object rendering.
glDrawElements(); //Draw the object
glPopMatrix();
}
然后将其切换到以下位置:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
gluLookAt(...); //Or other camera functions.
for(/*each object*/)
{
glPushMatrix();
//Setup object matrices.
glTranslatef();
glRotatef();
//Setup object rendering.
glDrawElements(); //Draw the object
glPopMatrix();
}
glPopMatrix(); //Remove camera matrix. MODELVIEW is now identity.
for(/*each camera-relative object*/)
{
glPushMatrix();
//Setup object matrices.
glTranslatef();
glRotatef();
//Setup object rendering.
glDrawElements(); //Draw the object
glPopMatrix();
}
如果您使用的是明暗器,这就更容易了。如果您有一个矩阵堆栈,只需执行与此处相同的基于堆栈的操作。如果您正在做其他事情来构建矩阵,请不要将摄影机矩阵分解到变换中。如果摄影机的“向上”方向与世界空间的向上方向不同,会发生什么情况?您可以随时将“向上”调整为与前向量点垂直,对吗应始终垂直于向上和向前。您的公式没有考虑到向上的位置,因此如果相机绕视图方向旋转,则
所需位置
不会考虑到这一点。@NicolBolas一个位置,位于相机正前方(沿前方
向量,以偏移量
长度移动)即使您滚动
相机(更改向上
/向右
矢量),也将始终保持不变,因此pos+front*scalar
为您提供目标位置。这很简单,如果你需要一幅画,请告诉我。。。