diff options
author | RĂ©mi Verschelde <rverschelde@gmail.com> | 2019-05-23 17:01:40 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-23 17:01:40 +0200 |
commit | 7c73a741f3bb1fd598b6443cb9f8d8e10fb9f36f (patch) | |
tree | ff2c90e463389ebb7d15cc0c1cc3e5c32db8a329 | |
parent | 2be57e47b3e5e3171d0ecbc20717fb03c22cbf33 (diff) | |
parent | 48e4d62554d9bd3b1f8cae9e82f21b2f7519545d (diff) |
Merge pull request #29125 from rodolforg/fix_spatial_look_at_affecting_scale
fix un-scaling in Spatial::look_at_from_position
-rw-r--r-- | scene/3d/spatial.cpp | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/scene/3d/spatial.cpp b/scene/3d/spatial.cpp index 05fd984f93..efd418e3c7 100644 --- a/scene/3d/spatial.cpp +++ b/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); } |