Объект Three.JS следует по траектории сплайна — проблемы с вращением/касанием и проблема с постоянной скоростью

Я думаю, что моя проблема аналогична: вращение к касательной к точке сплайна в THREE.JS, но я не могу правильно получить доступ к jsfiddle, и я боролся со второй частью объяснения.

По сути, я создал этот jsfiddle: http://jsfiddle.net/jayfield1979/qGPTT/2/, который демонстрирует простой куб, следующий по пути, созданному сплайном с использованием SplineCurve3. Для навигации используйте стандартное взаимодействие с мышью TrackBall.

Позиционирование куба вдоль пути очень просто. Однако у меня есть два вопроса.

Во-первых, я использую spline.getTanget( t ), где t — это положение вдоль пути, чтобы куб вращался (ось Y только вверх). Я думаю, что что-то упускаю, потому что даже если я извлеку свойство .y результирующей предоставленной касательной, повороты все равно кажутся неправильными. Есть ли какая-то нормализация, которую нужно сделать?

Во-вторых, скорость очень различна вдоль пути, очевидно, что гораздо больше точек сложено при создании более крутых кривых, но мне интересно, есть ли способ реорганизовать путь, чтобы более равномерно распределить промежутки между точками? Я наткнулся на функцию reparametrizeByArcLength, но изо всех сил пытался найти объяснение, как ее использовать.

Любая помощь или объяснение немного математического манекена будет принята с благодарностью.


person jayfield1979    schedule 23.08.2013    source источник


Ответы (1)


Чтобы поддерживать постоянную скорость, вы используете .getPointAt( t ) вместо .getPoint( t ).

Чтобы коробка оставалась касательной к кривой, вы следуете той же логике, что и в ответе на Ориентировать вращение объекта на касательную точку сплайна в THREE.JS.

    box.position.copy( spline.getPointAt(counter) );

    tangent = spline.getTangentAt(counter).normalize();

    axis.crossVectors( up, tangent ).normalize();

    var radians = Math.acos( up.dot( tangent ) );

    box.quaternion.setFromAxisAngle( axis, radians );

EDIT: обновленная скрипта: http://jsfiddle.net/qGPTT/509/

три.js р.88

person WestLangley    schedule 23.08.2013
comment
Фантастика. Я ценю скрипку, поскольку она позволяет мне увидеть это в действии и учиться таким образом. Большое спасибо. - person jayfield1979; 24.08.2013
comment
Спасибо за этот ответ и скрипку, мне было очень легко следовать, если вы извините за каламбур ;-). Не могу дождаться, чтобы применить это к моей идее игры для детей, это будет хорошо работать как для железнодорожных путей, так и для американских горок. Еще раз спасибо. - person Big Rich; 03.12.2013
comment
@WestLangley Следуя этому превосходному ответу, я успешно реализовал это в своем проекте (после долгого перерыва), но у меня есть проблема с ним: jsfiddle.net/jayfield1979/T2t59 Когда ящики доходят до второй строки подряд, они переворачиваются! Есть ли способ решить эту проблему? - person jayfield1979; 05.01.2014
comment
Прости. Вам просто нужно будет пройтись по коду и отладить его. Предупреждение: векторное произведение не является точным, если два вектора параллельны. - person WestLangley; 05.01.2014
comment
Ааа, понятно, так вы говорите, что я вручную исправил вращение, когда есть параллельные векторы? Потому что, похоже, проблема именно в этом. В моем приложении часто встречаются параллельные векторы из-за произвольного шага в 22,5 градуса. Какие-нибудь советы? - person jayfield1979; 05.01.2014
comment
@WestLangley хммм, я облажался, и единственный способ заставить это работать - сместить прямые прямые векторы на 1 градус. Это делает создание идеального цикла невозможным (или очень неэлегантным). Это ошибка, улучшение или просто невозможно? Конечно, это не может быть невозможным, поскольку следование сплайну — довольно стандартная функция 3D-движка? - person jayfield1979; 06.01.2014
comment
jsfiddle.net/T2t59/1 Ваш железнодорожный путь находится в плоскости X-Y. Убедитесь, что вы понимаете, почему мои изменения работают. - person WestLangley; 06.01.2014
comment
Большое спасибо. Первоначально я изменил это (из вашей первой скрипки), потому что я работаю с импортированными моделями collada, которые находятся на другой плоскости, чем нативные 3D-объекты. Я только что повернул их при импорте, и это, кажется, работает :) - person jayfield1979; 06.01.2014
comment
@WestLangley ааа, хотя и третий подряд (недавно добавленный) /а> - person jayfield1979; 06.01.2014
comment
@WestLangley Я ждал еще несколько выпусков THREE.js (во время перерыва в этом проекте), но у меня все еще есть проблемы с объектом после переворота сплайна, когда он движется вдоль параллельного вектора: jsfiddle.net/jayfield1979/T2t59/6 Это будет невозможно реализовать, поскольку это очень важно для этого проекта или, может быть, у вас есть предложение по альтернативному методу реализации такого рода движения? - person jayfield1979; 28.07.2014
comment
Попробуйте эту Fiddle, так как по какой-то причине в r68 вы не можете обновлять положение объектов с помощью функции spline.getPointAt()? jsfiddle.net/jayfield1979/T2t59/7 - person jayfield1979; 28.07.2014
comment
Пожалуйста, создайте новый пост и задайте конкретный вопрос. - person WestLangley; 28.07.2014
comment
Выполнено: stackoverflow.com/questions/24997066/ :) - person jayfield1979; 28.07.2014