2 поворота с transform.Rotate() и transform.localEulerAngles() не работают

Я пытаюсь сделать простой автомобильный симулятор, и когда я использую 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);

person hallelshohat    schedule 04.08.2019    source источник


Ответы (2)


Вы не должны использовать localEulerAngles, когда у вас есть два разных поворота, потому что, когда у вас есть 2 движения, если вы используете localEulerAngles, вы меняете локальные углы с движениями, которые вы сами обеспечиваете, поэтому вы теряете ссылку на то, где находится угловое положение вашей оси. в. Вы можете указать методу rotate, чтобы вращать относительно мира, 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);
}

}

эталонное изображение оси

Однако гораздо эффективнее использовать кватернионы, попробуйте это проверить. Надеюсь, это поможет!

person rustyBucketBay    schedule 04.08.2019
comment
Пробовал этот, но проблема в том, что мне нужны абсолютные значения для направления поворота (чтобы установить вращение на 20 и не добавлять к нему 20), и поэтому он начинает вращаться. Но они оба работают - person hallelshohat; 04.08.2019
comment
Я не понимаю вашей точки зрения. Если вы хотите повернуть колесо, оно всегда будет соответствовать его предыдущему положению вращения. С помощью этой ссылки вы можете выбрать значение, которое вам нравится в векторе вращения Vector3 (0, вращение, 0). Если вам нужна абсолютная ссылка, вы можете создать родительский объект и повернуть его. Объекты имеют одну и ту же мировую ось, и при вращении или трансформации дочерние объекты претерпевают такое же преобразование. Вы должны убедиться, что позиция в дочернем элементе равна 0,0,0, так как это расстояние относительно родительской позиции, которая будет точкой вращения. - person rustyBucketBay; 05.08.2019

Я не понимаю вашей точки зрения. Если вы хотите повернуть колесо, оно всегда будет соответствовать его предыдущему положению вращения. С помощью этой ссылки вы можете выбрать значение, которое вам нравится в векторе вращения Vector3 (0, вращение, 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;
}

Надеюсь, это поможет.

person rustyBucketBay    schedule 05.08.2019