Буду делиться тем что делаю.
Box2D и магическое 30
понемногу постигаю Box2D. Первое, что в нём раздражает - это чудо-число 30. Типа 1 метр=30 пикселей. Что за бред?
Во-первых, физ движку должно быть пофиг на то, с какими величинами он работает. В теории и flash'у тоже пофиг, но он(как мне почему-то кажется) не оч точно с Number'ами работает.
Во-вторых, для каждого созданного тела умножать в каждом шаге симуляции(которая сама по себе не быстрая операция) координаты тела на 30 - непозволительная роскошь(особенно если у тебя параллельно box2d'шному движку работает симуляция жидкости).
Итак, ругаясь и матерясь на это "30", я решил поправить этот недочёт.
Как я это делал:
1) Покопался в b2Settings и там предумножил все константы, относящиеся к расстояниям и линейной(ни в коем случае не угловой) скорости, на 30. Вот так(показаны только изменения):
... /** * anti physycs scale */ static public const b2_pixelScale:Number = 30; ... // Dynamics /** * A small length used as a collision and constraint tolerance. Usually it is * chosen to be numerically significant, but visually insignificant. */ static public const b2_linearSlop:Number = 0.005 * b2_pixelScale; // 0.5 cm ... /** * A velocity threshold for elastic collisions. Any collision with a relative linear * velocity below this threshold will be treated as inelastic. */ static public const b2_velocityThreshold:Number = 1.0 * b2_pixelScale; // 1 m/s /** * The maximum linear position correction used when solving constraints. This helps to * prevent overshoot. */ static public const b2_maxLinearCorrection:Number = 0.2 * b2_pixelScale; // 20 cm ... /** * The maximum linear velocity of a body. This limit is very large and is used * to prevent numerical problems. You shouldn't need to adjust this. */ static public const b2_maxTranslation:Number = 2.0 * b2_pixelScale; static public const b2_maxTranslationSquared:Number = b2_maxTranslation * b2_maxTranslation; .... /** * A body cannot sleep if its linear velocity is above this tolerance. */ static public const b2_linearSleepTolerance:Number = 0.01 * b2_pixelScale; // 1 cm/s ...
2) При создании объектов я уже передаю реальные размеры(в пикселях). Т.е. к примеру:
// Create world AABB var worldAABB:b2AABB = new b2AABB(); worldAABB.lowerBound.Set(-100.0*b2Settings.b2_pixelScale, -100.0*b2Settings.b2_pixelScale); worldAABB.upperBound.Set(100.0*b2Settings.b2_pixelScale, 100.0*b2Settings.b2_pixelScale); // Define the gravity vector var gravity:b2Vec2 = new b2Vec2(0.0, 10.0*b2Settings.b2_pixelScale); ... bodyDef = new b2BodyDef(); bodyDef.position.Set(10*b2Settings.b2_pixelScale, 12*b2Settings.b2_pixelScale); boxDef = new b2PolygonDef(); boxDef.SetAsBox(30*b2Settings.b2_pixelScale, 3*b2Settings.b2_pixelScale); boxDef.friction = 0.3; boxDef.density = 0; bodyDef.userData = new Ground(); bodyDef.userData.width = 2 * 30 * b2Settings.b2_pixelScale; bodyDef.userData.height = 2 * 3 * b2Settings.b2_pixelScale;
Будем писать:
В результате я получил почти эквивалентные результаты при запуске исходного box2D'шного HelloWorld'а и при запуске своего. Сравните результаты(в прикреплённом архиве). Конечно есть небольшие расхождения, но они почти незаметны, а это меня вполне устраивает, не знаю как вас.
Всего комментариев 1
Комментарии
Последние записи от Герыч
- Массив объектов или несколько массивов? (16.08.2009)
- SVN (16.08.2009)
- Box2D и магическое 30 (13.08.2009)
- Двойное деление vs Мозги (09.08.2009)
- Желе: убраны многие баги + появилась смена состояний (03.08.2009)