2011-07-16 7 views
2

私はOpenGLで3D環境を作成して、前後に動かしたり(左/右を上下に)移動することができます。右に左に歩いてください。iPhone:3D空間で移動する(gluLookAtを使用して横に踏み込む)

私はgluLookAtを使用していますし、私の前進のコードは

GLfloat v[] = {[self centerAtIndex:0] - [self eyeAtIndex:0],[self centerAtIndex:1] - [self eyeAtIndex:1], [self centerAtIndex:2] - [self eyeAtIndex:2]}; 

[self setEye:[self eyeAtIndex:0] + v[0] * SPEED_MOVE atIndex:0]; 
[self setEye:[self eyeAtIndex:2] + v[2] * SPEED_MOVE atIndex:2]; 
[self setCenter: [self centerAtIndex:0] + v[0] * SPEED_MOVE atIndex:0]; 
[self setCenter: [self centerAtIndex:2] + v[2] * SPEED_MOVE atIndex:2]; 

gluLookAt(eye[0], eye[1], eye[2],center[0], center[1], center[2], 0.0, 1, 0.0); 

誰でもありだとサイドステップやは例を見てどのように任意のアイデア?

ソリューション

float up[3] = {0, 1, 0}; 
     float forward[3] = { center[0] - eye[0],center[1] - eye[1],center[2] - eye[2] }; 

     float left[3]; 
     left[0] = forward[1] * up[2] - forward[2] * up[1]; 
     left[1] = forward[2] * up[0] - forward[0] * up[2]; 
     left[2] = forward[0] * up[1] - forward[1] * up[0]; 

     // now translate your eye position 
     [self setEye:[self eyeAtIndex:0] - left[0] * SPEED_MOVE atIndex:0]; 
     [self setEye:[self eyeAtIndex:2] - left[2] * SPEED_MOVE atIndex:2]; 
     [self setCenter: [self centerAtIndex:0] - left[0] * SPEED_MOVE atIndex:0]; 
     [self setCenter: [self centerAtIndex:2] - left[2] * SPEED_MOVE atIndex:2]; 


     if (([self eyeAtIndex:2] >= MapSizeZ || [self eyeAtIndex:0] >= MapSizeX || [self eyeAtIndex:2] <= 1 || [self eyeAtIndex:0] <= 1) || [self checkCollisionWithPoint:CGPointMake([self eyeAtIndex:0] ,[self eyeAtIndex:2])]){ 

      [self setEye:[self eyeAtIndex:0] + left[0] * SPEED_MOVE atIndex:0]; 
      [self setEye:[self eyeAtIndex:2] + left[2] * SPEED_MOVE atIndex:2]; 
      [self setCenter: [self centerAtIndex:0] + left[0] * SPEED_MOVE atIndex:0]; 
      [self setCenter: [self centerAtIndex:2] + left[2] * SPEED_MOVE atIndex:2]; 
     } 
+0

私はv [2]でv [0]を切り替えることがわかりました。 – Burf2000

+0

これはうまくいきませんでした。 – Burf2000

答えて

1

は、あなたは、単にカメラのベクトルに沿った目の位置を変換する必要が横に移動します。

右のベクトルを見つけるには、2つのベクトルの外積が垂直ベクトルを与えることに注意してください。したがって、あなたの前方ベクトルとあなたのアップベクトルの積は、正しいベクトルを与えます。

あなたのフォワードベクトルはv [3]ですが、わかりやすくするためにここでは「フォワード」を使用します。

// find the Right vector. (forward cross product up) 
float right[3]; 
right[0] = forward[1] * up[2] - forward[2] * up[1]; 
right[1] = forward[2] * up[0] - forward[0] * up[2]; 
right[2] = forward[0] * up[1] - forward[1] * up[0]; 

// now translate your eye position 
[self setEye:[self eyeAtIndex:0] + right[0] * SPEED_MOVE atIndex:0]; 
[self setEye:[self eyeAtIndex:2] + right[2] * SPEED_MOVE atIndex:2]; 

また、GLUライブラリは、OpenGL ESのために利用できないことに注意しなければならないので、あなたは簡単である、ルックアット機能を再実装する必要がありますが、また別の問題。

+0

コード例はありますか?人生の節約になりますか? – Burf2000

+0

クロス積を理解することは、3D数学の重要な部分です。あなたがそれを知っているなら、それを実装するのは非常に簡単です。 –

+0

悲しいことに、私はまだ、いい言葉はありませんか?これがうまくいくと私はとても幸せになれます:) – Burf2000

関連する問題