簡體   English   中英

OpenGL左手坐標系

[英]OpenGL left-handed coordinate system

我正在編寫一個3D OpenGL應用程序,但我的頂點轉換矩陣遇到了問題。

這是我的頂點着色器:

attribute vec4     vInPos;

uniform mat4    kWorld;
uniform mat4    kProj;

void main( void )
{
    vec4 world_pos = kWorld * vInPos;
    gl_Position = kProj * world_pos;
}

我所有的矩陣都存儲在專業行中,我使用的是左手透視圖矩陣作為我的投影矩陣。

問題是,當我通過矩陣平移一個頂點時,它在X軸和Y軸上都沿錯誤的方向移動並被翻轉。 因此,通過(100.0f,100.0f,100.0f)平移將頂點在Z軸上正確移動(遠離相機),但在X軸上向左移動(向后),在Y軸上向下移動(向后) 。

這是當前的樣子: 屏幕截圖

FPS計數器應在右上方,而不是在左下方。 顯然也不應鏡像。 根據我所讀的內容,發生這種情況是因為OpenGL默認使用右手坐標系,但是我不確定該如何解決。

我找到了幾篇文章試圖對其進行解釋,但找不到針對該問題的任何解決方案。 這個問題提到OpenGL規范顯示了坐標系的期望,但是看了之后,我沒有看到它對我有什么幫助。

編輯:供參考,我的投影矩陣代碼基於DirectX SDK

編輯:根據尼科爾·波拉斯的建議,我現在使用的是來自gluPerspective的矩陣,但我得到的結果相同。


這是我用來設置矩陣的代碼:

/* Vertex data for reference
float vertices[] =
{
    {0.0f,0.0f,0.0f},
    {5.0f,0.0f,0.0f},
    {0.0f,5.0f,0.0f},
    {5.0f,5.0f,0.0f},
}; */    
float worldf[16];
float projf[16];
float fov       = 60.0f;
float aspect    = 1280.0f/720.0f;
float near      = 1.0f;
float far       = 1000.0f;
float f         = 1.0f/tanf( (fov*6.2831f/360.0f)/2.0f );

/* Build world matrix */
memset(worldf, 0, sizeof(worldf));
worldf[0] = worldf[5] = worldf[10] = worldf[15] = 1.0f;
worldf[12] = 100.0f;
worldf[13] = 100.0f;
worldf[14] = -100.0f;

/* Build perspective matrix */
memset(projf, 0, sizeof(projf));
projf[0] = f/aspect;
projf[5] = f;
projf[10] = (far+near)/(near-far);
projf[14] = (2.0f*far*near)/(near-far);
projf[11] = -1.0f;

glUniformMatrix4fv(proj_uniform, 1, GL_FALSE, projf);
glUniformMatrix4fv(world_uniform, 1, GL_FALSE, worldf);

使用此代碼,我的文本完全不會顯示。

編輯:不確定是否相關,但是我在OS X Snow Leopard上使用OpenGL 2.0。

我正在使用左手透視矩陣

別那樣做。

同樣重要的是,對於OpenGL和D3D,投影矩陣的輸出(剪輯空間)是不同的。 您不能只是獲取D3D投影矩陣,對其進行轉置,並期望GLSL能夠很好地接受輸出。

因此,再次查找gluPerspective並使用該矩陣。


根據Nicol Bolas的建議,我現在使用的是gluPerspective的矩陣,但得到的結果相同。

您可能還使用了一堆其他左手矩陣。 您的“模型到相機”矩陣必須是慣用右手的。 同樣,您的頂點數據也需要右手操作。 另外,您可以嘗試從左手空間轉換為右手空間,但是除非您別無選擇,否則我不建議您這樣做。


float f = 1.0f/tanf(fov/2.0f);

fov是一個角度,以度為單位。 tanf弧度表示一個角度。 tanf30.0f為負數,這意味着透視矩陣中的平截頭體比例為負。 這樣可以有效地反轉視圖的X和Y軸。

您真正需要的是:

float f = 1.0f/tanf((fov * 6.2831f / 360.0f ) / 2.0f);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM