Моя сетка переворачивается для вращения меньше, чем math.pi - PullRequest
0 голосов
/ 20 марта 2019

Я возвращаюсь, поскольку у меня возникла геометрическая проблема, с которой я не знаком в Unity.Для игры в стиле f-zero у меня есть поле коллайдера (белое на снимках экрана), которое является источником моего raycast и связано с движением транспортного средства.В показанном коде это this.collider.Я контролирую его вращение с помощью традиционной applymatrix, и нет никаких проблем.

Затем, в дополнение к этому, у меня есть визуализированное тело транспортного средства в этом .meshes.Он наследует вращение блока коллайдера, но получает дополнительное вращение по своей вертикальной оси, чтобы дать визуальную динамику скольжения во время крутых поворотов.Он отделен от коллайдера, чтобы вектор-вперед движения (и лучевая передача) не подвергался дополнительному вращению.Это чисто визуально.

Мой вопрос: как лучше всего это реализовать?

Я пробовал разные вещи, но, в принципе, если я копирую положение и вращение коллайдера,нет проблем.Как только я пытаюсь добавить дополнительное вращение = this.driftRotation, мое тело переворачивается, когда значение direction.y меньше -math.pi.Я могу настроить значение поворота, увеличив Math.PI (как в Unity), но здесь это не работает.Не было найдено ни одного чистого решения с applyMatrix, и не так много ответов от Google по поводу "сетки с вертикальным поворотом" ... хотя я почти уверен, что эта писанина распространена.

Некоторый код:

this.meshes.position.set(
        this.collider.position.x,
        this.collider.position.y,
        this.collider.position.z);
    this.meshes.rotation.x = this.collider.rotation.x;
    this.meshes.rotation.y = this.collider.rotation.y + this.driftRotation; 
    this.meshes.rotation.z = this.collider.rotation.z;

Приложены более явные картинки:

enter image description here

Спасибо

1 Ответ

0 голосов
/ 21 марта 2019

Маркиззо, в этом и заключается суть: 3-й пиксель следует за 2-м, поэтому я все еще поворачиваю направо, но вращение внезапно переворачивается (снова, когда вращение y достигает -PI).Во всяком случае, я исправил это, не пытаясь напрямую изменить значение revolution.y, а играя с матрицей.Просто нужно время, чтобы понять, что и для чего.

Для тех, кто может столкнуться с подобным pb, вот мое временное решение, пока я не найду стинг более производительным:

    this.meshes.matrix.identity();  
    if (Math.abs(driftAmount) > 0)
    {
        this.driftAxis.copy(this.driftDirection);
        this.driftValue = js.Utils.lerp(this.driftValue, Math.sign(driftAmount) * 0.4, 0.05);
        this.meshes.matrix.makeRotationAxis(this.driftAxis, this.driftValue);
    }
    else if (Math.abs(this.driftValue) > 0)
    {
        this.driftAxis.copy(this.driftDirection);
        this.driftValue = js.Utils.lerp(this.driftValue, 0, 0.1);
        if (Math.abs(this.driftValue) < 0.001)
        {
            this.driftValue = 0;    
        }
        this.meshes.matrix.makeRotationAxis(this.driftAxis, this.driftValue);
    }
    this.meshes.applyMatrix(this.collider.matrix);

Я должен был добавитьось смещения по оси смещения, которая является моей осью для моего вертикального вращения.Для исх.Я думаю, что этот предмет +/- связан с проблемой, с которой я столкнулся: https://github.com/mrdoob/three.js/issues/1460

Теперь у меня есть еще одна проблема, как добавить еще один поворот в this.meshes на другой оси, вперед, для вращенияэффект, потому что, если я просто добавлю еще один makeRotationAxis в этот код, он пропустит первый.Но это звучит не так сложно понять, должен существовать эквивалент чего-то combMatrix ...

...