Объект не смотрит на другой объект под прямым углом в Unity3D - PullRequest
0 голосов
/ 01 ноября 2018

Я работаю над прототипом игры оборона башни , и у меня возникла проблема с вращением башни. Я сделал так, чтобы у каждой башни была вращающаяся часть, которая вращается по горизонтали и удерживает основной корпус башни с пушкой , которая вращается 1012 * вертикально *. Я придумал простой сценарий для этого, но он, кажется, работает только для ротатора , а не для пушки , по крайней мере, не так, как должно.

Вот код из скрипта:

void Update () {
    if (target != null) {

        Vector3 tempRotatorRotation = rotator.transform.localEulerAngles;
        rotator.transform.LookAt (target.transform);
        rotator.transform.localEulerAngles = new Vector3 (tempRotatorRotation.x, rotator.transform.localEulerAngles.y, tempRotatorRotation.z);

        Vector3 tempCannonRotation = cannon.transform.localEulerAngles;
        cannon.transform.LookAt (target.transform);
        cannon.transform.localEulerAngles = new Vector3 (cannon.transform.localEulerAngles.x, tempCannonRotation.y, tempCannonRotation.z);
    }
}

А вот изображение того, как это получается. Вращатель отлично вращается, но, как вы видите, пушка 1027 * почему-то смотрит вниз. (синий - это пьедестал, который не двигается. Зеленый - вращатель. Красный - корпус башни. Голубой - пушка)

Происхождение пушки 3D-модели установлено почти в начале ее. Вот скриншот выбранного канона, показывающий его ось и данные преобразования

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Ствол вашей пушки указывает в направлении forward, поэтому все, что вам нужно использовать, это cannon.transform.LookAt (target.transform, cannon.transform.up);

void Update () {
    if (target != null) {

        /* rotator code here */

        // Remember which way the top of the cannon faces.
        Vector3 cannonUpDirection = cannon.transform.up;

        // point the cannon directly at the target
        cannon.transform.LookAt (target.transform, cannonUpDirection);
    }
}

Если вращатель не направлен на / выше / ниже цели, то вам нужно выяснить, на сколько повернуть канон вверх / вниз от горизонтали, затем направить его в том же направлении, что и вращатель, и затем сделать что:

void Update () {
    if (target != null) {

        /* rotator code here */

        // Remember which way the top of the cannon faces.
        Vector3 cannonUpDirection = cannon.transform.up;

        // point the cannon directly at the target
        cannon.transform.LookAt (target.transform, cannonUpDirection);

        // Find global direction for looking straight ahead above/below the target
        Vector3 sameYDirection  = Vector3.Scale(
                cannon.transform.forward, 
                new Vector3(1f,0f,1f)
                );

        // Convert that to local
        Vector3 sameYDirectionLocal = cannon.transform
                .InverseTransformDirection(sameYDirection);  

        // get rotation for moving from looking ahead to looking direct
        Quaternion lookTowards = Quaternion.FromToRotation(
                sameYDirectionLocal, 
                Vector3.forward
                );

        // lookTowards is a locally-vertical rotation from horizontal to the target, 
        // given some top side of the cannon. 
        // Clamp lookTowards here if you have a max rotation speed.

        // Face cannon in same direction of rotator;
        cannon.transform.rotation = Quaternion.LookRotation(
                rotator.forward, cannonUpDirection);

        // Use lookTowards to look down from that position.
        cannon.transform.rotation *= lookTowards;
    }
}
0 голосов
/ 02 ноября 2018

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

Также в расчете мне пришлось добавить + 90 к обоим уравнениям. Теперь это не имеет смысла, поскольку показывает, что оба изменяются по оси Y, но один вращается горизонтально, а другой - вертикально.

if (target != null) {

    Vector3 tempRotatorRotation = rotator.transform.localEulerAngles;
    rotator.transform.LookAt (target.transform);
    rotator.transform.localEulerAngles = new Vector3 (tempRotatorRotation.x, rotator.transform.localEulerAngles.y + 90, tempRotatorRotation.z);

    Vector3 tempCanonRotation = canon.transform.localEulerAngles;
    canon.transform.LookAt (target.transform);
    canon.transform.localEulerAngles = new Vector3 (tempCanonRotation.x, canon.transform.localEulerAngles.y + 90, tempCanonRotation.z);
}
0 голосов
/ 01 ноября 2018

forward до единицы - синяя линия, которая на вашей диаграмме обращена вверх. попробуйте это

ящик пуст, прикрепите его к турели, убедитесь, что синяя линия (ось z) направлена ​​вперед, вы можете сделать это вручную, вращая. затем поместите свой ствол как дочерний элемент этого объекта и наведите его на цель.

Мне пришлось делать это несколько раз с моделями блендера, поскольку в качестве вертикальной оси блендер использует ось z, а не ось глубины, как единицу.

-turret_test
    -turret_test_pedestal
    -turret_test_rotater
          -turret_test_turret
               -AIM(new empty, orient the proper direction then add child)
                       -turret_test_cannon
...