【问题标题】:OpenGL Z Axis UpOpenGL Z 轴向上
【发布时间】:2011-05-15 00:55:39
【问题描述】:

我一直试图让我的 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

然后由上面生成的投影矩阵 我只是得到一个黑屏。我还需要更改其他内容才能使其正常工作吗?

【问题讨论】:

    标签: opengl


    【解决方案1】:

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

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

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

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

    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-multiply?我更新了我的帖子,提供了有关渲染的更多信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多