我正在写一个体积渲染程序,它不断地调整一些平面几何体,所以它总是面向相机。每当相机旋转时,平面几何图形就会旋转,以便看起来好像它不移动 - 相对于场景中的其他所有内容。 (我用的照相机的视线方向作为法线矢量到这些平面的几何形状。)如何从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但我仍然不明白如何拿出视图方向。有人可以向我解释,如果它是可能的,它是如何工作的?
我明白了。我同意你的看法,我应该控制模型视图矩阵。不幸的是,我必须将音量添加到处理相机的预先存在的场景图中。我看到左上角的3x3是旋转矩阵。我不明白'z向量'是什么意思,这是我在找什么? – AAB
....我想我只是通过旋转矩阵来旋转原始方向,但我无法确定原始方向是什么。它以某种方式存储在矩阵中? – AAB
那么,OpenGL不是一个场景图,所以模型视图矩阵包含整个转换链。试图从OpenGL中哄骗有用的信息是这种方式有点不可靠。但是,给定一个模型视图矩阵,前三列是视图空间中模型坐标系的基向量。即第一列是本地X(右),第二列是本地Y(上),第三列是本地Z(入)。 – datenwolf