【threejs】较大物体或shape的贴图较小问题处理方法

问题

有的场景内相对体型差距过大的物体(如山地 海洋等····)由于尺寸问题,加载贴图过于小,同时shader也无法完全展示,如图

我们可以获取物体的uv,进行缩放使得贴图可以完全展开

如果uv是乱的 可以用xyz坐标最大最小值先排布uv再对uv进行缩放

javascript 复制代码
//假设你有一个 mest.geometry(物体网格)
 		let max = { x: 10000, y: 10000, z: 10000 }
        let min = { x: 30000, y: 30000, z: 30000 }
        let positions = geometry.getAttribute('position').array.map((item, index) => {
            let axis = index % 3
            switch (axis) {
                case 0:
                    return item - min.x
                    break;
                case 1:
                    return item - min.y
                    break;
                case 2:
                    return item - min.z
                    break;
                default:
                    break;
            }
        })

        let uv_ = []
        let _X = max.x - min.x
        let _Y = max.y - min.y
        let _Z = max.z - min.z
        for (let i = 0; i < positions.length / 3; i++) {
            let x = positions[i * 3]
            let y = positions[i * 3 + 1]
            let z = positions[i * 3 + 2]
            let _u = x / _X
            let _v = z / _Z
            // 或者你的高度轴是y
            //  _v = y/_Y
            uv_.push(_u, _v)

        }
        let uvs = uv_.map(item=>item*scale)//缩放

        // 只是改原始模型uv比例 
        let uvs = geometry.getAttribute('uv').array.map(item => item / 500)//缩放uv

        // uv传给geometry(网格)
        geometry.setAttribute('uv', new Float32BufferAttribute(uvs, 2))
```

# 效果
```javascript
//我这里只是进行uv缩放
        const mesh = new Mesh(geometry, mat)
        // mesh.position.setZ(-this.lineTick)
        mesh.position.set(startX, startY, - this.lineTick)
        // console.log(geometry);
        let uvs = geometry.getAttribute('uv').array.map(item => item / 500)//缩放
        geometry.setAttribute('uv', new Float32BufferAttribute(uvs, 2))
        mesh.scale.set(scale, scale, 1)
        return mesh
```

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d3ddd5998906476bb488d32da7fb56a9.png)
贴图完全展开了
相关推荐
RedEric12 分钟前
Vue加载速度优化,verder.js和element.js加载速度慢解决方法
前端·javascript·vue.js·前端性能优化
刺客-Andy21 分钟前
CSS中使用 HSL(Hue, Saturation, Lightness) 动态生成色值
前端·css·前端框架·vue
南北是北北22 分钟前
为什么“以音频为主时钟”最稳,怎么做 A/V 同步
前端·面试
LHX sir29 分钟前
巨头撤退,玩家内卷!2025,IoT平台的生死劫与重生路
开发语言·前端·物联网·低代码·ui·前端框架·交互
龙在天30 分钟前
Tailwind 类名 记个规律大概,然后去文档查
前端
东北南西1 小时前
实现 TypeScript 内置工具类型(源码解析与实现)
前端·typescript
learning_tom1 小时前
HTML5 标题标签、段落、换行和水平线
前端·html·html5
绿豆_13141 小时前
playwright+python UI自动化测试中实现图片颜色和像素对比
自动化测试·python·opencv·计算机视觉·playwirght
IT_陈寒1 小时前
Python性能优化:这5个隐藏技巧让我的代码提速300%!
前端·人工智能·后端
Dolphin_海豚1 小时前
【译】Reading vuejs/core-vapor - 中卷
前端·掘金翻译计划·vapor