The point P (actor "dummy") moving along the path should be oriented on a tangent relative to the curve. The simple code variant calculates the derivatives dx, dy, dz of each Bezier patch and then uses "arcustangent" functions to derive two rotation angles "alpha" and "beta". The atan() function is the continued fraction shown in the picture which approximates the function result. Angle "alpha" is the rotation angle of the object about the z-axis of the curve space (pitch orientation). Angle "beta" is the rotation angle of the object about the y-axis of curve space (yaw orientation). The ERC code of the atan() function for angle "alpha" is listed below. All names are internal channel names. Each equation means a channel. The right side of the equations are the valueOp operators. Numeric values mean dial values or deltaAddDeltas. The left side of an equation is the name of the embedding slave channel. // lines are comments: // atan(tanalpha) // dy_var and dx_var are derivatives of the curve tanalpha = dy_var / dx_var xz_atan_mult = tanalpha xz_atan_sqr = tanalpha * xz_atan_mult xz_addat_1 = 21 + (xz_atan_sqr * 1.21) xz_atan_1 = 100 * xz_atan_sqr / xz_addat_1 xz_addat_2 = 19 + xz_atan_1 xz_atan_2 = 81 * xz_atan_sqr / xz_addat_2 xz_addat_3 = 17 + xz_atan_2 xz_atan_3 = 64 * xz_atan_sqr / xz_addat_3 xz_addat_4 = 15 + xz_atan_3 xz_atan_4 = 49 * xz_atan_sqr / xz_addat_4 xz_addat_5 = 13 + xz_atan_4 xz_atan_5 = 36 * xz_atan_sqr / xz_addat_5 xz_addat_6 = 11 + xz_atan_5 xz_atan_6 = 25 * xz_atan_sqr / xz_addat_6 xz_addat_7 = 9 + xz_atan_6 xz_atan_7 = 16 * xz_atan_sqr / xz_addat_7 xz_addat_8 = 7 + xz_atan_7 xz_atan_8 = 9 * xz_atan_sqr / xz_addat_8 xz_addat_9 = 5 + xz_atan_8 xz_atan_9 = 9 * xz_atan_sqr / xz_addat_9 xz_addat_10 = 3 + xz_atan_9 xz_atan_10 = xz_atan_sqr / xz_addat_10 xz_addat_11 = 1 + xz_atan_10 atan_alpha = tanalpha / xz_addat_11 // atan_alpha is angle alpha in radians deg_alpha = 57.29577 * atan_alpha // Convert to degrees