考虑到在应用中有好几个坐标系统比如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坐标系统