OpenGL Z轴向上

OpenGL Z轴向上,opengl,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

我一直试图让我的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;
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;
以前,当我将Y轴设置为向上时(工作正常),代码如下:

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;
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
然后通过上面生成的投影矩阵
我刚得到一个黑屏。还有什么我需要改变的吗?

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

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

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

对于您的modelview,假设以下为您的标识矩阵:

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


然而,您所做的是无意识地交换所有非零yz条目,这是错误的:

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乘,在你的工作投影上,你得到的正是这个。

我不知道你是如何得到第三个矩阵的,似乎没有列被交换,所有的东西都被重新排序。还有,什么是r乘法?我更新了我的帖子,提供了更多关于渲染的信息