4

在 Ogre3d 中,我想设置方向,为相机视图提供一个“法线”向量(作为指向我眼睛前方的箭头)和一个旋转相机的角度(比如倾斜我的头)。我可以用这个技巧让它工作:

float angle = 10; /* tilt my head 10 degrees to right */
Vector3 vector(0, 0, 1); /* z axis pointing forward */
Vector3 target = camera->getPosition() + vector;
camera->lookAt(target);
camera->roll(Degree(angle));

我不确定这是否适用于每个价值,而且看起来很老套。我正在寻找更正确的东西,比如使用四元数和Ogre::Camera::setOrientation().

此示例不起作用:

Quaternion orientation(Degree(angle), vector);
camera->setOrientation(orientation);

因为相机旋转anglevector

4

2 回答 2

3

您可以轻松地将矢量和角度转换为代表旋转的四元数。这是众所周知的轴角四元数。我不知道您使用的是哪个 Quaternion 类(Ogre 中可能有一个)。但是,让我给你我写的四元数类的示例代码:

    Quaternion Quaternion::CreateFromAxisAngle(Vector3 axis, float angle) {
    float half = angle * 0.5f;
    float s = sin(half);

    Quaternion result;
    result.x = axis.x * s;
    result.y = axis.y * s;
    result.z = axis.z * s;
    result.w = cos(half);
    return result;
}
于 2012-12-20T17:26:11.357 回答
0

正如刚刚提到的,这不是如何从旋转矢量和相关角度创建四元数 - 这是相机如何使用四元数/旋转。如果您使用的是类似 fps 的相机,您需要使用 setFixedYawAxis() 函数让相机不围绕 y 轴或您希望它固定的任何轴旋转。然后我不确定你想用什么来实现:

Vector3 target = camera->getPosition() + vector;
camera->lookAt(target);

当您通过让相机指向另一个方向来修改相机的方向矢量时。只需在您的相机实例上使用 setFixedYawAxis(true) 即可完成。

于 2021-04-19T16:48:57.497 回答