2011-07-16 38 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

侧向移动你只需要翻译沿相机的矢量眼睛的位置。

要找到正确的矢量,请记住两个矢量的叉积给出垂直矢量。所以,你的向前矢量和向上矢量的叉积将会给出正确的矢量。

你的向前矢量是v [3],但为了清晰起见,我将在这里使用'forward'。

// 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]; 

你还应该注意的是,谷氨酸库不提供OpenGL ES的,所以你将不得不重新实现LOOKAT功能,这很简单,但也是另一个问题。

+0

你有任何代码示例吗?将是一个拯救生命的人! – Burf2000

+0

了解交叉产品是三维数学的重要组成部分。如果你知道它,它应该是非常直接的实施它。 –

+0

可悲的是,我还没有,任何好的参考?如果这个作品,我会很高兴:) – Burf2000