我想在OpenGL中构建适当的相机转换,我有一个问题。
我构建了一个没有OpenGL的简单3D引擎,只是为了看看将世界简单投影到屏幕上是多么困难。
在这个引擎中,我把wiewer放在(0,0,0)上,眼睛瞄准了 (1,0,0)。 ASDW进行对象的翻译。 鼠标旋转 大约(1,0,0),(0,1,0),(0,0,1)。
我通过编程自己的3D引擎学到了很多东西。凭借这些知识,我开始构建一个基于OpenGL的合适的3D引擎。
对于OpenGL中的相机转换,我制作了这段代码......
相机的轴定义向上,向右,向前平移的位置。 围绕全局轴旋转(我想围绕摄像机轴旋转对象):(
glRotatef(camera_rot[0],1,0,0)
glRotatef(camera_rot[1],0,1,0)
glRotatef(camera_rot[2],0,0,1)
camera_rot[0]=0
camera_rot[1]=0
camera_rot[2]=0
glGetFloatv(GL_MODELVIEW_MATRIX, matrix)
glTranslatef(
matrix[0]*camera_tra[0],
matrix[4]*camera_tra[0],
matrix[8]*camera_tra[0])
glTranslatef(
matrix[1]*camera_tra[1],
matrix[5]*camera_tra[1],
matrix[9]*camera_tra[1])
glTranslatef(
matrix[2]*camera_tra[2],
matrix[6]*camera_tra[2],
matrix[10]*camera_tra[2])
camera_tra[0]=0
camera_tra[1]=0
camera_tra[2]=0
有点令人困惑的是,为什么OpenGL设计师没有将相机放入(0,0,0)并在对象上进行平移和旋转而不是相机。
我正在考虑使用glTranslate或glRotation手动进行转换,并将转换逻辑从我的3D引擎(我所做的)转换为更改glVertexe cordinates。 所以每次在绘制函数中我都会改变glVertexes的坐标。但是,如果我这样做,顶点将在我使用相同矩阵(ModelView矩阵)进行转换后相乘,并且我不想在程序中进行无意义的计算。
那么我应该怎么做才能解决这个问题呢? 如何围绕相机轴旋转做出最佳解决方案?
答案 0 :(得分:2)
YEEEEEES我为本地相机轴做了YAW,ROLL,PITCH旋转和平移:D
Down是我负责转换的代码的一部分。
这是我的全局常量:
float camera_drot[3]={0,0,0};
float camera_dtra[3]={0,0,0};
float camera_place[3]={0,0,10};
float camera_right[3]={1,0,0};
float camera_up[3]={0,1,0};
float camera_forvard[3]={0,0,-1};
在绘制物体之前:
if(camera_drot[0]!=0){ //ROTATE CAMERA_UP AND CAMERA_FORVARD AROUND CAMERA_RIGHT
MYRotation(camera_right,camera_up,camera_drot[0]);
MYRotation(camera_right,camera_forvard,camera_drot[0]);
camera_drot[0]=0;}
if(camera_drot[1]!=0){ //ROTATE CAMERA_RIGHT AND CAMERA_FORVARD AROUND CAMERA_UP
MYRotation(camera_up,camera_right,camera_drot[1]);
MYRotation(camera_up,camera_forvard,camera_drot[1]);
camera_drot[1]=0;}
if(camera_drot[2]!=0){ //ROTATE CAMERA_RIGHT AND CAMERA_UP AROUND CAMERA_FORWARD
MYRotation(camera_forvard,camera_right,camera_drot[2]);
MYRotation(camera_forvard,camera_up,camera_drot[2]);
camera_drot[2]=0;}
if(camera_dtra[0]!=0){MYTranslation(camera_right,camera_dtra[0]);camera_dtra[0]=0;}
if(camera_dtra[1]!=0){MYTranslation(camera_up,camera_dtra[1]);camera_dtra[1]=0;}
if(camera_dtra[2]!=0){MYTranslation(camera_forvard,camera_dtra[2]);camera_dtra[2]=0;}
glLoadIdentity();
gluLookAt(
camera_place[0],camera_place[1],camera_place[2],
camera_place[0]+camera_forvard[0],camera_place[1]+camera_forvard[1],camera_place[2]+camera_forvard[2],
camera_up[0],camera_up[1],camera_up[2]);
}
这是我的功能MYRotation和MYTranslation:)
static void MYRotation(float vector[3],float point[3],float fi){
//ROTATE POINT AROUND VECTOR
float i = point[0];
float j = point[1];
float k = point[2];
float x = vector[0];
float y = vector[1];
float z = vector[2];
point[0] = i*(x*x + (y*y + z*z)*cos(fi)) + k*(-x*z*(-1 + cos(fi)) + y*sin(fi)) + j*(-x*y*(-1 + cos(fi)) - z*sin(fi));
point[1] = j*(y*y + (x*x + z*z)*cos(fi)) + k*(-y*z*(-1 + cos(fi)) - x*sin(fi)) + i*(-x*y*(-1 + cos(fi)) + z*sin(fi));
point[2] = k*(z*z + (x*x + y*y)*cos(fi)) + j*(-y*z*(-1 + cos(fi)) + x*sin(fi)) + i*(- x*z*(-1 + cos(fi)) - y*sin(fi));
float normalize = pow(pow(point[0],2)+pow(point[1],2)+pow(point[2],2),-0.5);
point[0]=point[0]*normalize;
point[1]=point[1]*normalize;
point[2]=point[2]*normalize;
}
static void MYTranslation(float camera_axe[3],float camera_dtra){
camera_place[0]+=camera_axe[0]*camera_dtra;
camera_place[1]+=camera_axe[1]*camera_dtra;
camera_place[2]+=camera_axe[2]*camera_dtra;}
答案 1 :(得分:1)
哦,我忘了在MYRotation中进行规范化之前进行矢量核心处理。在程序中,计算错误不会给出正交向量。这是纠正的关键!
我将在完成后发布代码:)