В приложении 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 'и не могу найти ответ вообще,любая помощь очень ценится.