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.cross、subtract、normalize实现都是正确的,这部分不用改。
4. 确认投影矩阵适配
你的投影矩阵是右手坐标系的实现,和Blender的+Y向上坐标系兼容,所以不需要修改。如果后续发现远近裁剪有问题,再检查rangeInv和相关参数即可。
测试验证
改完之后可以做几个简单测试:
- 给模型加
[1,0,0]平移:应该沿水平向右(X轴)移动 - 加
[0,1,0]平移:模型应该向上移动 - 加
[0,0,1]平移:模型应该沿X-Z地面平面向前移动
这样就能实现你想要的X-Z为地面、+Y为向上轴的效果啦!
备注:内容来源于stack exchange,提问作者tlckpl




