OpenGL相机类 我试图用C++来为OpenGL创建一个简单的相机类。因此,它基本上使用以下功能: void setModelviewMatrix () { float m[16]; Vector3 eVec(eye.x, eye.y, eye.z); m[0]=u.x; m[4]=u.y; m[8]=u.z; m[12]=-eVec.dotProduct(u); m[1]=v.x; m[5]=v.y; m[9]=v.z; m[13]=-eVec.dotProduct(v); m[2]=n.x; m[6]=n.y; m[10]=n.z; m[14]=-eVec.dotProduct(n); m[3]=0; m[7]=0; m[11]=0; m[15]=1.0; glMatrixMode(GL_MODELVIEW); glLoadMatrixf(m); } void set (Point3 newEye, Point3 newLook, Vector3 newUp) { eye.set(newEye); n.set(eye.x-newLook.x, eye.y-newLook.y, eye.z-newLook.z); u.set(newUp.crossProduct(n)); n.normalize(); u.normalize(); v.set(n.crossProduct(u)); setModelviewMatrix(); } void setShape (float vAng, float asp, float nearD, float farD) { viewAngle = vAng; aspect = asp; nearDist = nearD; farDist = farD; glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(viewAngle, aspect, nearDist, farDist); }

OpenGL相机类 我试图用C++来为OpenGL创建一个简单的相机类。因此,它基本上使用以下功能: void setModelviewMatrix () { float m[16]; Vector3 eVec(eye.x, eye.y, eye.z); m[0]=u.x; m[4]=u.y; m[8]=u.z; m[12]=-eVec.dotProduct(u); m[1]=v.x; m[5]=v.y; m[9]=v.z; m[13]=-eVec.dotProduct(v); m[2]=n.x; m[6]=n.y; m[10]=n.z; m[14]=-eVec.dotProduct(n); m[3]=0; m[7]=0; m[11]=0; m[15]=1.0; glMatrixMode(GL_MODELVIEW); glLoadMatrixf(m); } void set (Point3 newEye, Point3 newLook, Vector3 newUp) { eye.set(newEye); n.set(eye.x-newLook.x, eye.y-newLook.y, eye.z-newLook.z); u.set(newUp.crossProduct(n)); n.normalize(); u.normalize(); v.set(n.crossProduct(u)); setModelviewMatrix(); } void setShape (float vAng, float asp, float nearD, float farD) { viewAngle = vAng; aspect = asp; nearDist = nearD; farDist = farD; glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(viewAngle, aspect, nearDist, farDist); },c++,opengl,camera,C++,Opengl,Camera,因此,我用我的新相机设置(如下所示)替换了正常工作的标准相机设置(见下文),对其进行了测试。在我看来,新的设置与旧的设置完全相同。但是,结果还是不同的:在新的设置中,我唯一能看到的是一个空白的白色屏幕,而不是以前显示的对象。为什么呢 旧摄像机设置(工作): 新设置(不工作): 您已经忘记了OpenGL使用列主矩阵。假设这些是基向量,则它们应分别跨越一列而不是一行。这是OpenGL存储在内存中时用于矩阵的布局: 这应该可以解决您的问题(转换3x3矩阵): 如果矩阵类执行所有计算,则可以自由使用任

因此,我用我的新相机设置(如下所示)替换了正常工作的标准相机设置(见下文),对其进行了测试。在我看来,新的设置与旧的设置完全相同。但是,结果还是不同的:在新的设置中,我唯一能看到的是一个空白的白色屏幕,而不是以前显示的对象。为什么呢

旧摄像机设置(工作):

新设置(不工作):


您已经忘记了OpenGL使用列主矩阵。假设这些是基向量,则它们应分别跨越一列而不是一行。这是OpenGL存储在内存中时用于矩阵的布局:

这应该可以解决您的问题(转换3x3矩阵):
如果矩阵类执行所有计算,则可以自由使用任何内存布局,但当您将矩阵传递给OpenGL时,它需要特定的布局。即使您正在使用着色器,OpenGL也希望默认情况下矩阵统一为列主矩阵。

您忘记了OpenGL使用列主矩阵。假设这些是基向量,则它们应分别跨越一列而不是一行。这是OpenGL存储在内存中时用于矩阵的布局:

