2014-10-28 2 views
4

В THREE.js я иногда нахожусь в поисках лучшего контроля над векторной точностью, особенно при работе с большими поплавками, например, в солнечной системе. Есть какой-либо способ сделать это?Могу ли я увеличить векторную точность в THREE.js?

В связанном примере я строю простую солнечную систему с реалистичными числами для размера и расстояния планеты. Чтобы имитировать орбиту, вся система вращается на оси, расположенной в положении планеты. Когда камера приближается к горизонту планеты, позиционный джиттер проявляется вдоль края.

Могу ли я увеличить точность вращения, применяемого к поворотному объекту и его дочерним объектам, чтобы этот дрожание не был таким выраженным? Или мне просто нужно работать с меньшим диапазоном чисел?

http://jsfiddle.net/Angrypickle/5zs8eLoj/72/

Когда меньшие номера используются для следующих векторов, джиттера, кажется, уменьшается.

sun.position.set(50000000, 0, 0); 
planet.position.set(-50000000, 0, 0); 
+0

Вы могли бы правильно отформатировать ссылку. – theinvisible

+0

Что касается этого определения точности и точности, я не уверен, что вносит большой вклад в эту проблему, но если кто-то знает какой-либо способ тестирования, я был бы признателен. Http: // StackOverflow.COM/теги/с плавающей точкой точности/Информация о – Zob

ответ

2

После долгих исследований, короткий ответ на вопрос: «Могу ли я увеличить вектор точность в three.js» да, но это продвинутая тема.

Долгий ответ: увеличение точности вектора в основном означает увеличение точности числа JavaScript, поскольку значения x, y, z и w внутри вектора являются регулярными номерами JavaScript.

Для повышения точности чисел требуется учет «эпсилон», который является измерением потенциальных ошибок в расчетах. См.: http://mathjs.org/docs/datatypes/numbers.html для описания и возможного решения. Epsilon присутствует в математике JavaScript из-за ограничения 64 бит памяти для Numbers.

Что касается точности, заданной для трехмерных объектов на разных расстояниях, вы можете использовать Logarithmic Depth Buffer для улучшения обработки глубины объекта (или индекса Z). Это не линейно, как можно было бы ожидать. Это отличный способ справиться с сценами, где вам нужно хорошее разрешение на расстоянии как близко, так и далеко.

Здесь 2 хорошие места для начала, если вы решите реализовать это решение. См:

stackoverflow: Logarithmic Depth Buffer OpenGL

Outerra: Maximizing Depth Buffer Range and Precision

Первоначально я задал этот вопрос, потому что я видел «трясти» или «джиттер» в позициях моих объектов при использовании диапазона номеров вы нашли бы в Солнечной системе , Я не хотел уменьшать мои цифры из-за работы, поэтому я исследовал это как решение. Конечным результатом моих усилий является знание о том, что для целей моей солнечной системы в THREE.js существует ограничение расстояний, которые я могу использовать между объектами. Из-за моей геометрии я не могу использовать расстояния более 6 значащих цифр, что означает, например, что обычный радиус орбиты Меркурия 57,9 млн. КМ должен быть уменьшен до 57,9 тыс. Км, что означает, что солнце будет намного больше , и требуют масштабирования себя и т. д. В принципе, чтобы получить надежное позиционирование, моя солнечная система может быть только 999,999 км в диаметре.

+0

Для этого проекта я в конечном итоге упрощает конструкцию, так что все планеты/ВС прикреплены к объекту поворота, и больше не поворота -> ВС -> планеты. Это изменение устранило 50-миллионную «длинную руку» КМ между осью поворота (расположенной на планете, находящейся в настоящее время на орбите) и солнцем, а затем снова на планету. Теперь, когда положение планеты не зависит от отдаленного местоположения, дрожь исчезла. – Zob

Смежные вопросы