考慮到在應用中有好幾個坐標系統比如opengl,3dx,當然用戶也可能有自己的坐標系統
考慮如此,我覺得還是把引擎的坐標系統不要局限于特定的一個坐標系
這是我寫的引擎坐標系統如下:
1 ///////////////////////////////////////////////////////////
2 /// 頭文件包含
3 ///////////////////////////////////////////////////////////
4
5 namespace core
6 {
7
8 ////////////////////////////////////////////////////////////
9 /// 坐標軸枚舉
10 ////////////////////////////////////////////////////////////
11 enum AXIS_TYPE
12 {
13 AXIS_X = 1;
14 AXIS_Y = 1 << 2;
15 AXIS_Z = 1 << 4;
16 };
17
18 ////////////////////////////////////////////////////////////
19 /// 坐標軸方向枚舉
20 ////////////////////////////////////////////////////////////
21 enum AXIS_DIRECTION
22 {
23 AXIS_DIRECTION_UP = 1,
24 AXIS_DIRECTION_DOWN = -1
25 };
26
27 ////////////////////////////////////////////////////////////
28 /// 定義引擎坐標系統
29 ////////////////////////////////////////////////////////////
30 ////////////////////////////////////////////////////////////
31 /// 引擎的坐標系統定義如下:
32 /// 以指向屏幕右方的坐標軸為第一坐標軸(1)
33 /// 以指向屏幕下方的坐標軸為第二坐標軸(2)
34 /// 以垂直屏幕向外的坐標系統為第三坐標軸(3)
35 /// 以方向相反的坐標軸其方向為負(-1)
36 ////////////////////////////////////////////////////////////
37 struct CoordinateSystem
38 {
39 CoordinateSystem()
40 {
41 type[0] = AXIS_X;
42 type[1] = AXIS_Y;
43 type[2] = AXIS_Z;
44 dir[0] = dir[1] = dir[2] = AXIS_DIRECTION_UP
45 }
46
47 CoordinateSystem(AXIS_TYPE type1, AXIS_DIRECTION dir1,
48 AXIS_TYPE type2, AXIS_DIRECTION dir2,
49 AXIS_TYPE type3, AXIS_DIRECTION dir3)
50 {
51 //! 必須保證參數坐標軸的合法性
52 ASSERT(type1 + type2 + type3 == 13);
53
54 type[0] = type1;
55 type[1] = type2;
56 type[2] = type3;
57 dir[0] = dir1;
58 dir[1] = dir2;
59 dir[2] = dir3;
60 }
61
62 AXIS_TYPE type[3];
63 AXIS_DIRECTION dir[3];
64 };
65
66 }
67
68 #define COORDINATE_ENGINE core::CoordinateSystem(AXIS_X,1,AXIS_Y, 1,AXIS_Z, 1)
69 #define COORDINATE_OPENGL core::CoordinateSystem(AXIS_X,1,AXIS_Y,-1,AXIS_Z, 1)
70 #define COORDINATE_3DMAX core::CoordinateSystem(AXIS_X,1,AXIS_Z,-1,AXIS_Y,-1)
首先給坐標系統排一個次序,然后定義正向的坐標軸方向,然后就可以抽象出萬能的直角坐標系統了
當然為了方便起見這里給定了3個常見的坐標系統分別為引擎坐標系,OPENGL坐標系統和3dmax坐標系統