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

如何将3D网格顶点归一化到原点中心单位立方体并获取顶点着色器变换矩阵

3D网格归一化到原点中心单位立方体的实现方法

离线计算新顶点的步骤

这个操作的核心是先对齐原始网格的中心到坐标原点,再按比例缩放到目标立方体范围内,步骤如下:

  • 首先计算原始网格的轴对齐包围盒(AABB),获取三个坐标轴上的极值:x_min、x_max、y_min、y_max、z_min、z_max
  • 计算包围盒各维度的尺寸:x_len = x_max - x_min、y_len = y_max - y_min、z_len = z_max - z_min
  • 确定缩放系数:如果要保留模型原始比例不产生拉伸,取三个维度尺寸的最大值作为统一缩放的分母,即max_len = max(x_len, y_len, z_len),缩放系数s = 1.0 / max_len;如果允许模型拉伸适配立方体,可单独为每个维度设置缩放系数s_x = 1.0 / x_len、s_y = 1.0 / y_len、s_z = 1.0 / z_len
  • 计算原始包围盒的中心坐标:center_x = (x_min + x_max) / 2.0、center_y = (y_min + y_max) / 2.0、center_z = (z_min + z_max) / 2.0
  • 遍历所有原始顶点执行变换,以均匀缩放为例,每个原始顶点(x, y, z)的新坐标计算逻辑为:
    new_x = (x - center_x) * s
    new_y = (y - center_y) * s
    new_z = (z - center_z) * s
    

Vertex Shader中使用的变换矩阵

上述变换可以合并为一个4x4的仿射变换矩阵,直接在顶点着色器中与顶点坐标相乘完成计算。以OpenGL常用的列向量、右乘矩阵规则为例:

  1. 第一步先构造平移矩阵,作用是将原始网格的中心移动到坐标原点,平移量为(-center_x, -center_y, -center_z):
    T = [
     [1, 0, 0, -center_x],
     [0, 1, 0, -center_y],
     [0, 0, 1, -center_z],
     [0, 0, 0, 1        ]
    ]
    
  2. 第二步构造缩放矩阵,以均匀缩放为例:
    S = [
     [s, 0, 0, 0],
     [0, s, 0, 0],
     [0, 0, s, 0],
     [0, 0, 0, 1]
    ]
    
  3. 合并后的最终变换矩阵为缩放矩阵左乘平移矩阵(先执行的平移变换放在矩阵乘法的右侧):
    M = S * T = [
     [s, 0, 0, -s * center_x],
     [0, s, 0, -s * center_y],
     [0, 0, s, -s * center_z],
     [0, 0, 0, 1            ]
    ]
    

在顶点着色器中直接将输入的顶点齐次坐标(w=1)与矩阵M相乘,即可得到目标单位立方体内的顶点坐标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:54:08