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

AR.js中加载挤出SVG图像到标记点时报getUniforms未定义错误

报错根因

该报错出现在WebGL渲染管线的uniform参数读取阶段,是AR.js触发渲染时,SVG生成的网格对象还未完成初始化,或SVG默认像素级坐标超出AR标记视锥体范围导致的。

修复步骤

  • 首先修正SVG生成组的坐标变换,SVGLoader默认加载的内容为像素单位,尺寸远大于AR.js标记的米级单位范围,需要对生成的组做缩放、位置、旋转调整,使其适配标记大小
  • 强制标记在SVG加载完成前隐藏,避免未初始化就触发渲染
  • 手动触发材质、几何体的更新标识,确保Three.js渲染前完成资源初始化
  • 统一AR.js依赖的Three.js版本和SVGLoader的版本,避免版本不兼容导致的方法缺失

修正后代码

// 先隐藏标记,避免未加载完成触发渲染
myMarker.visible = false

// 实例化加载器
const loader = new SVGLoader();

// 加载SVG资源
loader.load(
    'data/svgSample.svg',
    function ( data ) {
        const paths = data.paths;
        const group = new THREE.Group();

        for ( let i = 0; i < paths.length; i ++ ) {
            const path = paths[ i ];
            const material = new THREE.MeshBasicMaterial( {
                color: path.color,
                side: THREE.DoubleSide,
                depthWrite: false
            } );
            const shapes = SVGLoader.createShapes( path );
            for ( let j = 0; j < shapes.length; j ++ ) {
                const shape = shapes[ j ];
                const geometry = new THREE.ShapeGeometry( shape );
                const mesh = new THREE.Mesh( geometry, material );
                // 手动标记需要更新
                mesh.material.needsUpdate = true
                mesh.geometry.needsUpdate = true
                group.add( mesh );
            }
        }

        // 适配AR标记的坐标变换,缩放值可根据实际SVG尺寸调整
        group.scale.set(0.001, -0.001, 0.001)
        group.position.set(0, 0, 0.01)
        group.rotation.x = -Math.PI / 2

        myMarker.add( group );
        // 加载完成后显示标记
        myMarker.visible = true
    },
    function ( xhr ) {
        console.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' );
    },
    function ( error ) {
        console.log( '加载出错' );
    }
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:18:02