对象在Unity3D中不以直角查看其他对象

时间:2018-11-01 15:03:44

标签: c# unity3d rotation blender

我正在研究塔防游戏的原型,并且遇到了炮塔旋转的问题。我这样做是为了使每个炮塔都必须有一个 rotor 零件,该零件会水平旋转 并保持炮塔主体大炮 strong>垂直旋转 。我想出了一个简单的脚本,但是它似乎只对 rotator 有用,而对 cannon 无效,至少不是这样。

这是脚本中的 code

void Update () {
    if (target != null) {

        Vector3 tempRotatorRotation = rotator.transform.localEulerAngles;
        rotator.transform.LookAt (target.transform);
        rotator.transform.localEulerAngles = new Vector3 (tempRotatorRotation.x, rotator.transform.localEulerAngles.y, tempRotatorRotation.z);

        Vector3 tempCannonRotation = cannon.transform.localEulerAngles;
        cannon.transform.LookAt (target.transform);
        cannon.transform.localEulerAngles = new Vector3 (cannon.transform.localEulerAngles.x, tempCannonRotation.y, tempCannonRotation.z);
    }
}

这是结果的图像。 旋转器已完美旋转,但正如您所见,大炮由于某种原因而向下看。 (蓝色是不动的基座。绿色是旋转器。红色是炮塔体。浅蓝色是大炮)

大炮 3D模型的原点几乎是在开始时设置的。 这是所选佳能的屏幕截图,显示了它的轴和变换数据

3 个答案:

答案 0 :(得分:1)

forward统一为蓝线,在您的图表中该蓝线朝上。试试这个

板条箱为空,将其安装在转塔上以使其旋转,并确保蓝线(z轴)面向您的前进方向,您可以通过旋转手动进行此操作。然后将桶作为该对象的子对象,然后将该对象指向目标。

iveve必须对Blender模型进行多次操作,因为Blender使用z轴作为垂直轴,而不是像unity那样使用深度轴。

-turret_test
    -turret_test_pedestal
    -turret_test_rotater
          -turret_test_turret
               -AIM(new empty, orient the proper direction then add child)
                       -turret_test_cannon

答案 1 :(得分:0)

您的大炮的枪管指向其forward方向,因此您只需使用cannon.transform.LookAt (target.transform, cannon.transform.up);

void Update () {
    if (target != null) {

        /* rotator code here */

        // Remember which way the top of the cannon faces.
        Vector3 cannonUpDirection = cannon.transform.up;

        // point the cannon directly at the target
        cannon.transform.LookAt (target.transform, cannonUpDirection);
    }
}

如果旋转器没有指向目标/在目标上方/下方,那么您必须计算出将佳能从水平方向向上/向下旋转多少,然后将其指向与旋转器相同的方向,然后执行

void Update () {
    if (target != null) {

        /* rotator code here */

        // Remember which way the top of the cannon faces.
        Vector3 cannonUpDirection = cannon.transform.up;

        // point the cannon directly at the target
        cannon.transform.LookAt (target.transform, cannonUpDirection);

        // Find global direction for looking straight ahead above/below the target
        Vector3 sameYDirection  = Vector3.Scale(
                cannon.transform.forward, 
                new Vector3(1f,0f,1f)
                );

        // Convert that to local
        Vector3 sameYDirectionLocal = cannon.transform
                .InverseTransformDirection(sameYDirection);  

        // get rotation for moving from looking ahead to looking direct
        Quaternion lookTowards = Quaternion.FromToRotation(
                sameYDirectionLocal, 
                Vector3.forward
                );

        // lookTowards is a locally-vertical rotation from horizontal to the target, 
        // given some top side of the cannon. 
        // Clamp lookTowards here if you have a max rotation speed.

        // Face cannon in same direction of rotator;
        cannon.transform.rotation = Quaternion.LookRotation(
                rotator.forward, cannonUpDirection);

        // Use lookTowards to look down from that position.
        cannon.transform.rotation *= lookTowards;
    }
}

答案 2 :(得分:-2)

结果证明Unity已损坏,当我重新导入模型时,所有轴都发生了变化,现在不再是经典的在X轴上上下旋转,而是在Y轴上,而其他所有东西都在Y方向上水平旋转。 / p>

在计算中,我还必须在两个方程式中加上+ 90。现在这已经没有意义了,因为它表明两者都在Y轴上发生变化,但是一个在水平方向旋转而另一个在垂直方向旋转。

if (target != null) {

    Vector3 tempRotatorRotation = rotator.transform.localEulerAngles;
    rotator.transform.LookAt (target.transform);
    rotator.transform.localEulerAngles = new Vector3 (tempRotatorRotation.x, rotator.transform.localEulerAngles.y + 90, tempRotatorRotation.z);

    Vector3 tempCanonRotation = canon.transform.localEulerAngles;
    canon.transform.LookAt (target.transform);
    canon.transform.localEulerAngles = new Vector3 (tempCanonRotation.x, canon.transform.localEulerAngles.y + 90, tempCanonRotation.z);
}