Как вращать объект вокруг себя? - PullRequest
1 голос
/ 07 июля 2019

Я хочу повернуть куб в Unity3D. Когда я нажимаю стрелку влево на клавиатуре, куб должен вращаться влево. Если я нажимаю вверх, куб должен вращаться вверх. Но по моему сценарию куб вращается влево, а затем вращение влево вверх.

Это текущий статус:

enter image description here

Вот что я хочу:

enter image description here

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Rotate : MonoBehaviour
{
    public float smooth = 1f;
    private Quaternion targetRotation;
    // Start is called before the first frame update
    void Start()
    {
        targetRotation = transform.rotation;
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetKeyDown(KeyCode.UpArrow)){
            targetRotation *= Quaternion.AngleAxis(90, Vector3.right);
        }
        if(Input.GetKeyDown(KeyCode.DownArrow)){
            targetRotation *= Quaternion.AngleAxis(90, Vector3.left);
        }
        if(Input.GetKeyDown(KeyCode.LeftArrow)){
            targetRotation *= Quaternion.AngleAxis(90, Vector3.up);
        }
        if(Input.GetKeyDown(KeyCode.RightArrow)){
            targetRotation *= Quaternion.AngleAxis(90, Vector3.down);
        }
        transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, 10* smooth * Time.deltaTime);

    }
}

1 Ответ

1 голос
/ 07 июля 2019

Вам нужно поменять местами порядок умножения кватернионов.

Как у вас сейчас, повороты применяются к осям так же, как и после исходного поворота, потому что вы эффективно выполняете targetRotation = targetRotation * ...;.

Однако вы хотите вращать вращение вокруг мировых осей. Вы можете сделать это, выполнив targetRotation = ... * targetRotation;:

void Update()
{
    if(Input.GetKeyDown(KeyCode.UpArrow)){
        targetRotation = Quaternion.AngleAxis(90, Vector3.right) * targetRotation;
    }
    if(Input.GetKeyDown(KeyCode.DownArrow)){
        targetRotation = Quaternion.AngleAxis(90, Vector3.left) * targetRotation;
    }
    if(Input.GetKeyDown(KeyCode.LeftArrow)){
        targetRotation = Quaternion.AngleAxis(90, Vector3.up) * targetRotation;
    }
    if(Input.GetKeyDown(KeyCode.RightArrow)){
        targetRotation = Quaternion.AngleAxis(90, Vector3.down) * targetRotation;
    }
    transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, 10* smooth * Time.deltaTime);

}

См. Как мне повернуть кватернион со вторым кватернионом по его локальной или мировой осям без использования transform.Rotate? для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...