在Unity3D中将Object旋转到另一个

时间:2015-11-17 14:47:26

标签: unity3d rotation quaternions

我已经从this question获得此功能。我改变了轮换的标志:

 void rotateBotConnector()
{
    Vector3 diff = (player.transform.position - botConnector.transform.position).normalized;
    float rot_z = Mathf.Atan2(diff.y, diff.x) * Mathf.Rad2Deg;
    botConnector.transform.localRotation = Quaternion.Euler(0f, 0f, -(rot_z - 90f));
}

但问题是,现在我的对象跟随XZ平面上的玩家,但当旋转达到一定程度时,向左或向右,对象停止向我的玩家旋转。

为了更好地理解:http://imgur.com/vWaqc31

2 个答案:

答案 0 :(得分:3)

为什么不使用:

var target : Transform;

transform.LookAt(Vector3(target.transform.position.x, target.transform.position.y, transform.position.z);

似乎比使用euler容易得多。这样你就可以看到目标x&但是要改变你的z。

此外,我并不是欧拉的专家,但似乎仅限于90度转弯,我认为这可能就是原因:

Quaternion.Euler(0f, 0f, -(rot_z - 90f));

答案 1 :(得分:0)

除非你绝对有必要通过角度旋转,否则你宁可去操纵对象的前向矢量,这样更容易理解逻辑:

void rotateBotConnector()
{
    Vector3 targetForwad = botConnector.transform.position - player.transform.position;
    targetForward.y= 0f;
    targetForward.Normalize(); // <-- this is very expensive function try avoid using it whenever possible
    botConnector.forward = Vector3.Lerp(botConnector.forward, targetForward, Time.deltaTime));
}

再一次,如果你的cpu周期很短,你可能想要尝试计算角度而不是矢量。但在大多数情况下,这是可以的。 (代码需要拼写检查)