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