前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ThreeJS 立方体贴图

ThreeJS 立方体贴图

作者头像
Melody132
发布2020-03-12 00:03:00
3K0
发布2020-03-12 00:03:00
举报
文章被收录于专栏:时光笔记

前言

什么要贴图?

在上一篇《ThreeJS 掏洞术》中,利用ThreeBSP完成了在‘墙’上掏出‘门’或‘窗户’洞的效果。但那个所谓的‘墙’一点也不像,试想谁家的墙是绿色的呀,而且就算换成其他颜色也是不行的,因为色彩太单调了,实际上在我们现实世界中,物体表面的色彩通常都是丰富的。所以要让几何体看起来真实、精致就需要贴图。

其实简单一句话形容就是:就像家里装修时要给大白墙贴上壁纸一样。

那么本文将‘简单描述’一下给立方体贴图的过程,我之所以说‘简单描述’是因为这里涉及的领域比较多,所以文中的内容就不做过多扩展描述了,只简述关于《ThreeJS 立方体贴图》的干货。

示例

什么是贴图?

贴图学名叫做 Texture Mapping ,译作 纹理映射、纹理贴图、材质贴图。

简单说就是:把一张图片贴到几何体的表面上。

那么下面开始写代码!

必要操作:使用TextureLoader对象的load函数,将图片加载为纹理对象,并使用该纹理对象创建一个MeshBasicMaterial (基本材质)。以下素材,下载可以右键点击另存为。

请输入图片描述
请输入图片描述
代码语言:javascript
复制
let mesh = new THREE.Mesh(
        new THREE.BoxGeometry(300, 300, 300),
        new THREE.MeshBasicMaterial( {
            map: new THREE.TextureLoader().load('./crate.jpg') }
        )
    );
scene.add(mesh);

这样就将图片覆盖到了立方体的6个面上,以下是效果图

请输入图片描述
请输入图片描述
请输入图片描述
请输入图片描述

如果你想6个面分别贴不同的图的话也好办,最简单的方法是,Mesh构造函数的第二个参数,可以直接传一个Material数组,所以我们可以创建对应6个面的MeshBasicMaterial数组,那么现在演示如何将下面6个图片分别贴到6个面上。

请输入图片描述
请输入图片描述
请输入图片描述
请输入图片描述
请输入图片描述
请输入图片描述
请输入图片描述
请输入图片描述
请输入图片描述
请输入图片描述
请输入图片描述
请输入图片描述
代码语言:javascript
复制
//创建纹理加载器对象
let textureLoader = new THREE.TextureLoader();
let mesh = new THREE.Mesh(
    new THREE.BoxGeometry(300, 300, 300),
    [
        //下标0:右面材质
        new THREE.MeshBasicMaterial({
            map: textureLoader.load('./img/tietu_demo_5.jpg')
        }),
        //下标1:左面材质
        new THREE.MeshBasicMaterial({
            map: textureLoader.load('./img/tietu_demo_6.jpg')
        }),
        //下标2:上面材质
        new THREE.MeshBasicMaterial({
            map: textureLoader.load('./img/tietu_demo_7.jpg')
        }),
        //下标3:下面材质
        new THREE.MeshBasicMaterial({
            map: textureLoader.load('./img/tietu_demo_8.jpg')
        }),
        //下标4:前面材质
        new THREE.MeshBasicMaterial({
            map: textureLoader.load('./img/tietu_demo_9.jpg')
        }),
        //下标5:后面材质
        new THREE.MeshBasicMaterial({
            map: textureLoader.load('./img/tietu_demo_10.jpg')
        }),
    ]
);
scene.add(mesh);

效果如下图:

请输入图片描述
请输入图片描述
请输入图片描述
请输入图片描述

本文到此结束,有时间会写一篇关于UV Mapping的贴图方式,比这个稍微复杂点,其实也很简单,今天就先到这里,欢迎评论,提意见!


转发请注明本文链接。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-12-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档