OpenGL Z Axis Up

时间:2011-05-15 00:55:40

标签: opengl

我一直试图让我的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轴设置为up(工作正常)时,代码是这样的:

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 个答案:

答案 0 :(得分:1)

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

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

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

对于您的模型视图,假设以下为您的单位矩阵:

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

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


你所做的却是盲目地交换了所有非零y< - > z条目,这是错误的:

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

现在,如果你将上面给出的新“身份”放在一起,那么在你的工作预测中你得到的就是这个。