📄 eulerangles.h
字号:
/* from http://www1.acm.org/pubs/tog/GraphicsGems/index.html This is the official on-line repository for the code from the Graphics Gems series of books (from Academic Press). This series focusses on short to medium length pieces of code which perform a wide variety of computer graphics related tasks. All code here can be used without restrictions. The code distributions here contain all known bug fixes and enhancements. We also provide errata listings for the text of each book. Please report any new errata or bugs to Eric Haines (erich@acm.org). http://www1.acm.org/pubs/tog/GraphicsGems/gemsiv/euler_angle/*//**** EulerAngles.h - Support for 24 angle schemes ****//* Ken Shoemake, 1993 */#ifndef _H_EulerAngles#define _H_EulerAngles#include "QuatTypes.h"/*** Order type constants, constructors, extractors ***/ /* There are 24 possible conventions, designated by: */ /* o EulAxI = axis used initially */ /* o EulPar = parity of axis permutation */ /* o EulRep = repetition of initial axis as last */ /* o EulFrm = frame from which axes are taken */ /* Axes I,J,K will be a permutation of X,Y,Z. */ /* Axis H will be either I or K, depending on EulRep. */ /* Frame S takes axes from initial static frame. */ /* If ord = (AxI=X, Par=Even, Rep=No, Frm=S), then */ /* {a,b,c,ord} means Rz(c)Ry(b)Rx(a), where Rz(c)v */ /* rotates v around Z by c radians. */#define EulFrmS 0#define EulFrmR 1#define EulFrm(ord) ((unsigned)(ord)&1)#define EulRepNo 0#define EulRepYes 1#define EulRep(ord) (((unsigned)(ord)>>1)&1)#define EulParEven 0#define EulParOdd 1#define EulPar(ord) (((unsigned)(ord)>>2)&1)#define EulSafe "\000\001\002\000"#define EulNext "\001\002\000\001"#define EulAxI(ord) ((int)(EulSafe[(((unsigned)(ord)>>3)&3)]))#define EulAxJ(ord) ((int)(EulNext[EulAxI(ord)+(EulPar(ord)==EulParOdd)]))#define EulAxK(ord) ((int)(EulNext[EulAxI(ord)+(EulPar(ord)!=EulParOdd)]))#define EulAxH(ord) ((EulRep(ord)==EulRepNo)?EulAxK(ord):EulAxI(ord)) /* EulGetOrd unpacks all useful information about order simultaneously. */#define EulGetOrd(ord,i,j,k,h,n,s,f) {unsigned o=ord;f=o&1;o>>=1;s=o&1;o>>=1;\ n=o&1;o>>=1;i=EulSafe[o&3];j=EulNext[i+n];k=EulNext[i+1-n];h=s?k:i;} /* EulOrd creates an order value between 0 and 23 from 4-tuple choices. */#define EulOrd(i,p,r,f) (((((((i)<<1)+(p))<<1)+(r))<<1)+(f)) /* Static axes */#define EulOrdXYZs EulOrd(X,EulParEven,EulRepNo,EulFrmS)#define EulOrdXYXs EulOrd(X,EulParEven,EulRepYes,EulFrmS)#define EulOrdXZYs EulOrd(X,EulParOdd,EulRepNo,EulFrmS)#define EulOrdXZXs EulOrd(X,EulParOdd,EulRepYes,EulFrmS)#define EulOrdYZXs EulOrd(Y,EulParEven,EulRepNo,EulFrmS)#define EulOrdYZYs EulOrd(Y,EulParEven,EulRepYes,EulFrmS)#define EulOrdYXZs EulOrd(Y,EulParOdd,EulRepNo,EulFrmS)#define EulOrdYXYs EulOrd(Y,EulParOdd,EulRepYes,EulFrmS)#define EulOrdZXYs EulOrd(Z,EulParEven,EulRepNo,EulFrmS)#define EulOrdZXZs EulOrd(Z,EulParEven,EulRepYes,EulFrmS)#define EulOrdZYXs EulOrd(Z,EulParOdd,EulRepNo,EulFrmS)#define EulOrdZYZs EulOrd(Z,EulParOdd,EulRepYes,EulFrmS) /* Rotating axes */#define EulOrdZYXr EulOrd(X,EulParEven,EulRepNo,EulFrmR)#define EulOrdXYXr EulOrd(X,EulParEven,EulRepYes,EulFrmR)#define EulOrdYZXr EulOrd(X,EulParOdd,EulRepNo,EulFrmR)#define EulOrdXZXr EulOrd(X,EulParOdd,EulRepYes,EulFrmR)#define EulOrdXZYr EulOrd(Y,EulParEven,EulRepNo,EulFrmR)#define EulOrdYZYr EulOrd(Y,EulParEven,EulRepYes,EulFrmR)#define EulOrdZXYr EulOrd(Y,EulParOdd,EulRepNo,EulFrmR)#define EulOrdYXYr EulOrd(Y,EulParOdd,EulRepYes,EulFrmR)#define EulOrdYXZr EulOrd(Z,EulParEven,EulRepNo,EulFrmR)#define EulOrdZXZr EulOrd(Z,EulParEven,EulRepYes,EulFrmR)#define EulOrdXYZr EulOrd(Z,EulParOdd,EulRepNo,EulFrmR)#define EulOrdZYZr EulOrd(Z,EulParOdd,EulRepYes,EulFrmR)EulerAngles Eul_(float ai, float aj, float ah, int order);Quat Eul_ToQuat(EulerAngles ea);void Eul_ToHMatrix(EulerAngles ea, HMatrix M);EulerAngles Eul_FromHMatrix(HMatrix M, int order);EulerAngles Eul_FromQuat(Quat q, int order);#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -