CustomStaticSky让你能够用自己的图片素材来定制3D场景的天空,支持立方体贴图和全景图两种方式!
不知道大家有没有这样的体验——打开一个3D地图应用,第一眼看到的就是那片蓝蓝的天空?没错,天空对于3D场景的沉浸感真的太重要了!
想象一下,你正在做一个城市规划可视化项目,如果能把天空换成当地的实景照片,或者换成一个梦幻的夕阳效果,是不是瞬间就高级了很多?
今天就来聊聊mapvthree里的CustomStaticSky,它能帮你轻松实现这个效果~
先来看看最终效果是什么样的:

简单来说,CustomStaticSky就是一个自定义静态天空组件。它允许你使用自己准备的贴图来作为天空背景,而且还会自动生成环境贴图,让场景中的反光物体也能反射出天空的颜色。
有意思吧?这意味着你的金属材质物体会自然地反射出天空的颜色,整个场景的光照会更加真实!
CustomStaticSky支持两种贴图模式,通过textureIsCube属性来切换:
textureIsCube | 贴图类型 | 图片数量 | 适用场景 |
|---|---|---|---|
| 立方体贴图 | 6张 | 高质量天空盒,各个角度都有精确控制 |
| 全景图 | 1张 | 方便快捷,一张图搞定 |
接下来,我们分别看看这两种模式怎么用~
想象一下,你站在一个巨大的正方体盒子里面,盒子的6个面分别贴上了天空的照片。向上看是天顶,向下看是地面,前后左右是四周的景色。这就是立方体贴图的原理!
使用立方体贴图需要准备6张图片,分别对应立方体的6个面:
px.jpg - 正X方向(右侧)nx.jpg - 负X方向(左侧)py.jpg - 正Y方向(顶部)ny.jpg - 负Y方向(底部)pz.jpg - 正Z方向(前方)nz.jpg - 负Z方向(后方)小贴士💡:这6张图片需要放在同一个文件夹里,并且按照上面的命名规范来命名。
// 1. 创建引擎
const engine = new mapvthree.Engine(document.getElementById('map_container'), {
map: {},
rendering: {}
});
// 2. 设置相机位置(可选,让视角更好看)
engine.map.setCenter([0, 0]);
engine.map.setZoom(24);
engine.map.setHeading(270);
engine.map.setPitch(80);
// 3. 创建自定义静态天空
const sky = engine.add(new mapvthree.CustomStaticSky());
// 4. 关键设置:使用立方体贴图模式
sky.textureIsCube = true;
// 5. 设置贴图路径(指向包含6张图片的文件夹)
sky.textureURL = 'assets/cubeTexture/';
// 6. 启用动画循环让场景持续渲染
engine.rendering.enableAnimationLoop = true;就这么简单!设置textureIsCube = true后,引擎会自动去指定的文件夹里加载那6张图片。
使用立方体贴图后,你会发现:
这是不是很棒?
全景图就是那种能360°环绕观看的图片,也叫等距圆柱投影图(Equirectangular)。你可能在VR看房或者街景地图里见过这种效果。
相比立方体贴图,全景图只需要一张图片就能搞定整个天空,是不是方便多了?
// 1. 创建引擎
const engine = new mapvthree.Engine(document.getElementById('map_container'), {
map: {},
rendering: {}
});
// 2. 创建自定义静态天空
const sky = engine.add(new mapvthree.CustomStaticSky());
// 3. 默认就是全景图模式,textureIsCube默认为false
// sky.textureIsCube = false; // 这行可以省略
// 4. 直接设置全景图的URL
sky.textureURL = 'https://example.com/sky-panorama.jpg';
// 5. 设置时间(可选)
sky.time = 17 * 3600; // 下午5点的感觉看到没?全景图模式更简洁,只需要指定一张图片的URL就行了!
CustomStaticSky有一个affectWorld属性,用来控制天空是否影响场景的环境光照:
const sky = engine.add(new mapvthree.CustomStaticSky());
sky.textureIsCube = true;
sky.textureURL = 'assets/cubeTexture/';
// 设置为false,天空只作为背景,不影响场景光照
sky.affectWorld = false;什么时候用呢?当你想要天空背景和场景光照分开控制的时候,把affectWorld设为false就行了。
CustomStaticSky可以和其他效果完美配合,比如水面反射:
// 创建天空
const sky = engine.add(new mapvthree.CustomStaticSky());
sky.textureIsCube = true;
sky.textureURL = 'assets/cubeTexture/';
// 创建水面材质
const waterMaterial = new mapvthree.WaterMaterial({});
engine.addBeforeRenderObject(waterMaterial);
// 创建水面网格
const water = new THREE.Mesh(
new THREE.PlaneGeometry(1, 1),
waterMaterial
);
water.scale.setScalar(20);
engine.add(water);这样,水面就会自然地反射出天空的颜色,效果超级棒!
场景中的金属物体会自动反射天空贴图:
// 创建一个金属立方体
const box = new THREE.Mesh(
new THREE.BoxGeometry(1, 1),
new THREE.MeshStandardMaterial({
color: 0xffffff,
roughness: 0, // 完全光滑
metalness: 0.8, // 高金属度
envMapIntensity: 2 // 增强环境贴图强度
})
);
box.scale.setScalar(2);
engine.add(box);看到那个闪闪发光的金属块了吗?那就是天空的反射效果!
特性 | 立方体贴图 (textureIsCube=true) | 全景图 (textureIsCube=false) |
|---|---|---|
图片数量 | 6张 | 1张 |
获取难度 | 较难,需要专业制作或购买 | 简单,网上资源丰富 |
极点变形 | 无 | 有轻微变形 |
加载方式 | 指定文件夹路径 | 指定图片URL |
渲染质量 | 高 | 中等 |
适用场景 | 高质量展示、产品级应用 | 快速原型、一般应用 |
记住这几个关键点:
textureIsCube = true:使用6张图片的立方体贴图,质量最高textureIsCube = false(默认):使用1张全景图,简单方便textureURL:设置贴图路径,立方体贴图指向文件夹,全景图指向具体文件affectWorld:控制是否影响场景的环境光照你的项目适合用哪种方式呢?
你有没有在项目中用过自定义天空效果?遇到了什么有趣的问题?欢迎在评论区分享你的经验~
如果觉得这篇文章对你有帮助,别忘了点个赞哦!👍
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。