• Advertisement

Archived

This topic is now archived and is closed to further replies.

Poly - Line Intersection....almost there...

This topic is 5150 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hey guys, please help me out someone and dont bug me because of my lack of math knowledge. I just cant get polygon line collision to work properly: I''m testing the edges of a triangle against the polys that build up my view frustum. The problem is, when all edges are within the frustum, a collision is still registered. It seems all code i''ve tried so far checks if the endless ray the line describes hits the poly, not the line itself. So I checked with D3DXPlaneIntersectLine() if the edge hits the plane the poly describes, top of the code. And its NOT working! If all lines are inside the frustum the function returns a collision. Is this funtion also only checking the ray against the plane? Well, I''ll post along the code of my current function, I already wasted some nights on this, so please, help me out until I buy my linear algebra book... MLE_API bool mleLineHitsTriangle2(const D3DXVECTOR3& pvLineA, const D3DXVECTOR3& pvLineB, const D3DXVECTOR3& pvTriA, const D3DXVECTOR3& pvTriB, const D3DXVECTOR3& pvTriC, D3DXVECTOR3* pvOut) // =NULL { D3DXVECTOR3 vOut; D3DXPLANE Plane; // die ebene des dreiecks berechnen D3DXPlaneFromPoints(&Plane, &pvTriA, &pvTriB, &pvTriC); // wenn sie die ebene nicht schneidet, kann sie das dreieck nicht schneiden if (D3DXPlaneIntersectLine(&vOut, &Plane, &pvLineA, &pvLineB) == NULL) return false; // der richtungsvektor der linie D3DXVECTOR3 vDir = pvLineB - pvLineA; // Find vectors for two edges sharing vert0 D3DXVECTOR3 edge1 = pvTriB - pvTriA; D3DXVECTOR3 edge2 = pvTriC - pvTriA; // Begin calculating determinant - also used to calculate U parameter D3DXVECTOR3 pvec; D3DXVec3Cross(&pvec, &vDir, &edge2); // If determinant is near zero, ray lies in plane of triangle float det = D3DXVec3Dot(&edge1, &pvec); D3DXVECTOR3 tvec; if(det > 0) { tvec = pvLineA - pvTriA; } else { tvec = pvTriA - pvLineA; det = -det; } if( det < 0.0001f ) return false; // Calculate U parameter and test bounds vOut.x = D3DXVec3Dot(&tvec, &pvec); if(vOut.x < 0.0f || vOut.x > det) return false; // Prepare to test V parameter D3DXVECTOR3 qvec; D3DXVec3Cross(&qvec, &tvec, &edge1); // Calculate V parameter and test bounds vOut.y = D3DXVec3Dot(&vDir, &qvec); if(vOut.y < 0.0f || vOut.x + vOut.y > det) return false; // Calculate t, scale parameters, ray intersects triangle vOut.z = D3DXVec3Dot(&edge2, &qvec); float fInvDet = 1.0f / det; vOut.z *= fInvDet; vOut.x *= fInvDet; vOut.y *= fInvDet; if (pvOut != NULL) *pvOut = vOut; return true; } its got mixed german and english comments cause its mainly taken from the DX ''Pick'' sample

Share this post


Link to post
Share on other sites
Advertisement

  • Advertisement