2

我正在开发一个小型 Unity3D 项目,我需要从另一个工具导入一些数据。该工具通过两个向量为我提供了面向对象,我需要将其移植到 Unity。

例如,我有这两个向量;

x = Vector( 0.707, 0.707, 0)
y = Vector(-0.707, 0.707, 0)

只有这些信息,我需要了解我的对象需要在 Z 轴上旋转 45 度。这两个向量代表我的对象的上向量和右向量,不是起点也不是目的地。

编辑

好的,现在我可以进行单轴旋转了!是的!提供了这个功能;

function RotationMaster (vx : Vector3, vy : Vector3) {
    var vz = Vector3.Cross(vx, vy);

    var x = Mathf.Atan2(-vz.y, vz.z) * Mathf.Rad2Deg;
    var y = Mathf.Atan2( vx.z, vx.x) * Mathf.Rad2Deg;
    var z = Mathf.Atan2(-vx.y, vx.x) * Mathf.Rad2Deg;

    Debug.Log("x : " + x + "; y : " + y + "; z : " + z);

    transform.rotation = Quaternion.Euler(x,y,z);
}

我现在可以像这样传递简单的旋转:

RotationMaster(Vector3(1,0,0), Vector3(0,0.707,0.707));
RotationMaster(Vector3(1,0,0), Vector3(0,-1,0));

只要我不玩多轴,它就可以工作。但是,一旦我尝试更复杂的旋转,它就会失败……举个例子;

RotationMaster(Vector3(-0.5,-0.5,0.707), Vector3(-0.707,0.707,0));

这是错误的...... :-(

有什么线索吗?

4

2 回答 2

3

对完整矩阵取 x 和 y 之间的叉积并将其转换为空间 Euler 或 Tait-Bryan 旋转(转换需要第三轴准确)。这是一个相当容易理解的转换,如果您阅读转换例程,您会意识到它首先从平面解决方案开始,因此如果需要,您可以省略许多其他部分。

可以在 Graphics Gems IV 中找到如何进行这种通用转换的一个很好的通用示例,您可以在此处找到 C 源代码或者在这里改编 python 源代码和其他好东西。

附录:将矩阵直接转换为四元数由同一作者在 Graphics Gems II 中描述,可在此处找到。

于 2013-01-09T22:11:27.820 回答
0
Quaternion.SetLookRotation

是(有一些调整......)我正在寻找的!感谢大家的帮助!

于 2013-01-11T16:38:28.593 回答