如何从OpenGL ModelView Matrix获取视图方向?

时间:2013-03-29 04:18:04

标签: math opengl rotation volume-rendering

我正在编写一个体积渲染程序,可以不断调整某些平面几何体,使其始终面向相机。每当相机旋转时,平面几何体就会旋转,以使其看起来好像不会移动 - 相对于场景中的其他所有内容。 (我使用相机的观察方向作为这些平面几何的法线向量。)

目前我手动存储自定义旋转矢量('旋转')并在渲染函数中应用其影响如下:

gl2.glRotated(rotations.y, 1.0, 0.0, 0.0);
gl2.glRotated(rotations.x, 0.0, 1.0, 0.0);

然后,我通过旋转x和y轴周围的初始视图方向(0,0,-1)来获得观察方向。这是以下面的方式完成的。最终的查看方向存储在“视图”中:

     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 个答案:

答案 0 :(得分:12)

您需要查看此图片@ http://db-in.com/images/local_vectors.jpg http://db-in.com/images/local_vectors.jpg

飞行方向(DOF)是第3行。

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

float DOF[3];
DOF[0] = matrix[  2 ]; // x
DOF[1] = matrix[  6 ]; // y
DOF[2] = matrix[ 10 ]; // z

参考:

答案 1 :(得分:1)

您可以根据需要调整模型视图矩阵,而不是尝试按照模型视图矩阵来调整体积光栅化器的碎片冒名顶替者。 OpenGL不是一个场景图,它是一个绘图系统,你可以,并且应该改变它们最适合你的东西。

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