| 376 | } |
| 377 | |
| 378 | bool 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; |
no test coverage detected