2

OpenGL で適切なカメラ変換を構築したいのですが、質問があります。

OpenGL を使用せずに単純な 3D エンジンを作成しました。世界を単純に画面に投影することがいかに難しいかを確認するためです。

このエンジンでは、視力を (1,0,0) に設定して、wiwer を (0,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 座標の変更に適用することを考えています。したがって、描画関数で毎回 glVertexes 座標を変更します。しかし、それを行うと、変換後に同一の行列 (ModelView 行列) で頂点が乗算され、プログラムで無意味な計算をしたくありません。

では、この問題を解決するにはどうすればよいですか? カメラの軸を中心とした回転に最適なソリューションを作成するにはどうすればよいですか?

4

2 に答える 2

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;}
于 2013-09-12T15:18:03.820 に答える