如何从OpenGL ModelView矩阵中获取视角方向?

3
我正在编写一个体积渲染程序,它不断调整一些平面几何图形,使其始终面向相机。每当相机旋转时,平面几何图形都会旋转,以便看起来它不会移动 - 相对于场景中的其他所有物体而言。(我使用相机的观察方向作为这些平面几何图形的法向量。)
目前,我手动存储一个自定义旋转向量('rotations'),并在渲染函数中应用其影响,如下所示:
gl2.glRotated(rotations.y, 1.0, 0.0, 0.0);
gl2.glRotated(rotations.x, 0.0, 1.0, 0.0);

然后,我通过将初始视角方向(0,0,-1)绕x轴和y轴旋转来获取查看方向,使用旋转值。这是通过以下方式完成的。最终查看方向存储在“view”中:

     public Vec3f getViewingAngle(){
        //first rotate the viewing POINT
        //then find the vector from there to the center
        Vec3f view=new Vec3f(0,0,-1);
        float newZ=0;
        float ratio=(float) (Math.PI/180);
        float vA=(float) (-1f*rotations.y*(ratio));
        float hA=(float) (-1f*rotations.x)*ratio;

        //rotate about the x axis first
        float newY=(float) (view.y*Math.cos(vA)-view.z*Math.sin(vA));
        newZ=(float) (view.y*Math.sin(vA)+view.z*Math.cos(vA));
        view=new Vec3f(view.x,newY,newZ);

        //rotate about Y axis
        float newX=(float) (view.z*Math.sin(hA)+view.x*Math.cos(hA));
        newZ=(float) (view.z*Math.cos(hA)-view.x*Math.sin(hA));
        view=new Vec3f(newX,view.y,newZ);
        view=new Vec3f(view.x*-1f,view.y*-1f,view.z*-1f);

        //return the finalized normal viewing direction
        view=Vec3f.normalized(view);
        return view;
}

现在我正在将这个程序移植到一个更大的项目中,其中相机旋转由第三方图形库处理。我没有旋转向量。有没有办法从以下内容获取我的视角方向向量:

GLfloat matrix[16]; 
glGetFloatv (GL_MODELVIEW_MATRIX, matrix);

我正在参考这个链接http://3dengine.org/Modelview_matrix,但我仍然不知道如何确定视角方向。请问有人能解释一下吗?如果可以的话,请告诉我具体的实现方式。

2个回答

13

1

不要试图遵循模型视图矩阵来调整音量光栅化器的片段冒充者,你应该根据自己的需求调整模型视图矩阵。OpenGL不是场景图,它是一个绘图系统,你可以并且应该根据自己的需要进行更改。

当然,如果你必须将音量光栅化嵌入到一个更大的场景中,可能需要从模型视图矩阵中提取某些信息。左上角的3×3子矩阵包含模型和视图的组合旋转。第三列包含视图旋转的Z向量。


我明白了。我同意你的观点,我应该只控制模型视图矩阵。不幸的是,我必须将音量添加到现有的场景图中,该场景图处理相机。我看到左上角的3x3矩阵是旋转矩阵。我不理解你所说的“旋转Z向量”,这就是我要找的吗? - AAB
我想我只需要通过旋转矩阵来旋转原始方向,但我不能确定原始方向是什么。它是否以某种方式存储在矩阵中? - AAB
OpenGL不是场景图,因此模型视图矩阵包含整个变换链。尝试从OpenGL中提取有用信息的方法有点不可靠。然而,给定某个模型视图矩阵,前3列是模型坐标系在视图空间中的基向量。即第1列是本地X(右),第2列是本地Y(上),第3列是本地Z(进)。 - datenwolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接