#three.js #rotation #mesh
#three.js #вращение #сетка
Вопрос:
Я возвращаюсь, так как у меня возникла эта геометрическая проблема, с которой я не знаком в Unity. Для игры в стиле f-zero у меня есть поле collider (белое на снимках экрана), которое является источником моего raycast и привязано к движению транспортного средства. В показанном коде это this.collider. Я управляю ее вращением с помощью традиционной applymatrix, и проблем нет.
Затем, вдобавок ко всему, у меня есть визуализированный кузов транспортного средства в this.meshes. Она наследует вращение блока collider, но получает некоторое дополнительное вращение на своей вертикальной оси, чтобы придать визуальную динамику скольжения во время сложных поворотов. Она отделена от коллайдера, чтобы на вектор движения вперед (и радиовещание) не влияло дополнительное вращение. Это чисто визуально.
Мой вопрос: каков наилучший способ его реализации?
Я пробовал разные вещи, но, в принципе, если я скопирую положение и поворот коллайдера, никаких проблем. Как только я пытаюсь добавить дополнительное вращение = this.driftRotation, мое тело переворачивается при вращении.значение y меньше, чем -math.pi. Я могу настроить значение поворота, увеличив математическое значение.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;
Прилагаю более четкие изображения:
Спасибо
Комментарии:
1. Я не вижу проблемы на ваших скриншотах. Похоже, что на втором кадре она поворачивается вправо, а на третьем — влево, я не вижу ничего переворачивающегося. Вы поворачиваетесь более чем на 90 градусов по нескольким осям? Возможно, вы столкнулись с блокировкой кардана . Необходимо ли изменять y-вращение на
-Pi
вместо того, чтобы держать его близким к 0?
Ответ №1:
Маркиццо, в этом-то и дело: 3-й пиксель следует за 2-м, поэтому я все еще поворачиваю направо, но поворот внезапно переворачивается (опять же, при вращении.y достигает -PI). В любом случае, я исправил это, не пытаясь напрямую изменить вращение.значение 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);
Мне пришлось добавить ось дрейфа вдоль driftDrection, которая является моей осью для моего вертикального вращения.
Для ссылки. Я думаю, что эта тема / — связана с проблемой, которая у меня была:
https://github.com/mrdoob/three.js/issues/1460
Теперь у меня есть другая проблема, как добавить к этому еще одно вращение.сетки на другой оси, прямой, для эффекта перекатывания, потому что, если я просто добавлю еще одну makeRotationAxis в этот код, он просто пропустит первую. Но это звучит менее сложно для понимания, должен существовать эквивалент combineMatrix something…