簡體   English   中英

pl.net 的軌跡(線性渲染器)不反映實際運動 Unity 3d

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM