Unity: применение MoveRotation к объекту со смещением - PullRequest
0 голосов
/ 08 июня 2018

В приложении Unity VR, которое я создаю, я пытаюсь повернуть объект, который в данный момент «удерживается».Техника, которую я использую, заключается в том, чтобы найти нужный поворот и подать его в целевые объекты Rigidbody через Rigidbody.MoveRotation.Это хорошо работает, когда я использую тестовый кватернион, выставленный в инспекторе, но моя кватернионная математика полностью подводит меня, когда дело доходит до поиска желаемого вращения.У меня отслеживание положения работает отлично, меня убивает только вращение!

Желаемый результат - то, что целевой объект сохраняет свое текущее вращение (с момента его захвата) и просто применяетПокадровая разница VR контроллера.Я думал, что это будет довольно просто, но я получаю странные результаты.Это то, что я имею до сих пор:

public Rigidbody targetRigidbody;

public Quaternion controllerRotationSnapshot;
public Quaternion targetRotationSnapshot;

public float grabRadius = 0.25f;

public Collider[] grabResults;

Quaternion deltaRotation;

void Awake() {
    grabResults = new Collider[5];
}

// This is triggered externally
public void Pickup() {
    Physics.OverlapSphereNonAlloc(transform.position, grabRadius, grabResults);

    for (int i = 0; i < grabResults.Length; i++) {
        if (grabResults[i] != null) {
            if (grabResults[i].CompareTag("Grabbable")) {
                targetRigidbody = grabResults[0].GetComponent<Rigidbody>();
                targetRotationSnapshot = targetRigidbody.transform.rotation;
                i = grabResults.Length;
            }
        }
    }

    controllerRotationSnapshot = transform.rotation;
}

public void LetGo() {
    if (!targetRigidbody) {
        return;
    }

    targetRigidbody = null;
    grabResults = new Collider[5];
}

void FixedUpdate() {
    if (!targetRigidbody) {
        return;
    }

    Quaternion deltaRotationDifference = transform.rotation * Quaternion.Inverse(controllerRotationSnapshot);

    targetRigidbody.MoveRotation(targetRotationSnapshot * deltaRotationDifference);
}

Это прекрасно работает, пока целевой объект вращается на 0,0,0 (в углах Эйлера).Но в тот момент, когда целевой объект воспринимается с другим поворотом (например, [X: 20, Y: -5, Z: 325] или что-то еще), разница между кадрами в контроллере («дельта-вращение» IВы слышали это называется?) применяется на совершенно другой оси.Это очень сбивает с толку, потому что, насколько я могу судить, ничего из моего кода не применяется локально, все используют глобальные вычисления?

Я много работал с Googlin 'и не могу найти ответ вообще,любая помощь очень ценится.

...