2D游戏,计算transform.Rotate的2个向量的值

时间:2014-07-22 14:55:50

标签: math unity3d

首先,我想说我对unity3d真的很新。我做了一些教程,现在我玩了一下。所以这是我的问题。我有一个2D场景,中间有一个重力源(比如它的行星)。我的轨道上有一艘宇宙飞船。重力用以下方法模拟:

var myVector = GameObject.Find("middle").transform.position - transform.position;
rigidbody2D.velocity += 0.2 * Time.deltaTime * myVector;

我可以用以下方式旋转宇宙飞船:

if(Input.GetKey(moveLeft)) {
        transform.Rotate(Vector3.back * -turnSpeed * Time.deltaTime); 
        //this value is something like (0, 0, -8)
    } 

    if(Input.GetKey(moveRight)) {
        transform.Rotate(Vector3.back * turnSpeed * Time.deltaTime);
        //this value is something like (0, 0, 8)
    } 

我想要的是当宇宙飞船改变与行星的角度时它会自动旋转。因此,如果它在他的轨道上,同一侧总是向前看。我为此做了一个小草图: http://snag.gy/AGJMR.jpg (箭是他的方向的宇宙飞船,它应该旋转,而宇宙飞船和行星之间的角度改变)

基本上:当宇宙飞船在地球上飞行1次时,它也会旋转360°。

我将旧的Vector(从太空船到星球)保存起来并且还有实际的矢量:

var myVector = GameObject.Find("middle").transform.position - transform.position;
lastVector = myVector;
//for example:
myVector is (-1, 1, 0)
lastVector is (-1, -1, 0)

在这2个值中,我应该能够获得transform.Rotate的值(类似于(0,0,2)。但我不知道我是如何到达那里的。

1 个答案:

答案 0 :(得分:0)

解决方案非常简单:

var angle = Vector3.Angle(lastVector, myVector);
var cross = Vector3.Cross(lastVector, myVector);
if(cross.z >0) {
    angle = -angle;
}
transform.Rotate(Vector3.back * angle);