Как зажать кватернион, чтобы остаться под определенным углом другого - PullRequest
0 голосов
/ 01 мая 2020

У нас есть один объект головы и один объект тела. Эти два объекта являются отдельными потомками объекта одного человека.

Мне нужно, чтобы головной объект вращался свободно влево и вправо, что я и сделал. Мне также нужно, чтобы объект тела вращался влево и вправо ТОЛЬКО с головным объектом, только если разность вращения между двумя кватернионами составляет +/- 90 градусов.

Другими словами, я должен иметь возможность перемещать голова свободно влево и вправо, если разница вращения между головой и телом меньше или превышает 90 градусов, то тело начнет вращаться вместе с головой и остановится, если вращение находится в пределах +/- 90 градусов. Вращение тела не должно совпадать с вращением головы, но вместо этого убедитесь, что оно остается внутри невидимого 180-градусного конуса, который может вращать голова.

1 Ответ

1 голос
/ 01 мая 2020

Хотя вы могли бы сделать что-то вроде этого:

    var rotation = Input.GetAxis("Mouse X") * speed * Time.deltaTime;
    Head.transform.RotateAround(Vector3.up, rotation);
    var angle = Quaternion.Angle(Head.transform.rotation, Body.transform.rotation);
    Debug.Log(angle);
    if(angle > 90)
    {
        Body.transform.RotateAround(Vector3.up, rotation);
    }

Он также будет вращаться, когда вы смотрите вверх или вниз за пределы 90 градусов. Поэтому может быть лучше, чтобы входные данные изменили углы, зафиксировали угол корпуса и установили их в повороты.

    var rotation = Input.GetAxis("Mouse X") * speed * Time.deltaTime;
    headAngle = headAngle + rotation;
    bodyAngle = Mathf.Clamp(bodyAngle, headAngle - 90, headAngle + 90);

    Head.transform.rotation = Quaternion.AngleAxis(headAngle, Vector3.up);
    Body.transform.rotation = Quaternion.AngleAxis(bodyAngle, Vector3.up);
...