You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WebGPU中如何调整坐标轴方向,将+Y设置为向上轴

WebGPU中如何调整坐标轴方向,将+Y设置为向上轴

嘿,我完全懂你现在的困扰——明明在Blender里已经把模型设成+Y向上导出了,结果WebGPU渲染时还是默认X-Y当地面、-Z当向上轴,方向全乱了。别慌,咱们一步步把这个问题理顺:

问题根源

你的模型本身坐标是完全正确的(+Y向上),但当前渲染管线里的视图矩阵、矩阵计算逻辑还是沿用了旧的坐标系规则,才导致模型和相机的方向错位。我们要做的就是调整矩阵链,让渲染管线适配模型的坐标系。

具体解决方案

1. 加入坐标系转换矩阵(核心步骤)

我们需要一个转换矩阵,把模型的+Y向上坐标系映射到渲染管线的逻辑里。对应你的需求,转换规则是:

  • X轴方向保持不变
  • 模型的+Y轴对应渲染的向上方向(原-Z轴)
  • 模型的Z轴对应原Y轴(地面平面)

这个转换矩阵的行主序写法如下:

const coordTransform = new Mat4([
  1, 0,  0, 0,
  0, 0, -1, 0,
  0, 1,  0, 0,
  0, 0,  0, 1
]);

你有两种方式应用这个矩阵:

  • 修改顶点着色器:把转换矩阵插在模型矩阵和顶点坐标之间
var worldPos = vsUniqueUniforms.model * coordTransform * vec4f(v.position, 1.0);
output.position = vsCommonUniforms.projection * vsCommonUniforms.camera * worldPos;
  • 合并到视图矩阵:如果不想改每个模型的着色器,可以在生成相机视图矩阵后乘上转换矩阵
// 先生成原相机矩阵
const cameraMat = cameraAim(pos, target, up);
// 乘转换矩阵得到适配后的视图矩阵(注意:如果你的矩阵是左乘规则,要改成coordTransform.multiply(cameraMat))
const viewMatrix = cameraMat.multiply(coordTransform);

2. 调整相机参数适配新坐标系

原来的相机参数是基于-Z向上的,现在要切换到+Y向上,得对应调整:

  • 原相机位置[-3, 0, -10]:把原来的-Z值转成+Y值,原Y值转成Z值,新位置改为[-3, 10, 0]
  • 目标点保持[0,0,0]不变
  • Up向量直接设为[0,1,0](这才是我们要的向上轴)

3. 验证视图矩阵计算逻辑

你的cameraAim函数是基于传入的Up向量构建坐标系的,现在用[0,1,0]作为Up,生成的轴应该是正确的:

  • z轴是相机位置指向目标的反方向(pos - target),对应相机“后方”
  • x轴是Up叉乘z轴,得到水平向右的方向
  • y轴是z轴叉乘x轴,正好对应+Y向上

你的Vec3.crosssubtractnormalize实现都是正确的,这部分不用改。

4. 确认投影矩阵适配

你的投影矩阵是右手坐标系的实现,和Blender的+Y向上坐标系兼容,所以不需要修改。如果后续发现远近裁剪有问题,再检查rangeInv和相关参数即可。

测试验证

改完之后可以做几个简单测试:

  • 给模型加[1,0,0]平移:应该沿水平向右(X轴)移动
  • [0,1,0]平移:模型应该向上移动
  • [0,0,1]平移:模型应该沿X-Z地面平面向前移动

这样就能实现你想要的X-Z为地面、+Y为向上轴的效果啦!

备注:内容来源于stack exchange,提问作者tlckpl

火山引擎 最新活动