Я пишу программу рендеринга тома, которая постоянно корректирует некоторую геометрию плоскости, поэтому она всегда обращена к камере. Плоская геометрия вращается всякий раз, когда камера вращается, чтобы она выглядела так, как будто она не двигается - по отношению ко всему остальному на сцене. (Я использую направление обзора камеры в качестве вектора нормали к этим плоским геометриям.)Как я могу получить направление просмотра из Матрицы 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, но я до сих пор не понимаю, как придумать направление взгляда. Может ли кто-нибудь объяснить мне, если это возможно, и как это работает?
я вижу. Я согласен с вами в том, что я должен просто контролировать матрицу модели. К сожалению, я должен добавить том к ранее существующему сценарию, который обрабатывает камеру. Я вижу, что верхний левый 3x3 является матрицей вращения. Я не понимаю, что вы подразумеваете под «rotated z vector», это то, что я ищу? – AAB
.... Думаю, я просто повернул бы исходную ориентацию по вращению, матрице, но я не могу быть уверен, что такое оригинальная ориентация. Как-то хранится в матрице? – AAB
Ну, OpenGL не является графиком сцены, поэтому матрица просмотра модели содержит всю цепочку преобразований. Пытаясь уговорить полезную информацию из OpenGL, этот способ немного ненадежный. Однако, учитывая определенную матрицу модели, первые 3 столбца являются базовыми векторами модели системы координат в пространстве взгляда. То есть 1-й столбец является локальным X (справа), второй столбец является локальным Y (вверх), а третий столбец является локальным Z (в). – datenwolf