ソースを参照

Merge pull request #29125 from rodolforg/fix_spatial_look_at_affecting_scale

fix un-scaling in Spatial::look_at_from_position
Rémi Verschelde 6 年 前
コミット
7c73a741f3
1 ファイル変更12 行追加11 行削除
  1. 12 11
      scene/3d/spatial.cpp

+ 12 - 11
scene/3d/spatial.cpp

@@ -676,28 +676,29 @@ void Spatial::set_identity() {
 
 void Spatial::look_at(const Vector3 &p_target, const Vector3 &p_up) {
 
-	Transform lookat(get_global_transform());
-	if (lookat.origin == p_target) {
+	Vector3 origin(get_global_transform().origin);
+	look_at_from_position(origin, p_target, p_up);
+}
+
+void Spatial::look_at_from_position(const Vector3 &p_pos, const Vector3 &p_target, const Vector3 &p_up) {
+
+	if (p_pos == p_target) {
 		ERR_EXPLAIN("Node origin and target are in the same position, look_at() failed");
 		ERR_FAIL();
 	}
 
-	if (p_up.cross(p_target - lookat.origin) == Vector3()) {
+	if (p_up.cross(p_target - p_pos) == Vector3()) {
 		ERR_EXPLAIN("Up vector and direction between node origin and target are aligned, look_at() failed");
 		ERR_FAIL();
 	}
-	Vector3 original_scale(lookat.basis.get_scale());
-	lookat = lookat.looking_at(p_target, p_up);
-	// as basis was normalized, we just need to apply original scale back
-	lookat.basis.scale(original_scale);
-	set_global_transform(lookat);
-}
-
-void Spatial::look_at_from_position(const Vector3 &p_pos, const Vector3 &p_target, const Vector3 &p_up) {
 
 	Transform lookat;
 	lookat.origin = p_pos;
+
+	Vector3 original_scale(get_global_transform().basis.get_scale());
 	lookat = lookat.looking_at(p_target, p_up);
+	// as basis was normalized, we just need to apply original scale back
+	lookat.basis.scale(original_scale);
 	set_global_transform(lookat);
 }