1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-08 12:40:44 +00:00

Merge pull request #95402 from MajorMcDoom/rotation-gizmo-fix

Correct rotation gizmo plane math for off-center perspective view
This commit is contained in:
Rémi Verschelde
2024-08-16 10:35:51 +02:00

View File

@@ -5001,14 +5001,24 @@ void Node3DEditorViewport::update_transform(bool p_shift) {
} break; } break;
case TRANSFORM_ROTATE: { case TRANSFORM_ROTATE: {
Plane plane = Plane(_get_camera_normal(), _edit.center); Plane plane;
if (camera->get_projection() == Camera3D::PROJECTION_PERSPECTIVE) {
Vector3 cam_to_obj = _edit.center - _get_camera_position();
if (!cam_to_obj.is_zero_approx()) {
plane = Plane(cam_to_obj.normalized(), _edit.center);
} else {
plane = Plane(_get_camera_normal(), _edit.center);
}
} else {
plane = Plane(_get_camera_normal(), _edit.center);
}
Vector3 local_axis; Vector3 local_axis;
Vector3 global_axis; Vector3 global_axis;
switch (_edit.plane) { switch (_edit.plane) {
case TRANSFORM_VIEW: case TRANSFORM_VIEW:
// local_axis unused // local_axis unused
global_axis = _get_camera_normal(); global_axis = plane.normal;
break; break;
case TRANSFORM_X_AXIS: case TRANSFORM_X_AXIS:
local_axis = Vector3(1, 0, 0); local_axis = Vector3(1, 0, 0);
@@ -5039,7 +5049,7 @@ void Node3DEditorViewport::update_transform(bool p_shift) {
break; break;
} }
static const float orthogonal_threshold = Math::cos(Math::deg_to_rad(87.0f)); static const float orthogonal_threshold = Math::cos(Math::deg_to_rad(85.0f));
bool axis_is_orthogonal = ABS(plane.normal.dot(global_axis)) < orthogonal_threshold; bool axis_is_orthogonal = ABS(plane.normal.dot(global_axis)) < orthogonal_threshold;
double angle = 0.0f; double angle = 0.0f;