使用transform.Rotate()和transform.localEulerAngles()进行2次旋转不起作用

时间:2019-08-04 10:22:03

标签: c# unity3d rotation

我正在尝试制作一个简单的汽车模拟器,当我使用transform.Rotate()旋转车轮前言(x轴),并使用transform.localEulerAngles()沿转弯方向(y轴)旋转时),只有localEulerAngles()有效。当我仅使用一种方法时,车轮前导旋转(x轴)有效,但是我无法使它们同时起作用。您对如何使它们一起工作有任何想法吗?

float ro = 20f; // 20 degrees turn
//to preserve the x and z values of rotation
Vector3 rot = wheel.gameObject.transform.rotation.eulerAngles;
//rotates the wheels angle
wheel.gameObject.transform.localEulerAngles = new Vector3(rot.x, ro, rot.z);

float vel = wheel.rpm * 2 * Mathf.PI / 60 * Time.deltaTime * Mathf.Rad2Deg;
//rotates the wheels forward
wheel.gameObject.transform.Rotate(vel, 0, 0);

2 个答案:

答案 0 :(得分:0)

当您有两个不同的旋转时,您不应该使用localEulerAngles,因为如果使用localEulerAngles进行两次运动时,您将根据自己提供的运动来更改局部角度,因此您将失去对角位置的参考你的轴在。 您可以指示旋转方法相对于世界旋转,transform.rotate旋转对象相对于世界的变换,因此您可以一起处理同时旋转,因为世界轴不会改变。 在下面尝试的代码段中找到与我的轴方向图片不完全相同的图片。

public class WheelTurning : MonoBehaviour

{

float rpm=10f;
// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{
    if (Input.GetKeyDown(KeyCode.A))
    {
        turn(direction.left);
    }
    if (Input.GetKeyDown(KeyCode.D))
    {
        turn(direction.right);
    }
    float vel = this.rpm * 2 * Mathf.PI / 60 * Time.deltaTime * Mathf.Rad2Deg;
    rotate(vel);
}
enum direction
{
    left,
    right
}
void turn(direction dir)
{
    Vector3 rot = this.gameObject.transform.rotation.eulerAngles;
    //rotates the wheels angle
    float rotation = dir == direction.left ? 20f : -20f;
    gameObject.transform.Rotate(new Vector3(0, rotation, 0), Space.World);
}
void rotate (float speed)
{

    gameObject.transform.Rotate(0, speed, 0);
}

}

axis reference image

但是使用四元数更有效,请尝试检查一下。 希望有帮助!

答案 1 :(得分:0)

我不明白你的意思。如果要转动轮子,则必须尊重其先前的转动位置。使用该参考,您可以在旋转矢量Vector3(0,rotation,0)中选择所需的值。如果需要绝对引用,可以制作一个父对象并将其旋转。对象具有相同的世界轴,并且在旋转或变换时,子级会“遭受”相同的变换。您必须确保子项中的位置是0,0,0,因为这是相对于将成为旋转枢轴的父位置的距离。

 void setRotation()
{
    Vector3 rot = this.gameObject.transform.rotation.eulerAngles;
    GameObject wheelParent = gameObject.transform.parent.gameObject;
    Vector3 rotationVector = new Vector3(0, 30, 0);//absolute turn set
    Quaternion rotation = Quaternion.Euler(rotationVector);
    wheelParent.transform.localRotation = rotation;
}

希望有帮助。