[英]Trajectory(linerenderer) of a planet doesn't reflect the actual motion Unity 3d
我正在嘗試重建一個太陽系,並且我正在使用牛頓定律。 實際的力效果很好,但是當我嘗試“預測”pl.net 的路徑時,它就是行不通:為了預測它,我使用了一個 lineRenderer,它的點在第 T 時刻被放置在 position 上(T 是時間) . 當我開始游戲時,它們很接近,但隨着時間的推移,pl.net 實際上進入了“軌道”,而線路則上升了。 我無法理解為什么會發生這種情況,因為我以與線路相同的方式計算 pl.net 的 position。 我也嘗試實例化一個球,但結果相同。
public void UpdateSpeed(Vector3 acceleration,float time)
{
velocity += acceleration * time;
}
public void UpdatePosition(float time)
{
transform.position +=velocity *time;
}
public void UpdateLine(float time)
{
position += velocity * time;
Debug.Log(position);
Instantiate(ball, position, Quaternion.identity);
line.positionCount++;
line.SetPosition(line.positionCount-1, position);
}
這里是計算加速度的 function
public Vector3 CalculateAcceleration(GameObject subj, float time)
{
Vector3 Acceleration = Vector3.zero;
foreach (var pl in planets)
{
if (pl != subj)
{
float sqrDistance= Mathf.Pow(Vector3.Distance(subj.transform.position, pl.transform.position), 2);
Vector3 direction = (pl.transform.position - subj.transform.position).normalized;
Acceleration += direction * (pl.GetComponent<Rigidbody>().mass * GravitationalConstant)/sqrDistance;
}
}
return Acceleration;
}
連接到 pl.net 的剛體對 position 有影響嗎?
如果您在軌道上遇到問題,請計算 OrbitFirst 然后調用它以不同的時間移動您的 object,只需修改下面的增量時間
LineRenderer lr;
//Build the orbit path/line
void CalculateOrbitEllipse()
{
Vector3[] points = new Vector3[segments + 1];
for (int i = 0; i < segments; i++)
{
Vector2 position2D = orbitPath.Evaluate((float)i / (float)segments);
points[i] = new Vector3(position2D.x, 0f, position2D.y);
}
points[segments] = points[0];
lr.positionCount = segments + 1;
lr.SetPositions(points);
}
//make the planet move,
//you can invoke this using your time variable, Time.deltaTime see below
IEnumerator AnimationOrbit()
{
if (orbitPeriod < 0.1f)
{
orbitPeriod = 0.1f;
}
float orbitSpeed = 0.1f / orbitPeriod;
while (orbitActive)
{
orbitProgress += Time.deltaTime * orbitSpeed;
orbitProgress %= 1f;
SetOrbitingObjectPosition();
lr = GetComponent<LineRenderer>();
CalculateOrbitEllipse();
yield return null;
}
}
void SetOrbitingObjectPosition()
{
Vector2 orbitPos = orbitPath.Evaluate(orbitProgress);
orbitingObject.localPosition = new Vector3(orbitPos.x, 0, orbitPos.y);
}
所以經常發生我是個白痴。 我正在計算加速度 function 與實際身體位置的距離而不是模擬的 position 所以我總是有一個錯誤的值正在增加而不是變化
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.