这应该可以解决您的问题(转换3x3矩阵):
如果矩阵类执行所有计算,则可以自由使用任何内存布局,但当您将矩阵传递给OpenGL时,它需要特定的布局。即使您正在使用着色器,OpenGL也希望默认情况下矩阵统一为列主矩阵。

您忘记了OpenGL使用列主矩阵。假设这些是基向量,则它们应分别跨越一列而不是一行。这是OpenGL存储在内存中时用于矩阵的布局:

这应该可以解决您的问题(转换3x3矩阵):
如果矩阵类执行所有计算,则可以自由使用任何内存布局,但当您将矩阵传递给OpenGL时,它需要特定的布局。即使您正在使用着色器,OpenGL也希望默认情况下矩阵统一为列主矩阵。

您忘记了OpenGL使用列主矩阵。假设这些是基向量,则它们应分别跨越一列而不是一行。这是OpenGL存储在内存中时用于矩阵的布局:

这应该可以解决您的问题(转换3x3矩阵):
如果矩阵类执行所有计算,则可以自由使用任何内存布局,但当您将矩阵传递给OpenGL时,它需要特定的布局。即使您使用的是着色器,OpenGL也希望默认情况下矩阵一致性是列主要的。

对不起,问题与这些方法的实现无关。这实际上是VisualStudio的一个问题。当我从C切换到C++时,我没有改变设置,问题是由这个引起的。我试着用C语言实现摄像头功能,效果很好。
不过,感谢您的帮助。

对不起,问题与这些方法的实现无关。这实际上是VisualStudio的一个问题。当我从C切换到C++时,我没有改变设置,问题是由这个引起的。我试着用C语言实现摄像头功能,效果很好。
不过,感谢您的帮助。

对不起,问题与这些方法的实现无关。这实际上是VisualStudio的一个问题。当我从C切换到C++时,我没有改变设置,问题是由这个引起的。我试着用C语言实现摄像头功能,效果很好。
不过,感谢您的帮助。

对不起,问题与这些方法的实现无关。这实际上是VisualStudio的一个问题。当我从C切换到C++时,我没有改变设置,问题是由这个引起的。我试着用C语言实现摄像头功能,效果很好。
不过,感谢您的帮助。

u,v,n表示摄像机坐标系的轴。不幸的是,你的建议并不能解决问题。我仍然有一个空白屏幕。@CGFoX:嗯,我非常怀疑您是否想使用这些向量的点积作为modelview矩阵的转换组件。我不知道你想在那里实现什么,我建议按照惯例将眼点放在第四栏;查看更新后的答案。@CGFoX:我也不会在您尝试测试
LookAt(…)
的实现时,从正交投影切换到透视投影。一次只能对一件事情进行重大更改,否则调试错误的事情的频率会更高。u、v、n表示摄像机坐标系的轴。不幸的是,你的建议并不能解决问题。我仍然有一个空白屏幕。@CGFoX:嗯,我非常怀疑您是否想使用这些向量的点积作为modelview矩阵的转换组件。我不知道你想在那里实现什么,我建议按照惯例将眼点放在第四栏;查看更新后的答案。@CGFoX:我也不会在您尝试测试
LookAt(…)
的实现时,从正交投影切换到透视投影。一次只能对一件事情进行重大更改,否则调试错误的事情的频率会更高。u、v、n表示摄像机坐标系的轴。和unf
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-64/48.0, 64/48.0, -1.0, 1.0, 0.1, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(2.3, 1.3, 2, 0, 0.25, 0, 0, 1, 0);
Point3 eye = Point3(2.3, 1.3, 2);
Point3 look = Point3(0, 0.25, 0);
Vector3 up = Vector3(0, 1, 0);
cam.setShape(30.0f, 64.0f/48.0f, 0.1f, 100.0f);
cam.set(eye, look, up);
void setModelviewMatrix () {
        GLfloat m[16];
        m[0]=u.x;   m[4]=v.x;   m[ 8]=n.x;  m[12]=eye.x;
        m[1]=u.y;   m[5]=v.y;   m[ 9]=n.y;  m[13]=eye.y;
        m[2]=u.z;   m[6]=v.z;   m[10]=n.z;  m[14]=eye.z;
        m[3]=0.0f;  m[7]=0.0f;  m[11]=0.0f; m[15]=1.0f;
        glMatrixMode(GL_MODELVIEW);
        glLoadMatrixf(m);
}