实施策略-Opengl-相机

| 我创建了一个相机课程。可以使用鼠标旋转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;
} 我显然做错了,因为向左和向右的运动“更好”,但仍然不是您期望的。     
已邀请:
要获得指向与包含您的向上和查看矢量的平面成90度角的矢量,您需要进行叉积: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;
}
    

要回复问题请先登录注册