Applied patch to fix scaling on btCapsuleShape:

http://code.google.com/p/bullet/issues/detail?id=230
Thanks Chuck Spencer for report/fix!

Applied patch to fix triangle mesh embedded in a btCompoundShape:
http://code.google.com/p/bullet/issues/detail?id=229
Thanks Ola for reporting/fixing!
This commit is contained in:
erwin.coumans
2009-06-11 00:23:49 +00:00
parent 47a4435a9a
commit 659272685b
2 changed files with 31 additions and 12 deletions

View File

@@ -296,13 +296,16 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
btCollisionObject* m_collisionObject; btCollisionObject* m_collisionObject;
btTriangleMeshShape* m_triangleMesh; btTriangleMeshShape* m_triangleMesh;
btTransform m_colObjWorldTransform;
BridgeTriangleRaycastCallback( const btVector3& from,const btVector3& to, BridgeTriangleRaycastCallback( const btVector3& from,const btVector3& to,
btCollisionWorld::RayResultCallback* resultCallback, btCollisionObject* collisionObject,btTriangleMeshShape* triangleMesh): btCollisionWorld::RayResultCallback* resultCallback, btCollisionObject* collisionObject,btTriangleMeshShape* triangleMesh,const btTransform& colObjWorldTransform):
//@BP Mod //@BP Mod
btTriangleRaycastCallback(from,to, resultCallback->m_flags), btTriangleRaycastCallback(from,to, resultCallback->m_flags),
m_resultCallback(resultCallback), m_resultCallback(resultCallback),
m_collisionObject(collisionObject), m_collisionObject(collisionObject),
m_triangleMesh(triangleMesh) m_triangleMesh(triangleMesh),
m_colObjWorldTransform(colObjWorldTransform)
{ {
} }
@@ -313,19 +316,21 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
shapeInfo.m_shapePart = partId; shapeInfo.m_shapePart = partId;
shapeInfo.m_triangleIndex = triangleIndex; shapeInfo.m_triangleIndex = triangleIndex;
btVector3 hitNormalWorld = m_colObjWorldTransform.getBasis() * hitNormalLocal;
btCollisionWorld::LocalRayResult rayResult btCollisionWorld::LocalRayResult rayResult
(m_collisionObject, (m_collisionObject,
&shapeInfo, &shapeInfo,
hitNormalLocal, hitNormalWorld,
hitFraction); hitFraction);
bool normalInWorldSpace = false; bool normalInWorldSpace = true;
return m_resultCallback->addSingleResult(rayResult,normalInWorldSpace); return m_resultCallback->addSingleResult(rayResult,normalInWorldSpace);
} }
}; };
BridgeTriangleRaycastCallback rcb(rayFromLocal,rayToLocal,&resultCallback,collisionObject,triangleMesh); BridgeTriangleRaycastCallback rcb(rayFromLocal,rayToLocal,&resultCallback,collisionObject,triangleMesh,colObjWorldTransform);
rcb.m_hitFraction = resultCallback.m_closestHitFraction; rcb.m_hitFraction = resultCallback.m_closestHitFraction;
triangleMesh->performRaycast(&rcb,rayFromLocal,rayToLocal); triangleMesh->performRaycast(&rcb,rayFromLocal,rayToLocal);
} else } else
@@ -346,13 +351,16 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
btCollisionObject* m_collisionObject; btCollisionObject* m_collisionObject;
btConcaveShape* m_triangleMesh; btConcaveShape* m_triangleMesh;
btTransform m_colObjWorldTransform;
BridgeTriangleRaycastCallback( const btVector3& from,const btVector3& to, BridgeTriangleRaycastCallback( const btVector3& from,const btVector3& to,
btCollisionWorld::RayResultCallback* resultCallback, btCollisionObject* collisionObject,btConcaveShape* triangleMesh): btCollisionWorld::RayResultCallback* resultCallback, btCollisionObject* collisionObject,btConcaveShape* triangleMesh, const btTransform& colObjWorldTransform):
//@BP Mod //@BP Mod
btTriangleRaycastCallback(from,to, resultCallback->m_flags), btTriangleRaycastCallback(from,to, resultCallback->m_flags),
m_resultCallback(resultCallback), m_resultCallback(resultCallback),
m_collisionObject(collisionObject), m_collisionObject(collisionObject),
m_triangleMesh(triangleMesh) m_triangleMesh(triangleMesh),
m_colObjWorldTransform(colObjWorldTransform)
{ {
} }
@@ -363,22 +371,22 @@ void btCollisionWorld::rayTestSingle(const btTransform& rayFromTrans,const btTra
shapeInfo.m_shapePart = partId; shapeInfo.m_shapePart = partId;
shapeInfo.m_triangleIndex = triangleIndex; shapeInfo.m_triangleIndex = triangleIndex;
btVector3 hitNormalWorld = m_colObjWorldTransform.getBasis() * hitNormalLocal;
btCollisionWorld::LocalRayResult rayResult btCollisionWorld::LocalRayResult rayResult
(m_collisionObject, (m_collisionObject,
&shapeInfo, &shapeInfo,
hitNormalLocal, hitNormalWorld,
hitFraction); hitFraction);
bool normalInWorldSpace = false; bool normalInWorldSpace = true;
return m_resultCallback->addSingleResult(rayResult,normalInWorldSpace); return m_resultCallback->addSingleResult(rayResult,normalInWorldSpace);
} }
}; };
BridgeTriangleRaycastCallback rcb(rayFromLocal,rayToLocal,&resultCallback,collisionObject,concaveShape); BridgeTriangleRaycastCallback rcb(rayFromLocal,rayToLocal,&resultCallback,collisionObject,concaveShape, colObjWorldTransform);
rcb.m_hitFraction = resultCallback.m_closestHitFraction; rcb.m_hitFraction = resultCallback.m_closestHitFraction;
btVector3 rayAabbMinLocal = rayFromLocal; btVector3 rayAabbMinLocal = rayFromLocal;

View File

@@ -77,6 +77,17 @@ public:
return m_implicitShapeDimensions[m_upAxis]; return m_implicitShapeDimensions[m_upAxis];
} }
virtual void setLocalScaling(const btVector3& scaling)
{
btVector3 oldMargin(getMargin(),getMargin(),getMargin());
btVector3 implicitShapeDimensionsWithMargin = m_implicitShapeDimensions+oldMargin;
btVector3 unScaledImplicitShapeDimensionsWithMargin = implicitShapeDimensionsWithMargin / m_localScaling;
btConvexInternalShape::setLocalScaling(scaling);
m_implicitShapeDimensions = (unScaledImplicitShapeDimensionsWithMargin * m_localScaling) - oldMargin;
}
}; };
///btCapsuleShapeX represents a capsule around the Z axis ///btCapsuleShapeX represents a capsule around the Z axis