2011-05-25 3 views
3

Я создал класс камеры. Можно поворачивать на 360 градусов с помощью мыши и перемещаться вверх и вниз. Как я и предполагал, так же, как во всех играх. Также возможно двигаться вперед и назад, как и во всех играх. Но я не знаю, как реализовать перемещение влево и вправо.Реализация strafe - Opengl - Камера

я сделать следующее:

Это вызывается каждый кадр:

gluLookAt(_posX , _posY , _posZ, 
      _viewX, _viewY, _viewZ, 
      _upX, _upY, _upZ); 

Мой ход функция
Doesnt Работа:

void Camera::moveLeft() 
{ 

    float rot= (_viewY/180 * PI); 
    _moveX -= float(cos(rot)) * 0.5; 
    _moveZ -= float(sin(rot)) * 0.5; 
} 

делает работу
двигаться вперед в сцене :

void Camera::moveForward() 
{ 

    float viewX = _viewX - _posX; 
    float viewY = _viewY - _posY; 
    float viewZ = _viewZ - _posZ; 

    _posX += viewX * speed 
    _posY += viewY * speed; 
    _posZ += viewZ * speed; 

    _viewX += viewX * speed; 
    _viewY += viewY * speed; 
    _viewZ += viewZ * speed; 

} 

Когда я двигаюсь только с помощью мыши, проблем нет. Но если я использую эту функцию и вращаюсь с помощью мыши, я получаю некоторые странные движения камеры.

Любые идеи о том, как это решить?

Спасибо

@edit

Так что я удалил заявление glTranslated и я изменил свою функцию moveLeft на следующее:

void Camera::moveLeft(){

float x = ((_viewY * _upZ) - (_viewZ * _upY)); 
float y = ((_viewZ * _upX) - (_viewX * _upZ)); 
float z = ((_viewX * _upY) - (_viewY * _upX)); 

float magnitude = sqrt((x * x) + (y * y) + (z * z)); 

x /= magnitude; 
y /= magnitude; 
z /= magnitude; 

_posX -= x; 
_posY -= y; 
_posZ -= z; 

}

Я явно делаю что-то неправильно, потому что движения влево и вправо «лучше», но все же не то, что вы ожидаете.

ответ

5

Чтобы получить вектор, который указывает на 90 градусов на плоскость, которая содержит ваши векторы вверх и просмотра, вам необходимо сделать кросс-продукт: http://en.wikipedia.org/wiki/Cross_product. Любая хорошая библиотека векторных математик будет иметь функцию для этого.

Результирующий вектор будет либо левым вектором, либо правым вектором (попробуйте его и узнайте), а затем добавьте его в соответствующее положение.

Обратите внимание, что это не будет работать, если ваш вектор просмотра находится точно в том же направлении, что и ваш вектор вверх.

Edit: Основываясь на отредактированном вопрос, я думаю, что вам нужно сделать, это:

Вы должны получить направление вектора вид и использовать его вместо вашего вектора вид в поперечном продукте, а затем добавить к и вектор положения и вида:

void Camera::moveLeft() 
{ 

    float viewX = _viewX - _posX; 
    float viewY = _viewY - _posY; 
    float viewZ = _viewZ - _posZ; 

    float x = ((viewY * _upZ) - (viewZ * _upY)); 
    float y = ((viewZ * _upX) - (viewX * _upZ)); 
    float z = ((viewX * _upY) - (viewY * _upX)); 

    float magnitude = sqrt((x * x) + (y * y) + (z * z)); 

    x /= magnitude; 
    y /= magnitude; 
    z /= magnitude; 

    _posX -= x; 
    _posY -= y; 
    _posZ -= z; 

    _viewX -= x; 
    _viewY -= y; 
    _viewZ -= z; 
} 
+0

Не могли бы вы снова прочитать мой вопрос, если у вас есть время, я его отредактировал. Спасибо – fibera

+0

@ user748790: Выполнено. –

+0

Должно быть _viewX - = x, ...- = y, ...- = z. Вероятно, это опечатка. Но это работает, спасибо вам большое за вашу помощь. – fibera

Смежные вопросы