Math 从两个矢量旋转/定向
我正在做一个小的Unity3D项目,我需要从另一个工具导入一些数据。该工具通过两个向量为我提供了对象方向,我需要将其移植到Unity 举个例子,我有这两个向量Math 从两个矢量旋转/定向,math,3d,unity3d,trigonometry,Math,3d,Unity3d,Trigonometry,我正在做一个小的Unity3D项目,我需要从另一个工具导入一些数据。该工具通过两个向量为我提供了对象方向,我需要将其移植到Unity 举个例子,我有这两个向量 x = Vector( 0.707, 0.707, 0) y = Vector(-0.707, 0.707, 0) 只有这些信息,我需要了解我的对象需要在Z轴上旋转45度。这两个向量表示对象的向上和向右向量,而不是起点或终点 编辑 好了,现在我可以做单轴旋转了!是 啊提供此功能 function RotationMaster (vx :
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旋转(转换需要第三个轴才能精确)。这是一个相当容易理解的转换,如果您阅读转换例程,您会意识到它首先从平面解决方案开始,因此如果需要,您可以省略许多其他部分 关于如何进行这种通用转换的一个很好的通用示例可以在Graphics Gems IV中找到,您可以找到。或改编的python源代码和其他好东西 附录:将矩阵直接转换为四元数的方法由同一作者在Graphics Gems II中描述,可以找到
是(经过一些调整…)我想要的!感谢所有人的帮助!你能让你的同事(或你的堆栈溢出的另一半:)删除她/他的问题以避免重复吗?如果这只是两个人在2小时内用相同的样本值问同一个问题的纯属巧合,那么对不起:)也许我误读了一些东西,但这不只是绕Z轴旋转矩阵的前两行吗。应该是一个简单的乘法。@Jerdak听起来是个好主意。但是Christian需要依赖于固定的z坐标。你是需要这个端口作为一次性开火遗忘解决方案还是永久导入?3D格式叫什么?有机会使用Blender,Maya。。。要将其转换为FBX或其他格式?为什么不使用?我认为这正是你想要达到的。
Quaternion.SetLookRotation