Могу ли я увеличить векторную точность в THREE.js?
В THREE.js я иногда обнаруживаю желание улучшить контроль над векторной точностью, особенно при работе с большими поплавками, например, в солнечной системе. Есть какой-либо способ сделать это?
В связанном примере я строю простую солнечную систему с реалистичными числами для размера планеты и расстояния. Для симуляции орбиты вся система вращается вокруг оси, расположенной в положении планеты. Когда камера приближается к горизонту планеты, позиционное дрожание становится заметным вдоль края.
Могу ли я повысить точность вращения, примененного к объекту поворота и его дочерним объектам, чтобы этот джиттер не был таким выраженным? Или мне просто нужно работать с меньшим диапазоном чисел?
http://jsfiddle.net/Angrypickle/5zs8eLoj/72/
Когда меньшие числа используются для следующих векторов, дрожание кажется уменьшенным.
sun.position.set( 50000000, 0, 0 );
planet.position.set( -50000000, 0, 0 );
1 ответ
После долгих исследований короткий ответ на вопрос "Могу ли я повысить точность вектора в THREE.js" - да, но это сложный вопрос.
Длинный ответ: повышение точности вектора в основном означает повышение точности чисел JavaScript, потому что значения x, y, z и w внутри вектора являются обычными числами JavaScript.
Повышение точности чисел требует учета "эпсилон", который является измерением потенциальных ошибок в расчетах. Смотрите: http://mathjs.org/docs/datatypes/numbers.html для описания и возможного решения. Epsilon присутствует в JavaScript-математике из-за ограничения 64-битной памяти для Numbers.
Что касается точности, заданной для трехмерных объектов на различных расстояниях, вы можете использовать логарифмический буфер глубины, чтобы улучшить способ обработки глубины объекта (или индекса Z). Это не линейно, как можно было бы ожидать. Это отличный способ работать со сценами, где вам нужно хорошее разрешение на расстоянии как близко, так и далеко.
Вот 2 хороших места для начала, если вы решите внедрить это решение. Увидеть:
stackru: Логарифмический буфер глубины OpenGL
Outerra: максимизация глубины и точности буфера
Первоначально я задавал этот вопрос, потому что я видел "дрожание" или "дрожание" в позициях моих объектов при использовании диапазона чисел, которые вы найдете в солнечной системе. Я не хотел уменьшать свои цифры из-за выполняемой работы, поэтому я исследовал это как решение. Конечным результатом моих усилий является знание того, что для целей моей солнечной системы в THREE.js существует ограничение на расстояния, которые я могу использовать между объектами. Из-за моей геометрии я не могу использовать расстояния, превышающие 6 значащих цифр, что означает, например, что обычный радиус орбиты Меркурия, равный 57,9 млн. Км, должен быть уменьшен до 57,9 тыс. Км, что означает, что Солнце будет гораздо ближе и больше, и требуется масштабирование себя и так далее. В принципе, чтобы получить надежное позиционирование, моя солнечная система может иметь диаметр всего 999 999 км.