2012-06-15 7 views
2

Скажем, я бросаю куб, и он падает на землю с поворотами 45, 45, 0 (на его углу). Теперь в «идеальном» мире куб не состоял бы из атомов, и он был бы «совершенным», не было бы ветра (или любого меньшего движения воздуха) и т. Д. И в конце куб остался бы на нем угол. Но мы не живем в таком скучном «идеальном» мире, и физики-эмуляторы должны учитывать это, и они довольно приятны. Таким образом, куб падает на его сторону.Есть ли случайный фактор в AwayPhysics или в физических двигателях вообще?

Теперь мой вопрос: насколько это случайность? Куб всегда падает на левую сторону? Или, может быть, это зависит от Math.random()? Или, может быть, это зависит от текущего времени? Или, может быть, это зависит от какой-то пользовательской случайной функции, которая занимает не время, а параметры объектов на сцене, так как это семя?

Почему я задаю этот вопрос, что если случайность не была основана на времени, я, вероятно, мог бы кэшировать результаты столкновений (когда объекты останавливаются) для их конкретной начальной позиции для оптимизации моей анимации? Если бы я кэшировал всю анимацию, мне было бы все равно, но если бы я только кэшировал конечный результат, я был бы удивлен, что две точно такие же ситуации могут оцениваться с разными результатами, а затем другая не будет соответствовать моей кешированной версии.

Я мог бы просто проверить источник для функций Math.random, но это был бы мелкий метод, поскольку код, безусловно, оптимизирован, и поскольку такая сложная рандомизация там не нужна, я лично буду использовать что-то вроде fallLeft = time% 2. Кроме того, код может меняться со временем.

Здесь ничего не найдено о AwayPhysics, так что, возможно, это что-то новое для всех - вот почему я добавил круглые скобки; мир не взорвется, если я возьму на себя одну вещь, и случается, что в AwayPhysics все наоборот, что же такое стандарт?

ответ

4

Я лично не использую предварительно изготовленные физические двигатели. Вместо этого, когда я хочу его, я пишу его сам, поэтому я знаю, как они работают внутри. Причина, по которой куб кончается, заключается в том, что физический движок является неточным. Он может только приближать такие вещи, как триг-функции, квадратные корни, интегралы и т. Д., Поэтому вместо этого он оценивает их до нескольких цифр точности (15 в Javascript). Если у вас есть случай, скажем, двух совершенных кругов, уложенных друг на друга, угол между ними (pi/2) будет медленно изменяться на некоторое, казалось бы, случайное значение, основанное на том, как программа приближалась к pi. В конце концов, эта крошечная ошибка будет возрастать по мере того, как круги скатываются друг к другу, а верхняя - просто падает. Поэтому, отвечая на ваш вопрос, куб должен каждый раз падать одинаково, если бросить так же, но направление, в котором оно всегда падало, было бы эффективно случайным.

+0

Я не понимаю одну вещь, почему угол изменяется из-за приближения? Math.floor (x) == Math.floor (x). –

+0

Ну, представьте, что угол находится в радианах, поэтому 45 ° прямо вверх будет записано как π/4. Фактическое число π/4 имеет бесконечное количество цифр и поэтому не может быть записано или использовано компьютером. Вместо фактического числа (0,7853981634 ...) компьютер просто использует приближение (например, 0,7854). Это близко, но 0.7854 немного больше 0.7853981634 ..., поэтому куб только что находится под 45 °, и он падает. – mindoftea

+0

О, так вы заявляете, что оно детерминировано, так как одна и та же система всегда будет сокращать число в одном месте, то есть 45 градусов всегда будут оценивать, например, 0,7853981634. Это совершенно верно! К сожалению, на форуме Away3D администратор сказал, что AwayPhysics (BulletPhysics), вероятно, не является детерминированным, поскольку они работают над тем, чтобы сделать структуру менее случайной. В конце концов, все зависит от библиотеки, я полагаю ... спасибо за ваш ответ. –