首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现strafe - Opengl - Camera

实现strafe - Opengl - Camera
EN

Stack Overflow用户
提问于 2011-05-25 22:43:01
回答 1查看 3K关注 0票数 4

我创建了一个camera类。我可以用鼠标旋转360度,上下移动。正如我所希望的,就像在所有的游戏中一样。也可以像在所有游戏中一样向前和向后移动。但我不知道如何实现向左和向右移动。

我执行以下操作:

每一帧都会调用这个函数:

代码语言:javascript
复制
gluLookAt(_posX , _posY , _posZ,
          _viewX, _viewY, _viewZ,
          _upX,   _upY,   _upZ );

我的move函数

不起作用:

代码语言:javascript
复制
void Camera::moveLeft() 
{

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

能行吗?

在场景中向前移动:

代码语言:javascript
复制
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(){

代码语言:javascript
复制
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;

}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-05-25 23:00:15

要获得指向包含上方向和视图向量的平面的90度向量,您需要做一个叉积:http://en.wikipedia.org/wiki/Cross_product。任何像样的向量数学库都会有一个这样的函数。

得到的向量要么是一个左向量,要么是一个右向量(尝试一下,找出是哪一个),然后根据需要将其添加到您的位置。

请注意,如果视图向量与上方向向量处于完全相同的方向,则此方法不起作用。

编辑:根据您编辑的问题,我认为您需要这样做:

您需要获取视图方向向量并使用它代替叉积中的视图向量,然后将其添加到位置和视图向量中:

代码语言:javascript
复制
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;
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6126274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档