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

如何在体素光线追踪器中旋转立方体表面的纹理?

解决方案:用参数化坐标变换替代查找表

1. 先明确命中面与原始纹理轴的对应关系

从归一化的XYZ坐标里先提取两个关键信息:

  • 命中面标识:遍历三个轴,找到值为0或2的分量(记为hit_axis,比如0代表X轴,1代表Y轴,2代表Z轴),剩下的两个分量就是原始纹理UV。
  • 面朝向:标记该分量是2(正面)还是0(背面),因为朝向会决定纹理的初始翻转状态。

举个实际映射例子:

  • 正X面(X=2):原始UV是(Y, Z)
  • 负X面(X=0):原始UV是(Y, 2-Z)(背面视角下Z轴方向反转)

2. 用旋转参数实现动态坐标重排

不用枚举24种旋转,而是把旋转拆解为两个可参数化的维度:

  • rot_axis:绕哪个正交轴旋转(0=X,1=Y,2=Z)
  • rot_steps:旋转的90度步数(0=0°,1=90°,2=180°,3=270°)

针对每个命中面,根据这两个参数对UV坐标做轴交换和翻转操作,核心逻辑用伪代码示例如下:

// 输入:归一化坐标(x,y,z),旋转参数(rot_axis, rot_steps)
float coords[3] = {x, y, z};
int hit_axis = -1;
bool is_positive = false;
int uv_indices[2];
int uv_idx = 0;

// 1. 识别命中面与原始UV
for (int i = 0; i < 3; i++) {
    if (coords[i] == 0 || coords[i] == 2) {
        hit_axis = i;
        is_positive = (coords[i] == 2);
    } else {
        uv_indices[uv_idx++] = i;
    }
}
float u_orig = coords[uv_indices[0]];
float v_orig = coords[uv_indices[1]];

// 2. 根据旋转参数计算变换后的UV
float u_new = u_orig, v_new = v_orig;
// 以正X面(hit_axis=0,原始UV为Y,Z)为例
if (hit_axis == 0 && is_positive) {
    switch(rot_axis) {
        case 0: // 绕X轴旋转不改变YZ平面的UV
            break;
        case 1: // 绕Y轴旋转的4种步数变换
            switch(rot_steps) {
                case 1: u_new = 2 - v_orig; v_new = u_orig; break;
                case 2: u_new = 2 - u_orig; v_new = 2 - v_orig; break;
                case 3: u_new = v_orig; v_new = 2 - u_orig; break;
            }
            break;
        case 2: // 绕Z轴旋转的4种步数变换
            switch(rot_steps) {
                case 1: u_new = v_orig; v_new = 2 - u_orig; break;
                case 2: u_new = 2 - u_orig; v_new = 2 - v_orig; break;
                case 3: u_new = 2 - v_orig; v_new = u_orig; break;
            }
            break;
    }
}
// 其他面的变换逻辑可按相同模式扩展,每个面仅需处理3种旋转轴的4种情况

// 3. 组装变换后的坐标
float new_coords[3] = {coords[0], coords[1], coords[2]};
new_coords[uv_indices[0]] = u_new;
new_coords[uv_indices[1]] = v_new;

3. 利用立方体对称群简化参数定义

立方体的24种旋转本质是:

  • 选择6种「上方向」(3个轴,每个轴正反朝向)
  • 绕这个上方向做0/90/180/270度旋转(4种)

可以把旋转参数改为up_axis(0-5对应±X/±Y/±Z)和rot_around_up(0-3),通过这种结构化的参数组合,直接推导UV变换规则,完全避免枚举所有24种情况,代码的可读性和维护性会大幅提升。

4. 减少冗余的小技巧

  • 把每个面的初始UV映射规则写成字典(比如{"pos_x": {"axes": [1,2], "flip": [false, false]}}),避免重复代码。
  • 90度步长的旋转变换可以固化为通用函数,不用在每个分支重复写逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 10:30:42