iPhone: перемещение в 3D-пространстве (шаг в сторону с помощью gluLookAt) - PullRequest
2 голосов
/ 16 июля 2011

Я написал 3D-среду в OpenGL, где вы можете перемещаться вперед / назад и оглядываться (вверх / вниз, влево / вправо). Однако я не могу понять, как вы можете сделать шаг влево вправо.

Я использую 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];  
        }

1 Ответ

1 голос
/ 18 июля 2011

Для перемещения вбок вы просто должны перевести положение глаза вдоль вправо вектора камеры.

Чтобы найти правильный вектор, помните, что перекрестное произведение двух векторов дает перпендикулярный вектор. Таким образом, перекрестное произведение вашего вектора вперед и вектора роста даст правильный вектор.

Ваш передний вектор 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, поэтому вам придется переопределить функцию lookat, что довольно просто, но это также другой вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...