Я хотел бы знать, как наилучшим образом управлять координатами в трехмерной игре, цель которой состоит в том, чтобы реалистично моделировать всю солнечную систему, и при этом иметь возможность обрабатывать наименьшие движения на «корабле» (то есть: возможно, мы можем считать 1 см самым маленьким приемлемое движение для кадра). Поддерживают ли это 64-битные двойные (или 64-битные), или мы сталкиваемся с проблемами переполнения? Если нет, то следует ли использовать длинные или двойные или, если да, то какой альтернативный подход, по вашему мнению, является наиболее подходящим для моделирования позиций в солнечной системе в трехмерной игре? (то есть: только удержание части системы на дисплее за раз, основанное на расстоянии до корабля, или представление системы каким-либо другим образом в другом координатном пространстве и т. д.)
15
long
.long long
. Но да, как угодно, называй это придиркой, если хочешь.Ответы:
Уже есть хороший ответ о целых числах, но я чувствую, что плавающие точки не должны быть устранены. В своем ответе Byte56 выбрал максимальную орбиту Плутона, возможно, взятую из этого листа Excel , поэтому я буду придерживаться этого.
Это ставит границы солнечной системы на:
7 376 000 000 км = 7,376x10 ^ 9 км = 7,376x10 ^ 14 см ≈ 7,4x10 ^ 14 см
Формат Double-Precision с плавающей точкой предлагает максимальную точность 15 значащих десятичных знаков. Так что вам повезло: если ваш источник находится в центре Солнца, и вы используете положение вокруг Плутона, вы можете представить все сантиметры, например, в C ++:
Так что если вы можете ограничить свою игру орбитой Плутона, то поздравляю! У вас достаточно точности с двойными числами, чтобы представить это.
Остерегайтесь , однако, что это достаточно , чтобы представить его в симуляции , но не ждите , чтобы оказывать это безболезненно. Вам придется конвертировать в 32-битные числа с плавающей точкой, возможно, изменить свое происхождение, чтобы получить достаточную точность при закрытии объектов, и вам, вероятно, придется полагаться на некоторый трюк с Z-буфером и усечением камеры, чтобы все это отображалось правильно ,
Теперь, если вы хотите, чтобы ваши астронавты посещали какие-то дальние кометы в облаке Оорта , которое намного больше, тогда все кончено. Примерно через 10 ^ 16 см вы начинаете терять точность:
И, конечно, в дальнейшем все ухудшается.
Так что если вы в этом случае, вы можете попробовать некоторые более продвинутые решения. Я предлагаю вам взглянуть на статью Питера Фриза в Game Programming Gems 4: «2.3. Решение проблем точности в больших мировых координатах». IIRC, он предлагает систему, которая может удовлетворить ваши потребности, это действительно несколько разных координатных пространств.
Это всего лишь несколько советов, вам, вероятно, придется использовать какой-то собственный рецепт, чтобы запустить его. Кто-то, кто уже реализовал такие вещи, может помочь вам больше. Почему бы, например, не отправить электронное письмо ребятам из космической программы Kerbal ?
Удачи в вашей игре!
источник
Предположим, Плутон является «краем» солнечной системы (хотя некоторые говорят, что до 3 световых лет). Плутон на своей максимальной орбите находится на расстоянии 7 376 000 000 километров от Солнца. Это 7,37600 × 10 ^ 14 сантиметров. Удвойте это, чтобы получить диаметр, и вы получите 1 475 200 000 000 000 сантиметров. Это хорошо в пределах максимального размера 64-битной длины. Поскольку высота солнечной системы незначительна по сравнению с ее диаметром, мы можем это игнорировать.
Так что да, вы могли бы использовать long, чтобы представить свою позицию в Солнечной системе. На самом деле, вы можете иметь позиции до 9,75 световых лет с длинным знаком (двойным для без знака).
Обратите внимание, что это не относится к поиску расстояний. Максимальное расстояние, которое вы можете найти, является квадратным корнем максимального расстояния, на которое вы можете проехать. Это может быть преодолено с помощью системы уровня детализации для определения расстояний. Вы можете сделать несколько простых проверок, чтобы угадать, как далеко находятся расстояния (сравнить их значения x и y), а затем использовать шаг в 1 000 000 километров для больших расстояний до сантиметровых шагов для малых расстояний.
Конечно, есть вопрос, вы действительно хотите? 99,999% солнечной системы - совершенно неинтересное пустое пространство. Если вы точно представляете Солнечную систему, я надеюсь, что вы не совсем точно представляете физику. Обход Солнечной системы занимает много времени. Слишком долго для большинства людей оставаться заинтересованными.
И почему даже такая высокая точность, если вы не собираетесь моделировать объекты в солнечной системе с такой точностью? Вот где вы попадете в беду. Объем Солнца составляет 1.40900 × 10 ^ 18 кубических километров. В масштабе кубического сантиметра использование одного бита для представления о том, что это пространство «занято», занимает 1,4 × 10 ^ 33 бит или 1,6 × 10 ^ 23 гигабайт. Я думаю, что у вас не так много оперативной памяти.
источник
Вы можете использовать
BigInteger
любой язык программирования. Это целое число неограниченного размера; он хорошо масштабируется - обычно используетlog(n)
хранилище для целого размераn
.У Java и C # есть это; Я уверен, что другие языки делают. Если нет, вы можете декомпилировать и переопределить его без особых затруднений.
источник