1 #ifdef POSITIVE_PITCH_IS_DOWN
2 vector fixedvectoangles(vector a)
9 vector fixedvectoangles2(vector a, vector b)
12 ang = vectoangles2(a, b);
17 void fixedmakevectors(vector a)
19 // a makevectors that actually inverts vectoangles
26 // angles in fixedmakevectors/fixedvectoangles space
27 vector AnglesTransform_Apply(vector transform, vector v)
29 fixedmakevectors(transform);
30 return v_forward * v_x
35 vector AnglesTransform_Multiply(vector t1, vector t2)
37 vector m_forward, m_up;
38 fixedmakevectors(t2); m_forward = v_forward; m_up = v_up;
39 m_forward = AnglesTransform_Apply(t1, m_forward); m_up = AnglesTransform_Apply(t1, m_up);
40 return fixedvectoangles2(m_forward, m_up);
43 vector AnglesTransform_Invert(vector transform)
45 vector i_forward, i_up;
46 fixedmakevectors(transform);
47 // we want angles that turn v_forward into '1 0 0', v_right into '0 1 0' and v_up into '0 0 1'
48 // but these are orthogonal unit vectors!
49 // so to invert, we can simply fixedvectoangles the TRANSPOSED matrix
50 // TODO is this always -transform?
51 i_forward_x = v_forward_x;
52 i_forward_y = -v_right_x;
57 return fixedvectoangles2(i_forward, i_up);
60 vector AnglesTransform_TurnDirectionFR(vector transform)
62 // turn 180 degrees around v_up
63 // changes in-direction to out-direction
64 //fixedmakevectors(transform);
65 //return fixedvectoangles2(-1 * v_forward, 1 * v_up);
66 transform_x = -transform_x;
67 transform_y = 180 + transform_y;
68 transform_z = -transform_z;
75 vector AnglesTransform_TurnDirectionFU(vector transform)
77 // turn 180 degrees around v_up
78 // changes in-direction to out-direction
79 //fixedmakevectors(transform);
80 //return fixedvectoangles2(-1 * v_forward, 1 * v_up);
81 transform_x = -transform_x;
82 transform_y = 180 + transform_y;
83 transform_z = 180 - transform_z;
87 vector AnglesTransform_RightDivide(vector to_transform, vector from_transform)
89 return AnglesTransform_Multiply(to_transform, AnglesTransform_Invert(from_transform));
92 vector AnglesTransform_LeftDivide(vector from_transform, vector to_transform)
94 return AnglesTransform_Multiply(AnglesTransform_Invert(from_transform), to_transform);
97 vector AnglesTransform_Normalize(vector t, float minimize_roll)
100 // first, bring all angles in their range...
101 t_x = t_x - 360 * rint(t_x / 360);
102 t_y = t_y - 360 * rint(t_y / 360);
103 t_z = t_z - 360 * rint(t_z / 360);
105 need_flip = (t_z > 90 || t_z <= -90);
107 need_flip = (t_x > 90 || t_x < -90); // for pitch we prefer to allow exactly -90 degrees for looking straight down
110 if(t_x >= 0) t_x = 180 - t_x; else t_x = -180 - t_x;
111 if(t_y > 0) t_y -= 180; else t_y += 180;
112 if(t_z > 0) t_z -= 180; else t_z += 180;
117 vector AnglesTransform_CancelRoll(vector t)
119 const float epsilon = 30;
123 // forward vector (NOT SO important)
124 // right vector, up vector: screen rotation (MORE important)
125 // choose best match among all pitch-yaw only rotations
127 // FIXME find a better method
129 f = fabs(t_x - (-90)) / epsilon;
138 f = fabs(t_x - 90) / epsilon;
149 #ifdef POSITIVE_PITCH_IS_DOWN
150 vector AnglesTransform_ApplyToAngles(vector transform, vector v)
153 v = AnglesTransform_Multiply(transform, v);
157 vector AnglesTransform_ApplyToVAngles(vector transform, vector v)
159 v = AnglesTransform_Multiply(transform, v);
162 vector AnglesTransform_FromAngles(vector v)
167 vector AnglesTransform_ToAngles(vector v)
172 vector AnglesTransform_FromVAngles(vector v)
176 vector AnglesTransform_ToVAngles(vector v)
181 vector AnglesTransform_ApplyToAngles(vector transform, vector v)
183 v = AnglesTransform_Multiply(transform, v);
186 vector AnglesTransform_ApplyToVAngles(vector transform, vector v)
189 v = AnglesTransform_Multiply(transform, v);
193 vector AnglesTransform_FromAngles(vector v)
197 vector AnglesTransform_ToAngles(vector v)
201 vector AnglesTransform_FromVAngles(vector v)
206 vector AnglesTransform_ToVAngles(vector v)
213 vector AnglesTransform_Multiply_GetPostShift(vector t0, vector st0, vector t1, vector st1)
215 // we want the result of:
216 // t0 * (t1 * p + st1) + st0
217 // t0 * t1 * p + t0 * st1 + st0
218 return st0 + AnglesTransform_Apply(t0, st1);
220 vector AnglesTransform_PrePostShift_GetPostShift(vector sf, vector t, vector st)
222 return st - AnglesTransform_Apply(t, sf);