我正在开发一个游戏,我必须实现一些空间物理,如轨道和重力......
我的主要问题是我无法在一个行星(或另一个物体)周围正确地制作一个GameObject轨道,我试图用物理教科书中一个古老的着名公式来做到这一点:
v = sqrt(G *((m1 m2)/ r))
其中v是轨道运行物体的速度,G是常数,m1和m2是轨道物体和行星的质量,r是距m1和m2中心的距离 .
这是我的实现:
void circularOrbit(){
// Get the distance between the two object centers .
dist = new Vector2 (Planet.renderer.bounds.center.x - renderer.bounds.center.x, Planet.renderer.bounds.center.y - renderer.bounds.center.y);
r = dist.magnitude;
tdist = new Vector2 (dist.x, -dist.y).normalized; // 2D vector prependicular to the dist vector .
float force = Mathf.Sqrt (G * ((mBody + mPlanet) / r)); // Calculate the velocity .
rigidbody2D.velocity = tdist * force;
}
circularOrbit
函数在 FixedUpdate
中的每个帧中被调用,统一为物理脚本提供 .
Now here's a small gif that is enough to explain my problem : http://makeagif.com/i/-JxBG8
以下是有关我的设置的一些信息:
-
怪物质量为1个单位,行星质量为5个单位 .
-
怪物的引力是关闭的 .
-
G的值为1(我已经测试了很多值而没有修复问题)
最后,我知道本周我已经搜索了很多关于如何做到这一点,主要是我的代码是Box2D端口,有一些调整和更改, I've posted a question on GameDev.net here 但任何建议都有效 .
请帮助我解释为什么它不是以物理学初学者的方式工作,我整整一周都陷入了这个问题 .
1 回答
(x,y)的垂直向量是(y,-x)的倍数,但是你有(x,-y) . 您可以通过它们的点积
x1*x2 + y1*y2
为0(1,2) . (1,-2)= -3来检查两个向量何时垂直 . (1,2) . (2,-1)= 2-2 = 0 .顺便说一句,我不建议混合力和速度 . 我会重命名你目前称之为力的速度 .