Я пишу программу объемного рендеринга, которая постоянно корректирует геометрию некоторой плоскости, чтобы она всегда была обращена в камеру. Геометрия плоскости вращается всякий раз, когда камера поворачивается, чтобы выглядеть так, как будто она не движется - относительно всего остального в сцене. (Я использую направление обзора камеры как вектор нормали к этой геометрии плоскости.)
В настоящее время я вручную сохраняю пользовательский вектор вращения ('вращения') и применяю его эффекты следующим образом в функции рендеринга:
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, но до сих пор не понимаю, как придумайте направление взгляда. Может кто-нибудь объяснить мне, возможно ли это и как это работает?