我一直试图让我的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
然后通过上面生成的投影矩阵 我只是得到一个黑屏。为了实现这个目的,我还需要改变一些其他的东西吗?
答案 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
现在,如果你将上面给出的新“身份”放在一起,那么在你的工作预测中你得到的就是这个。