float vertices[] = {

// positions // colors 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // bottom right

-0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // bottom left

0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, // top 0.4f, -0.6f, 0.5f, 1.0f, 0.0f, 0.0f, // bottom right -0.6f, -0.6f, 0.5f, 0.0f, 1.0f, 0.0f, // bottom left

-0.1f, 0.4f, 0.5f, 0.0f, 0.0f, 1.0f // top

};

用哪個都可以

可以參考這裡NDC後進行窗口坐標映射,窗口坐標的z值範圍由glDepthRange()設置

可以這樣認為只有最後的窗口坐標系是真實存在的,然後反推其它坐標系,通過設置想使用哪一個使用哪一個

也就是NDC是虛構的,NDC到窗口的映射是可以通過設置修改的。只有窗口坐標系是真實存在的,想使用什麼坐標系從窗口坐標系反推回去,然後設置參數即可。

The default GL clip volume definition is for a origin of GL_LOWER_LEFT and a depth of GL_NEGATIVE_ONE_TO_ONE.

An origin of GL_UPPER_LEFT and a depth of GL_ZERO_TO_ONE corresponds to Direct3Ds clip volume definition.

An origin of GL_UPPER_LEFT and a depth of GL_NEGATIVE_ONE_TO_ONE corresponds to the upper-left origin of the window coordinate system of Microsoft Windows and the X Window System.

UPPER_LEFT和LOWER_LEFT是指窗口坐標原點位置,有了窗口坐標,也就是有了窗口坐標系,直接反推就好。

http://www.songho.ca/opengl/gl_transform.html


這個問題其實跟左手系和右手系無關。

首先,opengl之所以是「右手坐標系」,是針對模型空間,視圖空間來說的,XYZ軸遵循右手坐標系定則;

其次,關於NDC(歸一化設備空間)空間,其本來意義是,若一個向量經過mvp矩陣轉化,併除以第四個分量w後,若它的XYZ分量均處於[-1,+1]之間,那麼它屬於NDC空間內,進一步說明它是在視椎體內;

我想導致NDC左,右手之分的關鍵在於NDC坐標系的Z分量,這個值代表的是深度值,若沒改變參數的情況下,opengl默認在NDC坐標系下,-1是在近裁剪面處,+1是在遠裁剪面處,那麼想像一下,近處值小,遠處值大,Z軸是朝向屏幕裡面的,就解釋了為什麼NDC是左手系的原因。

個人覺得沒必要追究NDC是左手還是右手,弄清它實際所表達的意義就行了。


我記得 OpenGL 明明是右手坐標系,Direct3D 是 左手坐標系。

下面link裏有具體解釋供參考:

Is OpenGL coordinate system left-handed or right-handed??

stackoverflow.com圖標

這上面說 OpenGL 到了 window space 就突然變成了 左手坐標系 。。。


NDC的z取值是小到大(從屏幕向裏方向),所以是左手坐標系。而opengl的modelview坐標系是標準的右手系,x和y與NDC一樣朝向,Z是從大到小(從屏幕向裏方向)。


opengl的世界坐標系是右手坐標系。所有的教材都會說是右手坐標系


選定xy軸,如果X叉乘Y等於Z,便是右手,等於-z便是左手。OpenGL在其它坐標系是右手, 在ndc是左手。


嗯……好吧,估計是國內的教程錯了?


推薦閱讀:
相關文章