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

如何实现平台对象随动态射线的分区域形态与纹理渲染?

平台基于射线位置的分区域视觉切换实现方案

核心位置判断逻辑

先通过平台的几何边界快速判定其与射线的位置关系:

  • 计算平台包围盒的极值坐标:获取平台所有顶点的最小x值(minX)和最大x值(maxX),记录射线当前的世界空间x坐标(rayX)。
  • 当maxX < rayX:平台整体处于射线左侧,启用第一种形态与纹理。
  • 当minX > rayX:平台整体处于射线右侧,启用第二种形态与纹理。
  • 若上述条件均不满足,判定射线与平台相交,触发分区域渲染逻辑。

相交时分区域渲染实现

方案1:自定义Shader(性能最优推荐)

直接在着色器层面根据顶点位置与射线坐标的对比,实时切换纹理与形态:

  • 在Shader中传入射线的rayX参数,以及两种纹理、形态变形参数(如顶点偏移量)。
  • 核心逻辑伪代码(以GLSL为例):
    // 顶点着色器传递世界坐标与UV
    varying vec3 v_WorldPos;
    varying vec2 v_Uv;
    
    // 全局参数
    uniform float u_RayX;
    uniform sampler2D u_TextureLeft;
    uniform sampler2D u_TextureRight;
    uniform vec3 u_DeformLeft;
    uniform vec3 u_DeformRight;
    
    void main() {
        // 顶点形态变形处理(可选)
        vec3 pos = position;
        if (pos.x < u_RayX) {
            pos += u_DeformLeft;
        } else {
            pos += u_DeformRight;
        }
        v_WorldPos = vec3(modelMatrix * vec4(pos, 1.0));
        v_Uv = uv;
        gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
    }
    
    // 片元着色器切换纹理
    void main() {
        vec4 color;
        if (v_WorldPos.x < u_RayX) {
            color = texture2D(u_TextureLeft, v_Uv);
        } else {
            color = texture2D(u_TextureRight, v_Uv);
        }
        gl_FragColor = color;
    }
    
  • 优势:无需拆分模型,实时计算无额外性能损耗,支持任意形状平台,形态过渡更自然。

方案2:模型拆分+遮罩(适合无Shader开发经验场景)

  • 复制平台模型一份,分别赋予两种形态与纹理,得到「左侧模型」和「右侧模型」。
  • 给两个模型添加矩形裁剪遮罩:左侧遮罩只显示rayX左侧区域,右侧遮罩只显示rayX右侧区域。
  • 每一帧更新遮罩的裁剪边界,同步射线的rayX位置。
  • 注意:若平台是不规则形状,遮罩需配合模型的alpha通道实现精准裁剪,避免边缘穿帮。

射线位置实时同步

在每一帧更新时,从射线对象中获取当前世界空间的x坐标,传递给平台的Shader参数或遮罩组件,确保视觉状态与射线位置实时同步。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:06:05