summaryrefslogtreecommitdiffhomepage
path: root/src/core.c
diff options
context:
space:
mode:
authorraysan5 <[email protected]>2017-07-22 11:02:40 +0200
committerraysan5 <[email protected]>2017-07-22 11:02:40 +0200
commitcbb134946c73c3857d1f3185c25a5398fad3fa5d (patch)
tree7a7cf4b9ef590e32dc7d54506a87cd1c3c63b576 /src/core.c
parentc756227e11ec3a16b6c3ce09826e5c8162cfd031 (diff)
downloadraylib-cbb134946c73c3857d1f3185c25a5398fad3fa5d.tar.gz
raylib-cbb134946c73c3857d1f3185c25a5398fad3fa5d.zip
Corrected GetMouseRay() and rlUnproject()
Now it works great with reviewed maths
Diffstat (limited to 'src/core.c')
-rw-r--r--src/core.c33
1 files changed, 2 insertions, 31 deletions
diff --git a/src/core.c b/src/core.c
index 028d7b14..48c46dfd 100644
--- a/src/core.c
+++ b/src/core.c
@@ -979,45 +979,16 @@ Ray GetMouseRay(Vector2 mousePosition, Camera camera)
TraceLog(LOG_DEBUG, "Device coordinates: (%f, %f, %f)", deviceCoords.x, deviceCoords.y, deviceCoords.z);
- // Calculate projection matrix (from perspective instead of frustum)
+ // Calculate projection matrix from perspective
Matrix matProj = MatrixPerspective(camera.fovy*DEG2RAD, ((double)GetScreenWidth()/(double)GetScreenHeight()), 0.01, 1000.0);
// Calculate view matrix from camera look at
Matrix matView = MatrixLookAt(camera.position, camera.target, camera.up);
- // Do I need to transpose it? It seems that yes...
- // NOTE: matrix order may be incorrect... In OpenGL to get world position from
- // camera view it just needs to get inverted, but here we need to transpose it too.
- // For example, if you get view matrix, transpose and inverted and you transform it
- // to a vector, you will get its 3d world position coordinates (camera.position).
- // If you don't transpose, final position will be wrong.
- //MatrixTranspose(&matView);
-
-//#define USE_RLGL_UNPROJECT
-#if defined(USE_RLGL_UNPROJECT) // OPTION 1: Use rlUnproject()
-
+ // Unproject far/near points
Vector3 nearPoint = rlUnproject((Vector3){ deviceCoords.x, deviceCoords.y, 0.0f }, matProj, matView);
Vector3 farPoint = rlUnproject((Vector3){ deviceCoords.x, deviceCoords.y, 1.0f }, matProj, matView);
-#else // OPTION 2: Compute unprojection directly here
-
- // Calculate unproject matrix (multiply projection matrix and view matrix) and invert it
- Matrix matProjView = MatrixMultiply(matProj, matView);
- MatrixInvert(&matProjView);
-
- // Calculate far and near points
- Quaternion qNear = { deviceCoords.x, deviceCoords.y, 0.0f, 1.0f };
- Quaternion qFar = { deviceCoords.x, deviceCoords.y, 1.0f, 1.0f };
-
- // Multiply points by unproject matrix
- QuaternionTransform(&qNear, matProjView);
- QuaternionTransform(&qFar, matProjView);
-
- // Calculate normalized world points in vectors
- Vector3 nearPoint = { qNear.x/qNear.w, qNear.y/qNear.w, qNear.z/qNear.w};
- Vector3 farPoint = { qFar.x/qFar.w, qFar.y/qFar.w, qFar.z/qFar.w};
-#endif
-
// Calculate normalized direction vector
Vector3 direction = VectorSubtract(farPoint, nearPoint);
VectorNormalize(&direction);