C++ - Direct X 9.0 - Overlap Tests (Mesh)
This is a code snippet, that I put together to handle mesh-overlapping, so if the view of a player's model is obstructed by something such as a tree, this will cause that tree to have an applied transparency. The code snippet can be used however you want, and broken up/restructured to be more organized -- however, please give me credit if you use it. Thanks.
D3DXVECTOR3 vCenter;
// Lock the Vertex Buffer
if(SUCCEEDED(pMesh->LockVertexBuffer(D3DLOCK_READONLY, (BYTE**)&Ptr)))
{
// Computer Bounding Sphere Radius
D3DXComputeBoundingSphere((void*)Ptr, pMesh->GetNumVertices(),
pMesh->GetNumBytesPerVertex(), &vCenter, &fObjectRadius);
fObjectRadius = D3DXVec3Length(&vCenter) + fObjectRadius;
// Unlock the Vertex Buffer
pMesh->UnlockVertexBuffer();
}
This calculates the Radius, for use in the below Overlap test, your radius will never change, since this mesh isn't adjusting in size.D3DXVECTOR3 vObjectPosVS, vPlayerPosVS; D3DXVec3TransformCoord( &vObjectPosVS, &matView, &vObjectPosWS ); D3DXVec3TransformCoord( &vPlayerPosVS, &matView, &vPlayerPosWS );At this point, we're transforming the coordinates from World-space to View-space, and then if the object obstructs the player, apply transparency.
if ( ( vObjectPosVS.z + fObjectRadius > 0 ) && ( vObjectPosVS.z -
fObjectRadius < vPlayerPosVS.z ) )
{
D3DXVECTOR3 vPositionsVS [4];
D3DXVECTOR3 vPositionsSS [4];
D3DXVECTOR2 vObjectMaxSS;
D3DXVECTOR2 vObjectMinSS;
D3DXVECTOR2 vPlayerMaxSS;
D3DXVECTOR2 vPlayerMinSS;
// Calculate the area the object bounding volume takes up in view space
vPositionsVS[0] = D3DXVECTOR3( vObjectPosVS.x + fObjectRadius,
vObjectPosVS.y, vObjectPosVS.z );
vPositionsVS[1] = D3DXVECTOR3( vObjectPosVS.x - fObjectRadius,
vObjectPosVS.y, vObjectPosVS.z );
vPositionsVS[2] = D3DXVECTOR3( vObjectPosVS.x, vObjectPosVS.y +
fObjectRadius, vObjectPosVS.z );
vPositionsVS[3] = D3DXVECTOR3( vObjectPosVS.x, vObjectPosVS.y -
fObjectRadius, vObjectPosVS.z );
// Calculate the area the object bounding volume takes up in screen space
D3DXVec3TransformCoordArray( vPositionsSS, sizeof(D3DXVECTOR3),
vPositionsVS, sizeof(D3DXVECTOR3), &matProjection, 4 );
vObjectMaxSS.x = vPositionsSS[0].x;
vObjectMinSS.x = vPositionsSS[1].x;
vObjectMaxSS.y = vPositionsSS[2].y;
vObjectMinSS.y = vPositionsSS[3].y;
// Calculate the area the player bounding volume takes up in view space
vPositionsVS[0] = D3DXVECTOR3( vPlayerPosVS.x + fPlayerRadius,
vPlayerPosVS.y, vPlayerPosVS.z );
vPositionsVS[1] = D3DXVECTOR3( vPlayerPosVS.x - fPlayerRadius,
vPlayerPosVS.y, vPlayerPosVS.z );
vPositionsVS[2] = D3DXVECTOR3( vPlayerPosVS.x, vPlayerPosVS.y +
fPlayerRadius, vPlayerPosVS.z );
vPositionsVS[3] = D3DXVECTOR3( vPlayerPosVS.x, vPlayerPosVS.y -
fPlayerRadius, vPlayerPosVS.z );
// Calculate the area the player bounding volume takes up in screen space
D3DXVec3TransformCoordArray( vPositionsSS, sizeof(D3DXVECTOR3),
vPositionsVS, sizeof(D3DXVECTOR3), &matProjection, 4 );
vPlayerMaxSS.x = vPositionsSS[0].x;
vPlayerMinSS.x = vPositionsSS[1].x;
vPlayerMaxSS.y = vPositionsSS[2].y;
vPlayerMinSS.y = vPositionsSS[3].y;
// Check for overlap
if ( vObjectMaxSS.x < vPlayerMinSS.x )
return;
if ( vObjectMaxSS.y < vPlayerMinSS.y )
return;
if ( vObjectMinSS.x > vPlayerMaxSS.x )
return;
if ( vObjectMinSS.y < vPlayerMaxSS.y )
return;
// If we got here, the object is obstructing and should be made transparent
}
Comments