private bool RayIntersectTriangle(Vector3 rayPosition, Vector3 rayDirection, Vector3 tri0, Vector3 tri1, Vector3 tri2, ref float pickDistance, ref float barycentricU, ref float barycentricV) { // Find vectors for two edges sharing vert0 Vector3 edge1 = tri1 - tri0; Vector3 edge2 = tri2 - tri0; // Begin calculating determinant - also used to calculate barycentricU parameter Vector3 pvec = Vector3.Cross(rayDirection, edge2); // If determinant is near zero, ray lies in plane of triangle float det = Vector3.Dot(edge1, pvec); if (det < 0.0001f) return false; // Calculate distance from vert0 to ray origin Vector3 tvec = rayPosition - tri0; // Calculate barycentricU parameter and test bounds barycentricU = Vector3.Dot(tvec, pvec); if (barycentricU < 0.0f || barycentricU > det) return false; // Prepare to test barycentricV parameter Vector3 qvec = Vector3.Cross(tvec, edge1); // Calculate barycentricV parameter and test bounds barycentricV = Vector3.Dot(rayDirection, qvec); if (barycentricV < 0.0f || barycentricU + barycentricV > det) return false; // Calculate pickDistance, scale parameters, ray intersects triangle pickDistance = Vector3.Dot(edge2, qvec); float fInvDet = 1.0f / det; pickDistance *= fInvDet; barycentricU *= fInvDet; barycentricV *= fInvDet; return true; }
I have experience working with C++ and DirectX. I prefer working with C# and WPF. In my spare time I work with HTML, JS, CSS.