06-世界坐标系的原点为什么是左下角而不是屏幕中心

OpenGL 默认的坐标原点是屏幕的正中心,而cocos2dx是如何将屏幕的左下角作为原点的呢?

猜测是设置了摄像机

结果猜测对了!

1.AppController.mm  didFinishLaunchingWithOptions

Image(5)

2.Director.cpp  setOpenGLView

Image(6)

3. Director::setGLDefaultValues

Image(7)

4. void Director::setProjection(Projection projection) 所有的一切都在这里面了

需要说明的是 参数 projection是 Projection::_3D  而不是想象中的 Projection::_2D  所以最终执行的代码

06-世界坐标系的原点为什么是左下角而不是屏幕中心_第1张图片

而最终决定显示的坐标原点在左下角的原因是

Image(9)

在这里摄像机的位置在

06-世界坐标系的原点为什么是左下角而不是屏幕中心_第2张图片

因为摄像机的位置在颈托屏幕正中心的Z轴上,而因为摄像机的目标点和投影的结合,决定了如图所示的视锥体结构,这样就保证了我们看到的一切都在屏幕上喽

而因为2D游戏的摄像机基本是不变的,所以此处提前 投影矩阵 * 摄像机矩阵,并将结果保存在了Director的

_projectionMatrixStack   中,

这样后续使用该矩阵 * 模型本身的矩阵(世界坐标系决定了位置,Model中的各个点需要渲染,就需要将各个点转变为世界坐标,而各个点基本都是相对于Model自己原点的坐标),再紧跟 * Model中的各个点,就可以方便的计算出来需要渲染的点的位置了,也就是完成了流程

model点 ->  经过模型矩阵 -> 转变为世界坐标系的点 -> 摄像机矩阵 -> 转变为了可见的视锥体内部可见要素 -> 投影矩阵 -> 将3D的内容渲染到2D的平面上了。

而最后两步操作 摄像机和投影矩阵的转变,在这里直接进行了合并,也就是说我们在使用的过程中,只需要掌控好模型自己在世界坐标系的相对关系就可以了(模型矩阵)。

你可能感兴趣的:(05游戏-cocos2dx源码)