06-世界座標系的原點為什麼是左下角而不是螢幕中心
OpenGL 預設的座標原點是螢幕的正中心,而cocos2dx是如何將螢幕的左下角作為原點的呢?
猜測是設定了攝像機
結果猜測對了!
1.AppController.mm didFinishLaunchingWithOptions
2.Director.cpp setOpenGLView
3. Director::setGLDefaultValues
4. void Director::setProjection(Projection projection) 所有的一切都在這裡面了
需要說明的是 引數 projection是 Projection::_3D 而不是想象中的 Projection::_2D 所以最終執行的程式碼
而最終決定顯示的座標原點在左下角的原因是
在這裡攝像機的位置在
因為攝像機的位置在頸託螢幕正中心的Z軸上,而因為攝像機的目標點和投影的結合,決定了如圖所示的視錐體結構,這樣就保證了我們看到的一切都在螢幕上嘍
而因為2D遊戲的攝像機基本是不變的,所以此處提前 投影矩陣 * 攝像機矩陣,並將結果儲存在了Director的
_projectionMatrixStack 中,
這樣後續使用該矩陣 * 模型本身的矩陣(世界座標系決定了位置,Model中的各個點需要渲染,就需要將各個點轉變為世界座標,而各個點基本都是相對於Model自己原點的座標),再緊跟 * Model中的各個點,就可以方便的計算出來需要渲染的點的位置了,也就是完成了流程
model點 -> 經過模型矩陣 -> 轉變為世界座標系的點 -> 攝像機矩陣 -> 轉變為了可見的視錐體內部可見要素 -> 投影矩陣 -> 將3D的內容渲染到2D的平面上了。
而最後兩步操作 攝像機和投影矩陣的轉變,在這裡直接進行了合併,也就是說我們在使用的過程中,只需要掌控好模型自己在世界座標系的相對關係就可以了(模型矩陣)。