因为这是一个复杂的问题,通常会导致很多混乱(我之前已经问过这个问题的变化,但从未以正确的方式提出问题,也从未得到答案),我会去尽量使其尽可能清晰。
事实:
我想做的事情:
我试图在人形骨骼结构上播放动画,并使用扭矩(旋转力)将物理布娃娃推到与骨骼结构大致相同的姿势。
问题:
我可以在Quaternions中完全工作,直到我需要将扭矩施加到刚体上。 AddTorque
函数有效地在欧拉角中起作用,这意味着我不能使用四元数。我可以很容易地从四元数中提取欧拉角,但是它们不可靠并且会使布娃娃严重地陷入困境。
我需要什么:
我需要从前向,向上和向右矢量计算可靠的3D欧拉角(例如,从+到#"随机")。我意识到这有点复杂,但这就是我在这里问的原因:我缺乏自己解决这个问题的知识和经验。
鉴于矢量本身是可靠的,我认为没有理由不能从它们中找出可靠的欧拉角。另外,我不知道欧洲角度我想要或需要什么样的旋转顺序,但我相信以后会很容易修改。
非常感谢任何帮助!
答案 0 :(得分:3)
首先,我想说我完全解决了我的问题,因为@ Tobias的努力。非常感谢!这段时间我一直在从错误的一端接近问题。我假设我需要以特定的方式使用AddTorque
(使用Euler角度)并从那里开始工作,但是@Tobias(和稍后的@JarkkoL)指出我需要以不同的方式使用AddTorque
所以这就是我在UnityScript(有效的JavaScript)中所做的:
var quat0:Quaternion;
var quat1:Quaternion;
var quat10:Quaternion;
quat0=transform.rotation;
quat1=target.transform.rotation;
quat10=quat1*Quaternion.Inverse(quat0);
rigidbody.AddTorque(quat10.x,quat10.y,quat10.z,ForceMode.Force);
而且,出乎所有人的意料,这个工作!!它只是...工作!当然,刚体立方体需要很长时间才能稳定下来,但那是因为我需要一个PID控制器。或许quat10
需要规范化,不确定。我会解决这个问题:)
我不知道你实际上可以单独使用quat的那一部分。
答案 1 :(得分:1)
首先,我认为你会在Unity论坛中为Unity特定问题带来更好的运气(:那就是说,如果你正在使用的话,我认为你误解了AddTorque()接口:http://docs.unity3d.com/ScriptReference/Rigidbody.AddTorque.html < / p>
不是传递欧拉角,而是将矢量传递给旋转轴的函数。我不熟悉Unity,但我相信矢量的长度指定了要添加多少扭矩。欧拉角本质上是旋转的不良表示,所以你应该总是假设(除非另有说明)完全成熟的API在旋转时使用四元数,轴/角度对或矩阵。欧拉角更适合最终用户。