在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);
因为相机在angle
上按vector
旋转。
答案 0 :(得分:3)
您可以轻松地将矢量和角度转换为表示旋转的四元数。这是众所周知的轴角四元数。我不知道你正在使用哪个Quaternion类(可能在Ogre中有一个)。但是,让我给你一个我写的Quaternion类的示例代码:
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;
}
答案 1 :(得分:0)
正如刚刚提到的,这不是从旋转向量和相关角度创建四元数的方式——而是相机如何使用四元数/旋转。如果您使用 fps 之类的相机,则需要使用 setFixedYawAxis() 函数让相机不围绕 y 轴或您希望固定的任何轴旋转。 那么我不确定你想用什么来实现:
Vector3 target = camera->getPosition() + vector;
camera->lookAt(target);
当您通过让它指向不同的方向向量来修改相机的方向向量时。 只需在您的相机实例上使用 setFixedYawAxis(true) 即可完成。