Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Идеи и творения

Буду делиться тем что делаю.
Оценить эту запись

Box2D и магическое 30

Запись от Герыч размещена 13.08.2009 в 20:52
Обновил(-а) Герыч 13.08.2009 в 21:18

понемногу постигаю Box2D. Первое, что в нём раздражает - это чудо-число 30. Типа 1 метр=30 пикселей. Что за бред?
Во-первых, физ движку должно быть пофиг на то, с какими величинами он работает. В теории и flash'у тоже пофиг, но он(как мне почему-то кажется) не оч точно с Number'ами работает.
Во-вторых, для каждого созданного тела умножать в каждом шаге симуляции(которая сама по себе не быстрая операция) координаты тела на 30 - непозволительная роскошь(особенно если у тебя параллельно box2d'шному движку работает симуляция жидкости).

Итак, ругаясь и матерясь на это "30", я решил поправить этот недочёт.
Как я это делал:
1) Покопался в b2Settings и там предумножил все константы, относящиеся к расстояниям и линейной(ни в коем случае не угловой) скорости, на 30. Вот так(показаны только изменения):
Код AS3:
        ...
	/**
	*   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
        ...
По сути все величины теперь измеряются, 30-ю пикселями вместо 1 метра.

2) При создании объектов я уже передаю реальные размеры(в пикселях). Т.е. к примеру:
Код AS3:
// 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;
Единственное замечание: надо учесть изменение размеров при задании плотности. По-моему правильным является делить плотность на квадрат b2Settings.b2_pixelScale, то есть вместо:
Код AS3:
circleDef.density = 3.0;
Будем писать:
Код AS3:
circleDef.density = 3.0/(b2Settings.b2_pixelScale*b2Settings.b2_pixelScale);
В результате я получил почти эквивалентные результаты при запуске исходного box2D'шного HelloWorld'а и при запуске своего. Сравните результаты(в прикреплённом архиве). Конечно есть небольшие расхождения, но они почти незаметны, а это меня вполне устраивает, не знаю как вас.
Вложения
Тип файла: rar scale-test.rar (107.7 Кб, 258 просмотров)
Всего комментариев 1

Комментарии

Старый 26.03.2010 00:58 JiMKE вне форума
JiMKE
Ну если никаких изменений в производительности движка не произошло, то в чем суть? Просто стало удобнее?
На сколько я понимаю это самое отношение метро-пикселей вычисляет массу тела относительно его размеров. Получается, что ты просто убрал возможность сохранять массу тела при масштабировании мира?
Ну в качестве примера, захотел я значит сделать эффект удаления камеры относительно сцены, соответственно я уменьшил все спрайты и физические тела. И получается у меня, теперь один метр не в 30, а например в 10 пикселях. А так называемый world scale так и остался 30, и все тела теперь легче стали?
Не понимаю зачем ты это сделал...
 

 


Часовой пояс GMT +4, время: 16:56.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.