OpenGL Z轴向上
我一直试图让我的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
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乘法?我更新了我的帖子,提供了更多关于渲染的信息