Сообщение от 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| }
это рекурсивная функция
сначала проверка на пересечение с боксом узла дерева ( потом уже трассировка до листов дерева, а в листьях трассировка треугольнков )
ЗЫ
Есь чо возразить?
