OpenGL: glLookAt: Sidestepping - PullRequest
       0

OpenGL: glLookAt: Sidestepping

0 голосов
/ 20 июля 2011

В моей игре вы можете двигаться вперед и назад, но я не знаю, как сделать шаг влево или вправо

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

//forward
[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);

Может ли кто-нибудь дать мне действительный код , чтобы заставить камеру двигаться вбок. Я попытался переключить v [2] и v [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 Ответ

3 голосов
/ 20 июля 2011

Вы можете получить вектор, указывающий вбок, вычислив перекрестное произведение вектора вверх (здесь [0 1 0]) и вектора «взгляда» (здесь center - eye).Из этого вы получите вектор, указывающий на правую или левую сторону в зависимости от порядка.Затем просто добавьте / вычтите этот вектор в текущую позицию камеры (глаз, центр), чтобы перейти к следующему шагу.

Кодировать его самостоятельно должно быть довольно просто, кросс-произведение - простая формула.И в Интернете доступно множество полностью реализованных классов камер.

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