gpt4 book ai didi

math - 来自两个向量的旋转/方向

转载 作者:行者123 更新时间:2023-12-04 05:16:05 28 4
gpt4 key购买 nike

我正在处理一个小型 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));

这是错误的... :-(

有什么线索吗?

最佳答案

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

可以在 Graphics Gems IV 中找到关于如何进行这种通用转换的一个很好的通用示例,您可以找到 C sources here .或者改编 python 源和其他好东西 here .

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

关于math - 来自两个向量的旋转/方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14245010/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com