Gmod表达式中的空间旋转2

时间:2009-07-30 23:51:50

标签: rotation quaternions

我正在使用expression2来编写Garry的mod(http://wiki.garrysmod.com/?title=Wire_Expression2

中的行为

好的,设置先例。在Gmod我有一个块,我完全失去了如何让它围绕3个向上,向下和向右的向量旋转(这是本地的。即;如果我将它向前倾斜45度,向前向量是0.707,0.707, 0)。从本质上讲,从3个向量我希望能够得到本地Pitch / Roll / Yaw。通过局部俯仰滚动偏航我的意思是它们完全相互独立,允许真正的三维旋转。所以例如;如果我放置我的工艺使它的鼻子与地板平行,那么X,Y,Z将是0,0,0。如果我把它平行于地板(世界和局部偏航)90度它现在是0,0,90。如果我然后它(世界滚动,局部音高)它180度它现在是180,0,90。我已经已经探索过四元数然而我不相信我应该在这里发布我的代码,因为我认为我正在重新发明轮子。

我知道我没有解释得那么好,但我相信这个问题非常普遍。任何人都可以提供任何帮助非常感谢。

哦,我也想避开gimblelock。

使用向上/向前/向右矢量基本计算每个工艺向上/向前/向右矢量周围的旋转。

简单地说,一个通用的实现而不是一个特定的Gmod的问题绝对没问题。

1 个答案:

答案 0 :(得分:0)

我不确定您期望实施的应用程序是什么,但是,在这种情况下,我通常建议应用角度力。在这方面,这是否足以满足您的需求?

如果这就是你需要的全部,那么我已经设法完善了角力方程,让实体指向给定的位置。

EntityVector =实体:massCenter()
杠杆= sqrt((实体:惯性():长度()^ 2)/ 3)
LookPos = EntityVector - 目标:pos()
A = ang(
 toDeg(atanr(LookPos:z(),sqrt(LookPos:x()^ 2 + LookPos:y()^ 2))),
 toDeg(atanr(-LookPos:y(), - FindPos:x())),
 0)
EntityAngle =((实体:角度() - angnorm(A))* 5 +实体:angVel())* 5
实体:applyAngForce(-EntityAngle * Leverage)

这套方程式帮助我完成了无数项目