2011-05-15 129 views
3

我一直在试图让我的opengl引擎使用z轴作为上轴,但无论我做什么都不显示。余计算视图矩阵是这样的:OpenGL Z轴向上

float width = xymax - xmin; 
float height = xymax - ymin; 

float depth = zfar - znear; 
float q = -(zfar + znear)/depth; 
float qn = -2 * (zfar * znear)/depth; 

float w = 2 * znear/width; 
w = w/aspect; 
float h = 2 * znear/height; 

m[0] = w; 
m[1] = 0; 
m[2] = 0; 
m[3] = 0; 

m[4] = 0; 
m[5] = 0; 
m[6] = h; 
m[7] = qn; 

m[8] = 0; 
m[9] = q; 
m[10] = 0; 
m[11] = 0; 

m[12] = 0; 
m[13] = 0; 
m[14] = -1; 
m[15] = 0; 

之前,当我有Y轴为向上(其工作得很好),码是这样的:

m[0] = w; 
m[4] = 0; 
m[8] = 0; 
m[12] = 0; 

m[1] = 0; 
m[5] = h; 
m[9] = 0; 
m[13] = 0; 

m[2] = 0; 
m[6] = 0; 
m[10] = q; 
m[14] = -1; 

m[3] = 0; 
m[7] = 0; 
m[11] = qn; 
m[15] = 0; 

每个对象/顶点是第一乘以一个简单的翻译矩阵:

1 0 0 xposition 
0 1 0 yposition 
0 0 1 zposition 
0 0 0 1 

,然后通过上面 产生的投影矩阵,我只是得到一个黑色的屏幕。有什么我需要改变这个工作?

回答

1

这些看起来像投影矩阵中使用的矩阵,如果旋转那个矩阵,会发生奇怪的事情,因为您正在混淆OpenGL对传入数据的期望。

相反,您必须在应用投影之前将旋转应用于传入矢量;或者换句话说,你从一个旋转的矩阵开始,然后乘以投影。

现在,如果您使用固定功能流水线,只需使用工作变体,将其放入投影矩阵。如果你使用着色器,把它放入gl_ProjectionMatrix制服。有许多着色器算法需要世界空间顶点位置;投影和模型视图合并是有问题的。

为了您的模型视图假设以下为您的身份矩阵:

1 0 0 0 
0 0 1 0 
0 1 0 0 
0 0 0 1 

并继续使用你的工作投影,并且在第二阶段应用它。


什么你也不过是盲目地交换所有非零Ÿ< - >ž项,这是错误的:

w 0 0 0 
0 h 0 0 
0 0 q qn 
0 0 -1 0 

正确的,这将一直换的Y和Z柱:

w 0 0 0 
0 q 0 0 
0 0 h -1 
0 0 qn 0 

现在,如果你r乘以上面给出的新“身份”,在你的工作投影你得到的就是这个。

+0

我不知道你在做什么来获得第三个矩阵,没有列似乎交换,一切都只是重新排序。另外,什么是r-乘法?我更新了关于渲染的更多信息 – zacaj 2011-05-15 16:02:22