Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 从两个矢量旋转/定向_Math_3d_Unity3d_Trigonometry - Fatal编程技术网

Math 从两个矢量旋转/定向

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 :

我正在做一个小的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旋转(转换需要第三个轴才能精确)。这是一个相当容易理解的转换,如果您阅读转换例程,您会意识到它首先从平面解决方案开始,因此如果需要,您可以省略许多其他部分

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

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


是(经过一些调整…)我想要的!感谢所有人的帮助!

你能让你的同事(或你的堆栈溢出的另一半:)删除她/他的问题以避免重复吗?如果这只是两个人在2小时内用相同的样本值问同一个问题的纯属巧合,那么对不起:)也许我误读了一些东西,但这不只是绕Z轴旋转矩阵的前两行吗。应该是一个简单的乘法。@Jerdak听起来是个好主意。但是Christian需要依赖于固定的z坐标。你是需要这个端口作为一次性开火遗忘解决方案还是永久导入?3D格式叫什么?有机会使用Blender,Maya。。。要将其转换为FBX或其他格式?为什么不使用?我认为这正是你想要达到的。
Quaternion.SetLookRotation