二维弹丸轨迹预测(unity3d)

时间:2013-12-01 21:51:25

标签: unity3d 2d physics game-physics prediction

(使用unity3d 4.3 2d,它像物理一样使用box2d。)

我在预测轨迹方面遇到了问题 我正在使用:

Vector2 startPos;
float power = 10.0f;
float interval = 1/30.0f; 
GameObject[] ind;


void Start (){
        transform.rigidbody2D.isKinematic = true;
        ind = new GameObject[dots];
        for(int i = 0; i<dots; i++){
            GameObject dot = (GameObject)Instantiate(Dot);
            dot.renderer.enabled = false;
            ind[i] = dot;
        }
    }

void Update (){
        if(shot) return;
        if(Input.GetAxis("Fire1") == 1){
            if(!aiming){
                aiming = true;
                startPos = Input.mousePosition;
                ShowPath();
            }
            else{
                CalculatePath();
            }

        }
        else if(aiming && !shot){
            transform.rigidbody2D.isKinematic =  false; 
            transform.rigidbody2D.AddForce(GetForce(Input.mous  ePosition));        
            shot = true;
            aiming = false;
            HidePath();
        }
}

Vector2 GetForce(Vector3 mouse){
        return (new Vector2(startPos.x, startPos.y)- new Vector2(mouse.x, mouse.y))*power;

}

void CalculatePath(){
        ind[0].transform.position = transform.position; //set frist dot to ball position
        Vector2 vel = GetForce(Input.mousePosition); //get velocity

        for(int i = 1; i < dots; i++){          
            ind[i].renderer.enabled = true; //make them visible
            Vector3 point = PathPoint(transform.position, vel, i); //get position of the dot 
            point.z = -1.0f;
            ind[i].transform.position = point;
        } 
    }

    Vector2 PathPoint(Vector2 startP, Vector2 startVel, int n){
               //Standard formula for trajectory prediction
        float t = interval;
        Vector2 stepVelocity = t*startVel;
        Vector2 StepGravity = t*t*Physics.gravity;

        Vector2 whattoreturn = ((startP + (n * stepVelocity)+(n*n+n)*StepGravity) * 0.5f);

        return whattoreturn;
    }

使用这个,我得到错误的轨迹。 1.就像引力根本不会拖拽轨迹一样,是的,我知道引力很弱,因为:

t*t*Physics.gravity = 0.03^2 * vector2(0, -9.8) = vector2(0, -0.00882)

但这就是公式:S 由于重力低,速度太强。

以下是视频: http://tinypic.com/player.php?v=1z50w3m&s=5

轨迹公式形式: http://www.iforce2d.net/b2dtut/projected-trajectory

我该怎么办?

我发现如果我设置了 StepGravity更强大的东西,如(0,-0.1) 并将startVel除以8 我得到了几乎正确的轨迹,但我不希望这样,我需要真正的轨迹路径。

来自answer.unity3d.com的用户说我应该问这里,因为这里有一大群数学编码员。

我搜索了很多关于这个问题(我怎么找到那个公式)。

1 个答案:

答案 0 :(得分:1)

你只计算每一步重力超过1/30秒的影响 - 你需要累积它。步骤1应以0.09G的速度结束,步骤2以.18G结束,步骤3以.27G等结束。

这是一个非常简单的例子,根据起始速度和提供的时间绘制弹道轨迹:

using UnityEngine;
using System.Collections;

public class grav : MonoBehaviour {

    public Vector3 StartVelocity;
    public float PredictionTime;
    private Vector3 G;

    void OnDrawGizmos()
    {
        if (G == Vector3.zero)
        {
             // a hacky way of making sure this gets initialized in editor too...
            // this assumes 60 samples / sec
            G = new Vector3(0,-9.8f,0) / 360f;
        }
        Vector3 momentum = StartVelocity;
        Vector3 pos = gameObject.transform.position;
        Vector3 last = gameObject.transform.position;
        for (int i = 0; i < (int) (PredictionTime * 60); i++)
        {
            momentum += G;
            pos += momentum;
            Gizmos.DrawLine(last, pos);
            last = pos;
        }

    }
}

在你的版本中,你需要在我绘制Gizmo的地方绘制你的点,但除非我误解你的问题,否则这是相同的想法。