实现横移 - Opengl - 相机

4
我创建了一个相机类。可以通过鼠标旋转360度并上下移动。正如我所期望的,在所有游戏中都是如此。也可以像所有游戏一样前后移动。但我不知道如何实现左右移动。
我做了以下操作:
这将在每帧调用:
gluLookAt(_posX , _posY , _posZ,
          _viewX, _viewY, _viewZ,
          _upX,   _upY,   _upZ );

我的移动函数
无法工作:

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;

}

当我只用鼠标移动时,没有问题。但是如果我使用此功能并使用鼠标旋转,我会得到一些奇怪的相机运动。

有什么解决办法吗?

谢谢

@编辑

所以我删除了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;

我显然做错了什么,因为向左和向右的移动“更好”,但仍不符合预期。

1个回答

6
为了得到一个指向垂直于包含您的上方和视图向量的平面的向量,您需要进行叉积运算:http://en.wikipedia.org/wiki/Cross_product。任何优秀的向量数学库都会有此功能。
结果向量将是左向量或右向量(尝试一下并找出哪个),然后根据需要将其添加到您的位置。
请注意,如果您的视图向量与您的上向量完全相同,则此方法无效。
编辑:根据您编辑后的问题,我认为您需要执行以下操作:
您需要获取视图方向向量,并在叉积运算中使用它代替您的视图向量,然后将其添加到位置和视图向量中。
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;
}

如果您有时间,能否再读一遍我的问题,我已经进行了编辑。谢谢。 - fibera
应该是 _viewX -= x, ...-= y, ...-= z。可能是打错了。但这个可以用,非常感谢你的帮助。 - fibera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接