diff options
| author | Ushio <ushiostarfish@gmail.com> | 2019-11-24 20:37:52 +0900 |
|---|---|---|
| committer | Ray <raysan5@gmail.com> | 2019-11-24 12:37:52 +0100 |
| commit | b132ae099b325f4f10e947af1016293a8b6d3256 (patch) | |
| tree | 487103b9eee3004d291d072e76fba1e3afa15c29 | |
| parent | 2783d0d63e06d388f03ef6e85d1120bca81e53ce (diff) | |
| download | raylib-b132ae099b325f4f10e947af1016293a8b6d3256.tar.gz raylib-b132ae099b325f4f10e947af1016293a8b6d3256.zip | |
Fix camera not working problem at align z direction. #924 (#1013)
* Fix camera not working problem at align z direction. #924
* replace tab to space x4
| -rw-r--r-- | src/camera.h | 19 |
1 files changed, 7 insertions, 12 deletions
diff --git a/src/camera.h b/src/camera.h index 51da4804..ac4139ba 100644 --- a/src/camera.h +++ b/src/camera.h @@ -243,13 +243,9 @@ void SetCameraMode(Camera camera, int mode) cameraTargetDistance = sqrtf(dx*dx + dy*dy + dz*dz); - Vector2 distance = { 0.0f, 0.0f }; - distance.x = sqrtf(dx*dx + dz*dz); - distance.y = sqrtf(dx*dx + dy*dy); - // Camera angle calculation - cameraAngle.x = asinf( (float)fabs(dx)/distance.x); // Camera angle in plane XZ (0 aligned with Z, move positive CCW) - cameraAngle.y = -asinf( (float)fabs(dy)/distance.y); // Camera angle in plane XY (0 aligned with X, move positive CW) + cameraAngle.x = atan2f(dx, dz); // Camera angle in plane XZ (0 aligned with Z, move positive CCW) + cameraAngle.y = atan2f(dy, sqrtf(dx*dx + dz*dz)); // Camera angle in plane XY (0 aligned with X, move positive CW) playerEyesPosition = camera.position.y; @@ -379,17 +375,16 @@ void UpdateCamera(Camera *camera) else { // Camera panning - camera->target.x += ((mousePositionDelta.x*-CAMERA_FREE_MOUSE_SENSITIVITY)*cosf(cameraAngle.x) + (mousePositionDelta.y*CAMERA_FREE_MOUSE_SENSITIVITY)*sinf(cameraAngle.x)*sinf(cameraAngle.y))*(cameraTargetDistance/CAMERA_FREE_PANNING_DIVIDER); + camera->target.x += ((mousePositionDelta.x*CAMERA_FREE_MOUSE_SENSITIVITY)*cosf(cameraAngle.x) + (mousePositionDelta.y*CAMERA_FREE_MOUSE_SENSITIVITY)*sinf(cameraAngle.x)*sinf(cameraAngle.y))*(cameraTargetDistance/CAMERA_FREE_PANNING_DIVIDER); camera->target.y += ((mousePositionDelta.y*CAMERA_FREE_MOUSE_SENSITIVITY)*cosf(cameraAngle.y))*(cameraTargetDistance/CAMERA_FREE_PANNING_DIVIDER); - camera->target.z += ((mousePositionDelta.x*CAMERA_FREE_MOUSE_SENSITIVITY)*sinf(cameraAngle.x) + (mousePositionDelta.y*CAMERA_FREE_MOUSE_SENSITIVITY)*cosf(cameraAngle.x)*sinf(cameraAngle.y))*(cameraTargetDistance/CAMERA_FREE_PANNING_DIVIDER); + camera->target.z += ((mousePositionDelta.x*-CAMERA_FREE_MOUSE_SENSITIVITY)*sinf(cameraAngle.x) + (mousePositionDelta.y*CAMERA_FREE_MOUSE_SENSITIVITY)*cosf(cameraAngle.x)*sinf(cameraAngle.y))*(cameraTargetDistance/CAMERA_FREE_PANNING_DIVIDER); } } // Update camera position with changes - camera->position.x = sinf(cameraAngle.x)*cameraTargetDistance*cosf(cameraAngle.y) + camera->target.x; - camera->position.y = ((cameraAngle.y <= 0.0f)? 1 : -1)*sinf(cameraAngle.y)*cameraTargetDistance*sinf(cameraAngle.y) + camera->target.y; - camera->position.z = cosf(cameraAngle.x)*cameraTargetDistance*cosf(cameraAngle.y) + camera->target.z; - + camera->position.x = -sinf(cameraAngle.x)*cameraTargetDistance*cosf(cameraAngle.y) + camera->target.x; + camera->position.y = -sinf(cameraAngle.y)*cameraTargetDistance + camera->target.y; + camera->position.z = -cosf(cameraAngle.x)*cameraTargetDistance*cosf(cameraAngle.y) + camera->target.z; } break; case CAMERA_ORBITAL: { |
