2013-03-29 5 views
2

Я пишу программу рендеринга тома, которая постоянно корректирует некоторую геометрию плоскости, поэтому она всегда обращена к камере. Плоская геометрия вращается всякий раз, когда камера вращается, чтобы она выглядела так, как будто она не двигается - по отношению ко всему остальному на сцене. (Я использую направление обзора камеры в качестве вектора нормали к этим плоским геометриям.)Как я могу получить направление просмотра из Матрицы OpenGL ModelView?

В настоящее время я вручную хранить вектор пользовательского вращения («Повороты») и применяя его воздействие следующим образом в функции визуализации:

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 со значениями из вращения. Это делается следующим образом. Окончательное направление обзора сохраняется в меню «Вид»:

 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; 
} 

Теперь я двигаюсь эту программу более крупного проекта, в котором вращение камеры обрабатывается с помощью 3-сторонних графической библиотеки. У меня нет вектора вращения. Есть ли какой-нибудь способ, которым я могу получить вид вектор направления из:

GLfloat matrix[16]; 
glGetFloatv (GL_MODELVIEW_MATRIX, matrix); 

Я смотрю на это для справки http://3dengine.org/Modelview_matrix, но я до сих пор не понимаю, как придумать направление взгляда. Может ли кто-нибудь объяснить мне, если это возможно, и как это работает?

ответ

1

Вместо того, чтобы пытаться следовать матрице просмотра модели, чтобы отрегулировать обманщик фрагмента громкости, вы должны просто отрегулировать матрицу просмотра модели в соответствии с вашими потребностями. OpenGL не является графиком сцены, это система рисования, и вы можете, и должны менять вещи, но они подходят вам лучше всего.

Конечно, если вы должны вставить объемный растеризатор в более крупную сцену, может потребоваться извлечь определенную информацию из матрицы просмотра модели. Верхняя левая 3 × 3 подматрица содержит составное вращение моделей и просмотр. Третий столбец содержит вектор Z, повернутый по виду.

+0

я вижу. Я согласен с вами в том, что я должен просто контролировать матрицу модели. К сожалению, я должен добавить том к ранее существующему сценарию, который обрабатывает камеру. Я вижу, что верхний левый 3x3 является матрицей вращения. Я не понимаю, что вы подразумеваете под «rotated z vector», это то, что я ищу? – AAB

+0

.... Думаю, я просто повернул бы исходную ориентацию по вращению, матрице, но я не могу быть уверен, что такое оригинальная ориентация. Как-то хранится в матрице? – AAB

+0

Ну, OpenGL не является графиком сцены, поэтому матрица просмотра модели содержит всю цепочку преобразований. Пытаясь уговорить полезную информацию из OpenGL, этот способ немного ненадежный. Однако, учитывая определенную матрицу модели, первые 3 столбца являются базовыми векторами модели системы координат в пространстве взгляда. То есть 1-й столбец является локальным X (справа), второй столбец является локальным Y (вверх), а третий столбец является локальным Z (в). – datenwolf