void EDS_2x3PlaneFingers::OnMessage( MessageData* data ) { if (data->message == "collision") { dtCore::Scene::CollisionData* cd = static_cast< dtCore::Scene::CollisionData* >( data->userData ); for(unsigned int i=0; i<2; i++) { for(unsigned int j=0; j<3; j++) { Part* pt = mHand->getFingerFromVector(i)->getKnuckleAt(j); if(pt == NULL) break; if(cd->mBodies[0] == pt->getModelPtr() || cd->mBodies[1] == pt->getModelPtr()) { // 若第k指节发生碰撞,则k, k-1, ..., 0指节均视为发生碰撞 int index = j; for(; index>-1; index--) mCollided[i][index] = 1; mContactPos[i][j] = cd->mLocation; // 保证所有法向量要么都是指向物体中心,要么都是背离物体中心 if(cd->mBodies[0] == pt->getModelPtr()) mContactNormal[i][j] = cd->mNormal * (-1.0); else mContactNormal[i][j] = cd->mNormal * 1.0; } } } } }
void Hand_Custom::Part_Collision_Mapping() { std::vector<CollisionInfoStruct*> CollidesList; IHand::mAsmInfo->parsePartCollision(CollidesList); for (unsigned int i=0; i<CollidesList.size(); i++) { Part* pt = NULL; pt = IHand::getPartFromVector(CollidesList[i]->name); if(pt == NULL) { QString mes = QString("No part named [%1] has been found during Collision Mapping!\n").arg(CollidesList[i]->name.c_str()); mes.append("This might cause crash. Please fix this error and then try again."); QMessageBox::warning(NULL, "Warning", mes); break; } pt->getModelPtr()->SetCollisionMesh(); pt->setCollisionCategoryBits(CollidesList[i]->CollisionCategory); pt->setCollisionCollideBits(CollidesList[i]->CollisionCollides); } }