Показать сообщение отдельно
Старый 26.01.2013, 17:46   #166
Platon
Знающий
 
Регистрация: 04.08.2006
Адрес: Россия
Сообщений: 297
Написано 39 полезных сообщений
(для 70 пользователей)
Ответ: Советы по оптимизации

Сообщение от burovalex Посмотреть сообщение
Но твоё утверждение SDK с твоих слов по поводу перебора ентити по боксу, А уже далее по геометрии - чушь!
Наркоман штоле??
Если ентити - меш, и стоит режим пика по треугольникам - происходит проверка по боксу ( точнее по дереву боксов ) и потом уже по треугольникам ( в листьях дерева )
Вот тебе пруф, развертка CameraPick ( некоторые неважные места я пропустил ):

файл blitz3dsdk/dev/source/bbsdk/bbblitz3d.cpp

функция bbCameraPick
943| Entity *  bbCameraPick( Camera *c,float x,float y ){
...| 	...
956| 	Line l;
...| 	...
964| 	return doPick( l,0 );
965| }
функция doPick
938| static Object *doPick( const Line &l,float radius ){
...| 	...
940| 	return world->traceRay( l,radius,&picked );
941| }
файл blitz3dsdk/dev/source/blitz3d/world.cpp

метод World::traceRay
127| Object *World::traceRay( const Line &line,float radius,ObjCollision *curr_coll ){
...| 	...
139| 	if( hitTest( line,radius,obj,obj->getWorldTform(),obj->getPickGeometry(),&curr_coll->collision ) ){
...| 	...
147| }
метод World::hitTest
 87| bool World::hitTest( const Line &line,float radius,Object *obj,const Transform &tf,int method,Collision *curr_coll  ){
 88| 	switch( method ){
 89| 	case COLLISION_METHOD_SPHERE:
 90| 		return curr_coll->sphereCollide( line,radius,tf.v,obj->getCollisionRadii().x );
 91| 	case COLLISION_METHOD_POLYGON:
 92| 		return obj->collide( line,radius,curr_coll,tf );
 93| 	case COLLISION_METHOD_BOX:
 94| 		Transform t=tf;
 95| 		t.m.i.normalize();t.m.j.normalize();t.m.k.normalize();
 96| 		if( curr_coll->boxCollide( ~t*line,radius,obj->getCollisionBox() ) ){
 97| 			curr_coll->normal=t.m*curr_coll->normal;
 98| 			return true;
 99| 		}
100| 	}
101| 	return false;
102| }
файл blitz3dsdk/dev/source/blitz3d/object.h

метод Object::collide
 48| virtual bool collide( const Line &line,float radius,::Collision *curr_coll,const Transform &t ){ return false; }
метод виртуальный, перегружается наследниками, поэтому в случае с мешем имеем Object => Model => MeshModel

файл blitz3dsdk/dev/source/blitz3d/meshmodel.cpp

этот самый перегруженный метод MeshModel::collide, берет коллайдер и проводит коллизию с сегментом
290| bool MeshModel::collide( const Line &line,float radius,Collision *curr_coll,const Transform &t ){
291| 	return getCollider()->collide( line,radius,curr_coll,t );
292| }
метод MeshModel::getCollider, возвращает коллайдер ( как для коллизий, так и для пика, т.к. это одно и тоже )
282| MeshCollider *MeshModel::getCollider()const{
283| 	return rep->getCollider();
284| }
собственно метод MeshModel::Rep::getCollider, возвращает коллайдер ( и пересчитывает его, если меш изменился )
133| MeshCollider *getCollider()const{
...| 	...
160| 	return collider;
161| }
метод MeshCollider::collide, из сегмента вычисляет бокс и трассирует им дерево
непонятно конечно почему сразу лучом не трассирует, но не суть
 54| bool MeshCollider::collide( const Line &line,float radius,Collision *curr_coll,const Transform &t ){
 55| 
 56| 	if( !tree ) return false;
 57| 
 58| 	//create local box
 59| 	Box box( line );
 60| 	box.expand( radius );
 61| 	Box local_box=-t * box;
 62| 
 63| 	return collide( local_box,line,radius,t,curr_coll,tree );
 64| }
перегруженный метод MeshCollider::collide, собственно сама трассировка бинарного дерева
 66| bool MeshCollider::collide( const Box &line_box,const Line &line,float radius,const Transform &tform,Collision *curr_coll,MeshCollider::Node *node ){
 67| 	if( !line_box.overlaps( node->box ) ){
 68| 		return false;
 69| 	}
...| 	...
100| 	return hit;
101| }
это рекурсивная функция
сначала проверка на пересечение с боксом узла дерева ( потом уже трассировка до листов дерева, а в листьях трассировка треугольнков )

ЗЫ
Есь чо возразить?
(Offline)
 
Ответить с цитированием