3 <H2>Information from source codes</H2>
6 ../src/matrix3DEulerAngleGet.c:
8 ../src/matrix3DEulerAngleSet.c:
10 ../src/matrix3DEulerAngles.c:
12 ../src/matrix3DFile.c:
14 ../src/matrix3DInit.c:
16 ../src/matrix3DMultiply.c:
18 ../src/matrix3DMultiplyMatrix.c:
20 ../src/matrix3DMultiplyVector.c:
22 ../src/matrix3DRotation.c:
24 ../src/matrix3DTranslation.c:
26 ../src/matrix3DUtil.c:
37 # The latest update : 10/01/97 at 02:34:25
39 #@(#) Matrix3D.h ver 1.13
42 #@(#) Usage : Matrix3D.h
47 #define MATRIX_3D_WIDTH 4
48 #define MATRIX_3D_HEIGHT 4
50 #define MATRIX_3D_MODE_NOT_INITIALIZE 0
51 #define MATRIX_3D_MODE_INITIALIZE 1
53 #define MATRIX_3D_NEGLECT_VALUE 1e-6
58 typedef float matrix3DParaTypeReal;
59 typedef matrix3DParaTypeReal Matrix3D[MATRIX_3D_WIDTH][MATRIX_3D_HEIGHT];
61 typedef char matrix3DEulerAngleMode;
63 typedef struct EulerAngleInfo {
73 Matrix3D: Attention Arrays Order
75 [0][0] [1][0] [2][0] [3][0]
76 [0][1] [1][1] [2][1] [3][1]
77 [0][2] [1][2] [2][2] [3][2]
78 [0][3] [1][3] [2][3] [3][3]
90 extern void matrix3DInit(Matrix3D Matrix);
94 extern void matrix3DFromRotationMatrix(Matrix3D dst, Array a);
95 extern void matrix3DInverse(Matrix3D mat);
97 extern void matrix3DMultiply(Matrix3D A, Matrix3D B); /* A = A*B */
98 extern void matrix3DMultiplyInv(Matrix3D A, Matrix3D B); /* B = A*B */
100 extern void matrix3DMultiplyVector(floatVector* v, Matrix3D A);
101 extern void matrix3DMultiplyVectors(floatVector* vs, int n, Matrix3D A);
103 extern void matrix3DFileFormat(FILE* fpt);
104 extern void matrix3DFileRead(FILE* fpt, Matrix3D Matrix);
105 extern void matrix3DFileWrite(FILE* fpt, Matrix3D Matrix);
108 extern void matrix3DRotationSet(Matrix3D Matrix, char mode, matrix3DParaTypeReal rot, long Mode);
109 extern void matrix3DTranslationSet(Matrix3D Matrix, matrix3DParaTypeReal rotx, matrix3DParaTypeReal roty, matrix3DParaTypeReal rotz, long mode);
110 extern void matrix3DRotationSetXYZ(Matrix3D Matrix, matrix3DParaTypeReal rotx, matrix3DParaTypeReal roty, matrix3DParaTypeReal rotz, long mode);
111 extern void matrix3DRotationSetZYX(Matrix3D Matrix, matrix3DParaTypeReal rotx, matrix3DParaTypeReal roty, matrix3DParaTypeReal rotz, long mode);
112 extern void matrix3DRotationSetZXY(Matrix3D Matrix, matrix3DParaTypeReal rotx, matrix3DParaTypeReal roty, matrix3DParaTypeReal rotz, long mode);
113 extern void matrix3DRotationSetYXZ(Matrix3D Matrix, matrix3DParaTypeReal rotx, matrix3DParaTypeReal roty, matrix3DParaTypeReal rotz, long mode);
118 extern void matrix3DRotationSetFollowingEulerAngle(Matrix3D Matrix, const char Mode[4], matrix3DParaTypeReal rot1, matrix3DParaTypeReal rot2, matrix3DParaTypeReal rot3, long mode);
119 extern void matrix3DRotationAntiSetFollowingEulerAngle(Matrix3D Matrix, const char Mode[4], matrix3DParaTypeReal rot1, matrix3DParaTypeReal rot2, matrix3DParaTypeReal rot3, long mode);
120 extern void matrix3DEulerAngleGetFromMatrix3D(Matrix3D Matrix, const char Mode[4], matrix3DParaTypeReal* rot1, matrix3DParaTypeReal* rot2, matrix3DParaTypeReal* rot3, long mode);
129 /*** Definitions ***/
131 typedef struct {float x, y, z, w;} Quat; /* Quaternion */
132 typedef matrix3DParaTypeReal HMatrix3D[4][4];
133 typedef Quat EulerAngles; /* (x,y,z)=ang 1,2,3, w=order code */
136 enum QuatPart {X, Y, Z, W};
139 /* by Ken Shoemake, 1993 */
140 /*** Order type constants, constructors, extractors ***/
141 /* There are 24 possible conventions, designated by: */
142 /* o EulAxI = axis used initially : 3 */
143 /* o EulPar = parity of axis permutation : 2 */
144 /* o EulRep = repetition of initial axis as last : 2 */
145 /* o EulFrm = frame from which axes are taken : 2 */
146 /* Axes I,J,K will be a permutation of X,Y,Z. */
147 /* Axis H will be either I or K, depending on EulRep. */
148 /* Frame S takes axes from initial static frame. */
149 /* If ord = (AxI=X, Par=Even, Rep=No, Frm=S), then */
150 /* {a,b,c,ord} means Rz(c)Ry(b)Rx(a), where Rz(c)v */
151 /* rotates v around Z by c radians. */
156 #define EulFrm(ord) ((unsigned)(ord)&1)
159 #define EulRep(ord) (((unsigned)(ord)>>1)&1)
162 #define EulPar(ord) (((unsigned)(ord)>>2)&1)
163 #define EulSafe "\000\001\002\000"
164 #define EulNext "\001\002\000\001"
167 /* prototype begin */
168 #define EulAxI(ord) ((int)(EulSafe[(((unsigned)(ord)>>3)&3)]))
169 #define EulAxJ(ord) ((int)(EulNext[EulAxI(ord)+(EulPar(ord)==EulParOdd)]))
170 #define EulAxK(ord) ((int)(EulNext[EulAxI(ord)+(EulPar(ord)!=EulParOdd)]))
171 #define EulAxH(ord) ((EulRep(ord)==EulRepNo)?EulAxK(ord):EulAxI(ord))
172 /* EulGetOrd unpacks all useful information about order simultaneously. */
173 #define EulGetOrd(ord,i,j,k,h,n,s,f) {unsigned o=ord;f=o&1;o>>=1;s=o&1;o>>=1;\
174 n=o&1;o>>=1;i=EulSafe[o&3];j=EulNext[i+n];k=EulNext[i+1-n];h=s?k:i;}
175 /* EulOrd creates an order value between 0 and 23 from 4-tuple choices. */
176 #define EulOrd(i,p,r,f) (((((((i)<<1)+(p))<<1)+(r))<<1)+(f))
178 #define EulOrdXYZs EulOrd(X,EulParEven,EulRepNo,EulFrmS)
179 #define EulOrdXYXs EulOrd(X,EulParEven,EulRepYes,EulFrmS)
180 #define EulOrdXZYs EulOrd(X,EulParOdd,EulRepNo,EulFrmS)
181 #define EulOrdXZXs EulOrd(X,EulParOdd,EulRepYes,EulFrmS)
182 #define EulOrdYZXs EulOrd(Y,EulParEven,EulRepNo,EulFrmS)
183 #define EulOrdYZYs EulOrd(Y,EulParEven,EulRepYes,EulFrmS)
184 #define EulOrdYXZs EulOrd(Y,EulParOdd,EulRepNo,EulFrmS)
185 #define EulOrdYXYs EulOrd(Y,EulParOdd,EulRepYes,EulFrmS)
186 #define EulOrdZXYs EulOrd(Z,EulParEven,EulRepNo,EulFrmS)
187 #define EulOrdZXZs EulOrd(Z,EulParEven,EulRepYes,EulFrmS)
188 #define EulOrdZYXs EulOrd(Z,EulParOdd,EulRepNo,EulFrmS)
189 #define EulOrdZYZs EulOrd(Z,EulParOdd,EulRepYes,EulFrmS)
191 #define EulOrdZYXr EulOrd(X,EulParEven,EulRepNo,EulFrmR)
192 #define EulOrdXYXr EulOrd(X,EulParEven,EulRepYes,EulFrmR)
193 #define EulOrdYZXr EulOrd(X,EulParOdd,EulRepNo,EulFrmR)
194 #define EulOrdXZXr EulOrd(X,EulParOdd,EulRepYes,EulFrmR)
195 #define EulOrdXZYr EulOrd(Y,EulParEven,EulRepNo,EulFrmR)
196 #define EulOrdYZYr EulOrd(Y,EulParEven,EulRepYes,EulFrmR)
197 #define EulOrdZXYr EulOrd(Y,EulParOdd,EulRepNo,EulFrmR)
198 #define EulOrdYXYr EulOrd(Y,EulParOdd,EulRepYes,EulFrmR)
199 #define EulOrdYXZr EulOrd(Z,EulParEven,EulRepNo,EulFrmR)
200 #define EulOrdZXZr EulOrd(Z,EulParEven,EulRepYes,EulFrmR)
201 #define EulOrdXYZr EulOrd(Z,EulParOdd,EulRepNo,EulFrmR)
202 #define EulOrdZYZr EulOrd(Z,EulParOdd,EulRepYes,EulFrmR)
204 EulerAngles Eul_(float ai, float aj, float ah, int order);
205 Quat Eul_ToQuat(EulerAngles ea);
206 void Eul_ToHMatrix(EulerAngles ea, HMatrix3D M);
207 EulerAngles Eul_FromHMatrix(HMatrix3D M, int order);
208 EulerAngles Eul_FromQuat(Quat q, int order);
211 #endif /* MATRIX_3D_H */