quat的坐标系转换

来源:互联网 发布:爱卡汽车软件下载 编辑:程序博客网 时间:2024/05/19 09:12

oculus获取的pose数据包含坐标和四元数信息,但所处的坐标系和CryEngine坐标系不同


oculus坐标系 :+x向右,+y向上,+z向外(屏幕外)

cryengine坐标系:+x向右,+y向内(屏幕以内),+z向上

所以需要使用Oculus时,获取的相机位置和四元数都需要进行转换。

坐标转换比较好理解:将z轴和y轴对调再取反即可

Vec3 Device::HmdVec3ToWorldVec3(const Vec3 &vec)
{

// 将oculus的y替换到CryEngine的z,将oculus的z取反,替换CryEngine的y
return Vec3(vec.x, -vec.z, vec.y); 
}

// 以下代码来自CryEnginev5

// -------------------------------------------------------------------------

// 四元数转换,需要考虑两方面:

其一,数值和变换的坐标轴对应;

其二,变换的坐标轴正确。

比较费解的就是为什么要旋转坐标系,个人理解为:

第一步将数值对调,只保证了各个分量所在的x、y、z轴的分量值正确,但oculus和CryEngine原来各自坐标系统下的轴不一致,

经过第一步操作后,作用到模型上后,只是将模型旋转的角度正确了,但默认的相机朝向却不同,需要将oculus的相机朝向和

CryEngine的相机朝向统一为相同方向。


Quat Device::HmdQuatToWorldQuat(const Quat &quat)
{
Matrix33 m33(quat);
Vec3     column1 = -quat.GetColumn2(); // 取出四元数的z变换分量,
m33.SetColumn2(m33.GetColumn1()); // 取出四元数的y变换分量,作为CryEngine的z分量
m33.SetColumn1(column1);// 将oculus取反后的z分量,作为CryEngine的y分量
return Quat::CreateRotationX(gf_PI * 0.5f) * Quat(m33); // 将坐标系从oculus坐标系变换到CryEngine坐标系,以便使其相机朝向一致。
}



0 0
原创粉丝点击