【问题标题】:Implementing strafe - Opengl - Camera实现扫射 - Opengl - 相机
【发布时间】:2011-05-25 14:43:00
【问题描述】:

我创建了一个相机类。可以用我的鼠标旋转 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;

}

我显然做错了什么,因为左右移动“更好”,但仍然不是你所期望的。

【问题讨论】:

    标签: opengl camera


    【解决方案1】:

    要获得一个与包含向上和视图矢量的平面成 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;
    }
    

    【讨论】:

    • 你能再看一下我的问题吗,如果你有时间,我已经编辑过了。谢谢
    • 必须是_viewX -= x, ...-= y, ...-= z。可能是一个错字。但这行得通,非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    相关资源
    最近更新 更多