Как я могу получить направление просмотра из 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 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 вид вектора.

Другие вопросы по тегам