From b43241da4fad87855a5adcf73c3da7c09709ed38 Mon Sep 17 00:00:00 2001 From: Sara Date: Wed, 13 May 2026 16:44:09 +0200 Subject: [PATCH] fix: inverted direction of normal influence on camera distance --- modules/viscosity/player_camera.cpp | 12 ++++++++---- modules/viscosity/player_camera.h | 1 + 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/viscosity/player_camera.cpp b/modules/viscosity/player_camera.cpp index 8a866293..3cba8fef 100644 --- a/modules/viscosity/player_camera.cpp +++ b/modules/viscosity/player_camera.cpp @@ -16,7 +16,7 @@ void PlayerCamera::_bind_methods() { void PlayerCamera::update_rotation() { double const delta{ get_process_delta_time() }; - Vector3 velocity{ get_parent_node_3d()->get_global_position() - this->previous_origin }; + Vector3 velocity{ get_origin() - this->previous_origin }; if (velocity.length() > 0.1 && this->mouse_look_input.is_zero_approx() && this->joystick_input.is_zero_approx()) { Vector3 forward{ -get_global_basis().get_column(2) }; forward.y = 0; @@ -42,7 +42,7 @@ void PlayerCamera::update_rotation() { } void PlayerCamera::update_position() { - Vector3 origin{ get_parent_node_3d()->get_global_position() }; + Vector3 origin{ get_origin() }; Vector3 direction{ get_global_basis().get_column(2) }; float distance{ this->target_distance }; Vector3 target{ origin + direction * distance }; @@ -50,11 +50,11 @@ void PlayerCamera::update_position() { this->ray.to = target; PhysicsDirectSpaceState3D::RayResult result{}; if (get_world_3d()->get_direct_space_state()->intersect_ray(this->ray, result)) { - distance = origin.distance_to(result.position) - Math::abs(direction.dot(result.normal)); + distance = origin.distance_to(result.position) - (2.0 - Math::abs(direction.dot(result.normal))); } else { distance -= 1.f; } - look_at_from_position(origin + direction * MAX(distance, 0.5f), origin); + look_at_from_position(origin + direction * MAX(distance, 0.4f), origin); this->previous_origin = origin; } @@ -93,6 +93,10 @@ void PlayerCamera::unhandled_input(Ref const &event) { } } +Vector3 PlayerCamera::get_origin() const { + return get_parent_node_3d()->get_global_position() + Vector3::UP * 0.25f; +} + void PlayerCamera::set_blocking_mask(uint32_t mask) { this->ray.collision_mask = mask; notify_property_list_changed(); diff --git a/modules/viscosity/player_camera.h b/modules/viscosity/player_camera.h index 441df60a..fefc4a78 100644 --- a/modules/viscosity/player_camera.h +++ b/modules/viscosity/player_camera.h @@ -35,6 +35,7 @@ private: }; public: + Vector3 get_origin() const; GET_SET_FNS(float, target_distance); GET_SET_FNS(float, mouse_sensitivity); GET_SET_FNS(float, joystick_sensitivity);