Moderators: Sascha Willems, walaber
function myprefilter(body: PNewtonBody; collision: PNewtonCollision; userData: Pointer): cardinal; cdecl;
begin
result:=integer((TWorldObject(userData).newton<>body) and (NewtonCollisionIsTriggerVolume(NewtonBodyGetCollision(body))=0));
end;
if trigger then NewtonCollisionSetAsTriggerVolume(col, 1);
Int mytriggercode = some special value
NewtonWorld* const world = scene->GetNewton();
NewtonCollision* const collision = CreateConvexCollision (world, &aligment[0][0], size, _BOX_PRIMITIVE, mytriggercode);
NewtonCollision* triggerBody = NewtonCreateKinematicBody(world, collision, &matrix[0][0]);
NewtonBodySetUserData(m_tornadoBody, this);
NewtonBodySetTransformCallback(m_tornadoBody, DemoEntity::TransformCallback);
carli2 wrote:(I abused the UserID of the collision to reflect the trigger flag and create kinematic bodies for triggers. the RPG works now)
NewtonWorld* newtonworld = NewtonCreate();
NewtonCollision* newtoncollision = NewtonCreateBox(newtonworld,10,10,10,0,NULL);
dFloat mat0[16] = {1.0,0.0,0.0,0.0, 0.0,1.0,0.0,0.0, 0.0,0.0,1.0,0.0, 0.1,0.0,0.0,1.0};
dFloat mat1[16] = {1.0,0.0,0.0,0.0, 0.0,1.0,0.0,0.0, 0.0,0.0,1.0,0.0, 0.0,0.0,0.0,1.0};
dFloat contactA[3];
dFloat contactB[3];
dFloat normalAB[3];
if (NewtonCollisionClosestPoint(newtonworld, newtoncollision, mat0, newtoncollision, mat1, contactA, contactB, normalAB, 0)==1)
{
printf("1");
}
else
{
printf("0");
}
bool dgCollisionConvex::CalculateClosestPoints (dgCollisionParamProxy& proxy) const
{
_ASSERTE (this == proxy.m_referenceCollision->m_childShape);
dgMinkHull minkHull (proxy);
minkHull.CalculateClosestPoints ();
dgContactPoint* const contactOut = proxy.m_contacts;
dgCollisionInstance* const collConicConvexInstance = proxy.m_referenceCollision;
dgVector p (ConvexConicSupporVertex(minkHull.m_p, minkHull.m_normal));
const dgVector& scale = collConicConvexInstance->m_scale;
const dgVector& invScale = collConicConvexInstance->m_invScale;
const dgMatrix& matrix = collConicConvexInstance->GetGlobalMatrix();
dgVector normal (matrix.RotateVector(invScale.CompProduct4(minkHull.m_normal)));
normal = normal.Scale(dgRsqrt(normal % normal));
contactOut[0].m_normal = normal;
contactOut[0].m_point = matrix.TransformVector(scale.CompProduct4(p));
contactOut[1].m_normal = normal.Scale (-1.0f);
contactOut[1].m_point = matrix.TransformVector(scale.CompProduct4(minkHull.m_q));
return true;
}
dgInt32 dgWorld::ClosestPoint (dgCollisionParamProxy& proxy) const
{
dgCollisionInstance* const collision1 = proxy.m_referenceCollision;
dgCollisionInstance* const collision2 = proxy.m_floatingCollision;
if (!(collision1->GetConvexVertexCount() && collision2->GetConvexVertexCount())) {
return 0;
}
...
}
bool penetration = false;
if (NewtonCollisionClosestPoint(world, collisionA, &matrixA[0][0], m_castingVisualEntity->m_castingShape, &matrixB[0][0], &m_castingVisualEntity->m_contact0[0], &m_castingVisualEntity->m_contact1[0], &m_castingVisualEntity->m_normal[0], 0))
penetration = (((m_castingVisualEntity->m_contact1 - m_castingVisualEntity->m_contact0) % m_castingVisualEntity->m_normal) >= 0) ? true : false;
NewtonCollision* newtoncollision = NewtonCreateBox(newtonworld,10,10,10,0,NULL);
dFloat mat0[16] = {1.0,0.0,0.0,0.0, 0.0,1.0,0.0,0.0, 0.0,0.0,1.0,0.0, 0.1,0.0,0.0,1.0};
dFloat mat1[16] = {1.0,0.0,0.0,0.0, 0.0,1.0,0.0,0.0, 0.0,0.0,1.0,0.0, 0.0,0.0,0.0,1.0};
dFloat contactA[3];
dFloat contactB[3];
dFloat normalAB[3];
if (NewtonCollisionClosestPoint(newtonworld, newtoncollision, mat0, newtoncollision, mat1, contactA, contactB, normalAB, 0)==1)
{
// shape has close point
// cheack for penetration
dFloat diff[3];
diff[0] = contactB[0] - contactA[0];
diff[1] = contactB[1] - contactA[1];
diff[2] = contactB[2] - contactA[2];
bool penetration = dotproduct (diff, noprmalAB) < 0 ? true : false;
}
else
{
// shape do no have closest pooint
printf("0");
}
Users browsing this forum: No registered users and 0 guests