2
0
Эх сурвалжийг харах

Fix forward calculation in PathFollow3D for the position at the end of the curve

(cherry picked from commit e23f6a5bba79e995642610fd0e128b49414f5d9f)
Raul Santos 4 жил өмнө
parent
commit
d46d66020e
1 өөрчлөгдсөн 15 нэмэгдсэн , 3 устгасан
  1. 15 3
      scene/3d/path.cpp

+ 15 - 3
scene/3d/path.cpp

@@ -105,11 +105,18 @@ void PathFollow::_update_transform(bool p_update_xyz_rot) {
 	}
 	float bi = c->get_bake_interval();
 	float o_next = offset + bi;
+	float o_prev = offset - bi;
 
 	if (loop) {
 		o_next = Math::fposmod(o_next, bl);
-	} else if (rotation_mode == ROTATION_ORIENTED && o_next >= bl) {
-		o_next = bl;
+		o_prev = Math::fposmod(o_prev, bl);
+	} else if (rotation_mode == ROTATION_ORIENTED) {
+		if (o_next >= bl) {
+			o_next = bl;
+		}
+		if (o_prev <= 0) {
+			o_prev = 0;
+		}
 	}
 
 	Vector3 pos = c->interpolate_baked(offset, cubic);
@@ -118,7 +125,12 @@ void PathFollow::_update_transform(bool p_update_xyz_rot) {
 	// will be replaced by "Vector3(h_offset, v_offset, 0)" where it was formerly used
 
 	if (rotation_mode == ROTATION_ORIENTED) {
-		Vector3 forward = c->interpolate_baked(o_next, cubic) - pos;
+		Vector3 forward = c->interpolate_baked(o_next, cubic);
+
+		// Try with the previous position
+		if (forward.length_squared() < CMP_EPSILON2) {
+			forward = pos - c->interpolate_baked(o_prev, cubic);
+		}
 
 		if (forward.length_squared() < CMP_EPSILON2) {
 			forward = Vector3(0, 0, 1);