2015-10-15 53 views
1

我在Unity3D中制作了一款玩家控制直升机的游戏。我正在通过对其刚体部件施加力来移动它。主力来自主旋翼,推直升机向上:如何抵消Unity3D中物理模拟的旋转?

rigidbody.AddRelativeForce(Vector3.up * mainRotorValue); 

有它水平移动我施加扭矩于俯仰/滚动直升机,使得从主转子上的力在一些其它的方向推压(在世界空间中):

float tailRotorValue = 0; 
rigidbody.AddRelativeTorque(new Vector3(pitchValue, tailRotorValue, rollValue)); 

当同时进行俯仰和滚转时,直升机也会偏航。我不知道为什么,我真的不希望它发生。我目前的猜测是,物理模拟中有一些东西在创建这个旋转,并且我可以计算一些tailRotorValue来抵消它。所以我希望这里有人知道为什么会发生这种旋转,以及我如何计算出相反的力量。或者,也许有一个完全不同的理由和解决方案(我想保持运动物理基础)?

谢谢!

编辑 -我不知道这个的相关性,但我的刚体具有质量1530,拖动0.1和angularDrag 1.5。

+0

你可能应该看看_quaternions_。 – MickyD

+0

你能否详细阐述一下我应该如何介入四元数​​?我并没有真正考虑到我发送的值实际上代表了什么,但Unity的[教程视频](https://www.youtube.com/watch?v=De0PoxaKlww)解释说Vector3定义了将施加扭矩的轴以及扭矩的大小。在我的情况下,我发送的x/z值为0到+/- 1600,导致最大〜30度的俯仰/滚动。 – Adrian

+0

如果你想让直升机直接旋转起来而不管滚转,你能否请求澄清一下? – Pluto

回答

0

欢迎来到StackOverflow Adrian!

我不知道这是否是你想要的解决方案,但如果你想限制rigidbody的旋转,可以扩大Constraints选项卡,并设置Freeze RotationY轴(我认为这是Y轴。对不起,如果我弄糊涂了,并告诉你错误的轴:D)旋转关闭。 (如果你根本不想旋转你的直升机,可以使用这种方法,但是记住,当你需要旋转时,你可以通过脚本关闭约束,旋转直升机并重新设置约束。)

我希望这有助于!

+0

感谢您的欢迎和建议的解决方案!我知道这个选项,但在这种情况下不起作用。首先,我希望玩家能够随意围绕Y轴旋转,因此完全禁用旋转一段时间将会破坏这种自由。其次,即使Y轴旋转被冻结,也会发生不必要的旋转! – Adrian

+0

@Adrian你的欢迎。祝你好运,让你的游戏! (顺便说一句,我经常会弄糊涂哪个轴是哪个轴,因为它们从软件到软件都不同。) –

0

好吧,伙计们,我发现了这个问题。我写了一些代码来帮助稳定直升机,我选择在我的帖子中省略,因为我以为我确定它不是原因。对不起,我没有足够的问题浪费你的时间,谢谢你的尝试!我学到的教训是确保隔离问题,并彻底测试你所隔离的部分。