(使用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的用户说我应该问这里,因为这里有一大群数学编码员。
我搜索了很多关于这个问题(我怎么找到那个公式)。
答案 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的地方绘制你的点,但除非我误解你的问题,否则这是相同的想法。