MCPcopy Create free account
hub / github.com/FlaxEngine/FlaxEngine / RayIntersectsRay

Method RayIntersectsRay

Source/Engine/Core/Math/CollisionsHelper.cpp:378–456  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

376}
377
378bool CollisionsHelper::RayIntersectsRay(const Ray& ray1, const Ray& ray2, Vector3& point)
379{
380 // Source: Real-Time Rendering, Third Edition
381 // Consterence: Page 780
382
383 Vector3 cross;
384
385 Vector3::Cross(ray1.Direction, ray2.Direction, cross);
386 Real denominator = cross.Length();
387
388 // Lines are parallel
389 if (Math::IsZero(denominator))
390 {
391 // Lines are parallel and on top of each other
392 if (Math::NearEqual(ray2.Position.X, ray1.Position.X) &&
393 Math::NearEqual(ray2.Position.Y, ray1.Position.Y) &&
394 Math::NearEqual(ray2.Position.Z, ray1.Position.Z))
395 {
396 point = Vector3::Zero;
397 return true;
398 }
399 }
400
401 denominator = denominator * denominator;
402
403 // 3x3 matrix for the first ray
404 const Real m11 = ray2.Position.X - ray1.Position.X;
405 const Real m12 = ray2.Position.Y - ray1.Position.Y;
406 const Real m13 = ray2.Position.Z - ray1.Position.Z;
407 Real m21 = ray2.Direction.X;
408 Real m22 = ray2.Direction.Y;
409 Real m23 = ray2.Direction.Z;
410 const Real m31 = cross.X;
411 const Real m32 = cross.Y;
412 const Real m33 = cross.Z;
413
414 // Determinant of first matrix
415 const Real dets =
416 m11 * m22 * m33 +
417 m12 * m23 * m31 +
418 m13 * m21 * m32 -
419 m11 * m23 * m32 -
420 m12 * m21 * m33 -
421 m13 * m22 * m31;
422
423 // 3x3 matrix for the second ray
424 m21 = ray1.Direction.X;
425 m22 = ray1.Direction.Y;
426 m23 = ray1.Direction.Z;
427
428 // Determinant of the second matrix
429 const Real dett =
430 m11 * m22 * m33 +
431 m12 * m23 * m31 +
432 m13 * m21 * m32 -
433 m11 * m23 * m32 -
434 m12 * m21 * m33 -
435 m13 * m22 * m31;

Callers 1

IntersectsMethod · 0.45

Calls 3

IsZeroFunction · 0.70
NearEqualFunction · 0.70
LengthMethod · 0.45

Tested by

no test coverage detected