2013-03-29 31 views
2

我正在写一个体积渲染程序,它不断地调整一些平面几何体,所以它总是面向相机。每当相机旋转时,平面几何图形就会旋转,以便看起来好像它不移动 - 相对于场景中的其他所有内容。 (我用的照相机的视线方向作为法线矢量到这些平面的几何形状。)如何从OpenGL ModelView Matrix获取视图方向?

目前我手动存储一个自定义的旋转矢量(“转”)和施加其影响如在渲染功能如下:

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但我仍然不明白如何拿出视图方向。有人可以向我解释,如果它是可能的,它是如何工作的?

回答

1

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

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

+0

我明白了。我同意你的看法,我应该控制模型视图矩阵。不幸的是,我必须将音量添加到处理相机的预先存在的场景图中。我看到左上角的3x3是旋转矩阵。我不明白'z向量'是什么意思,这是我在找什么? – AAB

+0

....我想我只是通过旋转矩阵来旋转原始方向,但我无法确定原始方向是什么。它以某种方式存储在矩阵中? – AAB

+0

那么,OpenGL不是一个场景图,所以模型视图矩阵包含整个转换链。试图从OpenGL中哄骗有用的信息是这种方式有点不可靠。但是,给定一个模型视图矩阵,前三列是视图空间中模型坐标系的基向量。即第一列是本地X(右),第二列是本地Y(上),第三列是本地Z(入)。 – datenwolf