1 <H4> Update Time 02/03/13---05:40:40 </H4>
4 <H2>Information from source codes</H2>
7 ../src/matrix3DEulerAngleGet.c:
9 ../src/matrix3DEulerAngleSet.c:
11 ../src/matrix3DEulerAngles.c:
13 ../src/matrix3DFile.c:
15 ../src/matrix3DInit.c:
17 ../src/matrix3DMultiply.c:
19 ../src/matrix3DMultiplyVector.c:
21 ../src/matrix3DRotation.c:
23 ../src/matrix3DTranslation.c:
25 ../src/matrix3DUtil.c:
36 # The latest update : 10/01/97 at 02:34:25
38 #@(#) Matrix3D.h ver 1.13
41 #@(#) Usage : Matrix3D.h
46 #define MATRIX_3D_WIDTH 4
47 #define MATRIX_3D_HEIGHT 4
49 #define MATRIX_3D_MODE_NOT_INITIALIZE 0
50 #define MATRIX_3D_MODE_INITIALIZE 1
52 #define MATRIX_3D_NEGLECT_VALUE 1e-6
57 typedef float matrix3DParaTypeReal;
58 typedef matrix3DParaTypeReal Matrix3D[MATRIX_3D_WIDTH][MATRIX_3D_HEIGHT];
60 typedef char matrix3DEulerAngleMode;
65 Matrix3D: Attention Arrays Order
67 [0][0] [1][0] [2][0] [3][0]
68 [0][1] [1][1] [2][1] [3][1]
69 [0][2] [1][2] [2][2] [3][2]
70 [0][3] [1][3] [2][3] [3][3]
82 extern void matrix3DInit(Matrix3D Matrix);
85 extern void matrix3DCopy(Matrix3D dst, Matrix3D src);
86 extern void matrix3DInverse(Matrix3D mat);
88 extern void matrix3DMultiply(Matrix3D A, Matrix3D B); /* A = A*B */
89 extern void matrix3DMultiplyInv(Matrix3D A, Matrix3D B); /* B = A*B */
91 extern void matrix3DMultiplyVector(floatVector* v, Matrix3D A);
93 extern void matrix3DFileFormat(FILE* fpt);
94 extern void matrix3DFileRead(FILE* fpt, Matrix3D Matrix);
95 extern void matrix3DFileWrite(FILE* fpt, Matrix3D Matrix);
98 extern void matrix3DRotationSet(Matrix3D Matrix, char mode, matrix3DParaTypeReal rot, long Mode);
99 extern void matrix3DTranslationSet(Matrix3D Matrix, matrix3DParaTypeReal rotx, matrix3DParaTypeReal roty, matrix3DParaTypeReal rotz, long mode);
100 extern void matrix3DRotationSetXYZ(Matrix3D Matrix, matrix3DParaTypeReal rotx, matrix3DParaTypeReal roty, matrix3DParaTypeReal rotz, long mode);
101 extern void matrix3DRotationSetZYX(Matrix3D Matrix, matrix3DParaTypeReal rotx, matrix3DParaTypeReal roty, matrix3DParaTypeReal rotz, long mode);
102 extern void matrix3DRotationSetZXY(Matrix3D Matrix, matrix3DParaTypeReal rotx, matrix3DParaTypeReal roty, matrix3DParaTypeReal rotz, long mode);
103 extern void matrix3DRotationSetYXZ(Matrix3D Matrix, matrix3DParaTypeReal rotx, matrix3DParaTypeReal roty, matrix3DParaTypeReal rotz, long mode);
108 extern void matrix3DRotationSetFollowingEulerAngle(Matrix3D Matrix, const char Mode[4], matrix3DParaTypeReal rot1, matrix3DParaTypeReal rot2, matrix3DParaTypeReal rot3, long mode);
109 extern void matrix3DRotationAntiSetFollowingEulerAngle(Matrix3D Matrix, const char Mode[4], matrix3DParaTypeReal rot1, matrix3DParaTypeReal rot2, matrix3DParaTypeReal rot3, long mode);
110 extern void matrix3DEulerAngleGetFromMatrix3D(Matrix3D Matrix, const char Mode[4], matrix3DParaTypeReal* rot1, matrix3DParaTypeReal* rot2, matrix3DParaTypeReal* rot3, long mode);
119 /*** Definitions ***/
121 typedef struct {float x, y, z, w;} Quat; /* Quaternion */
122 typedef matrix3DParaTypeReal HMatrix3D[4][4];
123 typedef Quat EulerAngles; /* (x,y,z)=ang 1,2,3, w=order code */
126 enum QuatPart {X, Y, Z, W};
129 /* by Ken Shoemake, 1993 */
130 /*** Order type constants, constructors, extractors ***/
131 /* There are 24 possible conventions, designated by: */
132 /* o EulAxI = axis used initially : 3 */
133 /* o EulPar = parity of axis permutation : 2 */
134 /* o EulRep = repetition of initial axis as last : 2 */
135 /* o EulFrm = frame from which axes are taken : 2 */
136 /* Axes I,J,K will be a permutation of X,Y,Z. */
137 /* Axis H will be either I or K, depending on EulRep. */
138 /* Frame S takes axes from initial static frame. */
139 /* If ord = (AxI=X, Par=Even, Rep=No, Frm=S), then */
140 /* {a,b,c,ord} means Rz(c)Ry(b)Rx(a), where Rz(c)v */
141 /* rotates v around Z by c radians. */
146 #define EulFrm(ord) ((unsigned)(ord)&1)
149 #define EulRep(ord) (((unsigned)(ord)>>1)&1)
152 #define EulPar(ord) (((unsigned)(ord)>>2)&1)
153 #define EulSafe "\000\001\002\000"
154 #define EulNext "\001\002\000\001"
157 /* prototype begin */
158 #define EulAxI(ord) ((int)(EulSafe[(((unsigned)(ord)>>3)&3)]))
159 #define EulAxJ(ord) ((int)(EulNext[EulAxI(ord)+(EulPar(ord)==EulParOdd)]))
160 #define EulAxK(ord) ((int)(EulNext[EulAxI(ord)+(EulPar(ord)!=EulParOdd)]))
161 #define EulAxH(ord) ((EulRep(ord)==EulRepNo)?EulAxK(ord):EulAxI(ord))
162 /* EulGetOrd unpacks all useful information about order simultaneously. */
163 #define EulGetOrd(ord,i,j,k,h,n,s,f) {unsigned o=ord;f=o&1;o>>=1;s=o&1;o>>=1;\
164 n=o&1;o>>=1;i=EulSafe[o&3];j=EulNext[i+n];k=EulNext[i+1-n];h=s?k:i;}
165 /* EulOrd creates an order value between 0 and 23 from 4-tuple choices. */
166 #define EulOrd(i,p,r,f) (((((((i)<<1)+(p))<<1)+(r))<<1)+(f))
168 #define EulOrdXYZs EulOrd(X,EulParEven,EulRepNo,EulFrmS)
169 #define EulOrdXYXs EulOrd(X,EulParEven,EulRepYes,EulFrmS)
170 #define EulOrdXZYs EulOrd(X,EulParOdd,EulRepNo,EulFrmS)
171 #define EulOrdXZXs EulOrd(X,EulParOdd,EulRepYes,EulFrmS)
172 #define EulOrdYZXs EulOrd(Y,EulParEven,EulRepNo,EulFrmS)
173 #define EulOrdYZYs EulOrd(Y,EulParEven,EulRepYes,EulFrmS)
174 #define EulOrdYXZs EulOrd(Y,EulParOdd,EulRepNo,EulFrmS)
175 #define EulOrdYXYs EulOrd(Y,EulParOdd,EulRepYes,EulFrmS)
176 #define EulOrdZXYs EulOrd(Z,EulParEven,EulRepNo,EulFrmS)
177 #define EulOrdZXZs EulOrd(Z,EulParEven,EulRepYes,EulFrmS)
178 #define EulOrdZYXs EulOrd(Z,EulParOdd,EulRepNo,EulFrmS)
179 #define EulOrdZYZs EulOrd(Z,EulParOdd,EulRepYes,EulFrmS)
181 #define EulOrdZYXr EulOrd(X,EulParEven,EulRepNo,EulFrmR)
182 #define EulOrdXYXr EulOrd(X,EulParEven,EulRepYes,EulFrmR)
183 #define EulOrdYZXr EulOrd(X,EulParOdd,EulRepNo,EulFrmR)
184 #define EulOrdXZXr EulOrd(X,EulParOdd,EulRepYes,EulFrmR)
185 #define EulOrdXZYr EulOrd(Y,EulParEven,EulRepNo,EulFrmR)
186 #define EulOrdYZYr EulOrd(Y,EulParEven,EulRepYes,EulFrmR)
187 #define EulOrdZXYr EulOrd(Y,EulParOdd,EulRepNo,EulFrmR)
188 #define EulOrdYXYr EulOrd(Y,EulParOdd,EulRepYes,EulFrmR)
189 #define EulOrdYXZr EulOrd(Z,EulParEven,EulRepNo,EulFrmR)
190 #define EulOrdZXZr EulOrd(Z,EulParEven,EulRepYes,EulFrmR)
191 #define EulOrdXYZr EulOrd(Z,EulParOdd,EulRepNo,EulFrmR)
192 #define EulOrdZYZr EulOrd(Z,EulParOdd,EulRepYes,EulFrmR)
194 EulerAngles Eul_(float ai, float aj, float ah, int order);
195 Quat Eul_ToQuat(EulerAngles ea);
196 void Eul_ToHMatrix(EulerAngles ea, HMatrix3D M);
197 EulerAngles Eul_FromHMatrix(HMatrix3D M, int order);
198 EulerAngles Eul_FromQuat(Quat q, int order);
201 #endif /* MATRIX_3D_H */