You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebGL自定义矩形透视投影矩阵无法渲染立方体问题咨询

参考空间问题解答

未做任何变换的立方体顶点属于模型局部空间,你定义的透视投影矩阵的作用目标是观察空间,二者本身不属于同一参考空间。如果你没有额外设置视图变换矩阵(默认视图矩阵为单位矩阵),那么经过模型矩阵变换后的世界空间坐标会直接等于观察空间坐标,属于投影矩阵的作用参考空间。
因为你定义的左右裁剪面l/r、上下裁剪面t/b是对称取值,立方体的x/y范围落在-1010之间,远小于裁剪面的±50范围,且你已经沿z轴平移到-6的位置,在0.1100的裁剪范围内,理论上立方体应该显示在视图正中心。

自定义矩阵无法渲染的原因

1. 矩阵元素表达式缺少括号,运算结果完全错误

你写的矩阵元素没有考虑运算优先级,除法运算的分母没有加括号,导致实际计算结果和预期的偏斜透视矩阵完全不符:

  • 你写的(2*n/r-l)实际执行逻辑是(2*n / r) - l,但正确值应为2*n / (r - l)
  • 同理其余带除法的元素都存在相同错误:2*n/t-b应为2*n/(t-b)、r+l/r-l应为(r+l)/(r-l)、t+b/t-b应为(t+b)/(t-b)、-(f+n/f-n)应为-(f+n)/(f-n)、-(2*f*n/f-n)应为-(2*f*n)/(f-n)

修正后的矩阵代码如下:

const n = 0.1;
const f = 100.0;
const l = -50;
const r = 50;
const t = 50;
const b = -50;

const customProjMatrix = new Float32Array([
  (2 * n) / (r - l),                0,                     0,  0,
                  0,  (2 * n) / (t - b),                     0,  0,
    (r + l) / (r - l),  (t + b) / (t - b),   -(f + n) / (f - n), -1,
                  0,                0,  -(2 * f * n) / (f - n),  0
]);

2. 顶点属性配置问题

你贴出的positions数组仅包含x、y两个分量,没有z轴坐标。如果是绘制立方体,需要补充每个顶点的z分量;如果是绘制平面,需要确认顶点属性指针的步长、分量数量配置正确,避免顶点属性读取错误。

3. 矩阵传入顺序确认

WebGL要求矩阵按列主序存储,你定义的矩阵元素顺序是符合列主序要求的,只要传入着色器时没有做额外的转置操作即可。

内容的提问来源于stack exchange,提问作者SuperJumbo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:54:02