void b3GpuDynamicsWorld::rayTest(const btVector3& rayFromWorld, const btVector3& rayToWorld, RayResultCallback& resultCallback) const { b3AlignedObjectArray<b3RayInfo> rays; b3RayInfo ray; ray.m_from = (const b3Vector3&)rayFromWorld; ray.m_to = (const b3Vector3&)rayToWorld; rays.push_back(ray); b3AlignedObjectArray<b3RayHit> hitResults; b3RayHit hit; hit.m_hitFraction = 1.f; hitResults.push_back(hit); m_rigidBodyPipeline->castRays(rays,hitResults); b3Printf("hit = %f\n", hitResults[0].m_hitFraction); if (hitResults[0].m_hitFraction<1.f) { b3Assert(hitResults[0].m_hitBody >=0); b3Assert(hitResults[0].m_hitBody < m_collisionObjects.size()); b3Vector3 hitNormalLocal = hitResults[0].m_hitNormal; btCollisionObject* colObj = m_collisionObjects[hitResults[0].m_hitBody]; LocalRayResult rayResult(colObj,0,(btVector3&)hitNormalLocal,hitResults[0].m_hitFraction); rayResult.m_hitFraction = hitResults[0].m_hitFraction; resultCallback.addSingleResult(rayResult,true); } }
void btSoftRigidDynamicsWorld::rayTestSingle(const btTransform& rayFromTrans, const btTransform& rayToTrans, btCollisionObject* collisionObject, const btCollisionShape* collisionShape, const btTransform& colObjWorldTransform, RayResultCallback& resultCallback) { if (collisionShape->isSoftBody()) { btSoftBody* softBody = btSoftBody::upcast(collisionObject); if (softBody) { btSoftBody::sRayCast softResult; if (softBody->rayTest(rayFromTrans.getOrigin(), rayToTrans.getOrigin(), softResult)) { if (softResult.fraction <= resultCallback.m_closestHitFraction) { btCollisionWorld::LocalShapeInfo shapeInfo; shapeInfo.m_shapePart = 0; shapeInfo.m_triangleIndex = softResult.index; // get the normal btVector3 rayDir = rayToTrans.getOrigin() - rayFromTrans.getOrigin(); btVector3 normal = -rayDir; normal.normalize(); if (softResult.feature == btSoftBody::eFeature::Face) { normal = softBody->m_faces[softResult.index].m_normal; if (normal.dot(rayDir) > 0) { // normal always point toward origin of the ray normal = -normal; } } btCollisionWorld::LocalRayResult rayResult(collisionObject, &shapeInfo, normal, softResult.fraction); bool normalInWorldSpace = true; resultCallback.addSingleResult(rayResult, normalInWorldSpace); } } } } else { btCollisionWorld::rayTestSingle(rayFromTrans, rayToTrans, collisionObject, collisionShape, colObjWorldTransform, resultCallback); } }
virtual btScalar reportHit(const btVector3& hitNormalLocal, btScalar hitFraction, int partId, int triangleIndex ) { btCollisionWorld::LocalShapeInfo shapeInfo; shapeInfo.m_shapePart = partId; shapeInfo.m_triangleIndex = triangleIndex; btCollisionWorld::LocalRayResult rayResult (m_collisionObject, &shapeInfo, hitNormalLocal, hitFraction); bool normalInWorldSpace = false; return m_resultCallback->addSingleResult(rayResult,normalInWorldSpace); }
elfList* elfGetRayCastResults(elfPhysicsWorld* world, float x, float y, float z, float dx, float dy, float dz) { elfList* list; list = elfCreateList(); MultipleRayResultCallback rayResult(btVector3(x, y, z), btVector3(dx, dy, dz), list); world->world->getCollisionWorld()->rayTest(btVector3(x, y, z), btVector3(dx, dy, dz), rayResult); if(!rayResult.hasHit()) { elfDestroyList(list); return NULL; } return list; }
elfCollision* elfGetRayCastResult(elfPhysicsWorld* world, float x, float y, float z, float dx, float dy, float dz) { elfCollision* collision; btCollisionWorld::ClosestRayResultCallback rayResult(btVector3(x, y, z), btVector3(dx, dy, dz)); world->world->getCollisionWorld()->rayTest(btVector3(x, y, z), btVector3(dx, dy, dz), rayResult); if(!rayResult.hasHit()) return NULL; collision = elfCreateCollision(); collision->position.x = rayResult.m_hitPointWorld.x(); collision->position.y = rayResult.m_hitPointWorld.y(); collision->position.z = rayResult.m_hitPointWorld.z(); collision->normal.x = rayResult.m_hitNormalWorld.x(); collision->normal.y = rayResult.m_hitNormalWorld.y(); collision->normal.z = rayResult.m_hitNormalWorld.z(); collision->actor = ((elfPhysicsObject*)((btRigidBody*)rayResult.m_collisionObject)->getUserPointer())->actor; elfIncRef((elfObject*)collision->actor); return collision; }