备案 控制台
开发者社区 开发与运维 文章 正文

2天赚了4个W,手把手教你用Threejs搭建一个Web3D汽车展厅!(下)

简介: 接上文

加载模型


3d模型的文件格式有很多,但threejs里常用的基本是


  • OBJ格式


老牌通用3d模型文件,不包含贴图,材质,动画等信息。


  • GLTF格式(图形语言传输格式)


由OpenGL官方维护团队推出的现代3d模型通用格式,可以包含几何体、材质、动画及场景、摄影机等信息,并且文件量还小。有3D模型界的JPEG之称。


原项目中我使用的是OBJ格式,本文里我们使用GLTF格式。利用threejs提供的 editor,我们可以将模型的格式进行转换并导出。


image.png


通过GLTFLoader,我们可以加载一个.gltf格式的3d模型文件。需要注意的是,这些Loader都以插件的形式存在,需要引入相应的XXXLoader.js才能使用


//<script src="js/GLTFLoader.js"></script>
//放到之前添加立方体的代码处
const loader = new THREE.GLTFLoader();
loader.load(
    'images/model.gltf',
    function ( gltf ) {
        scene.add( gltf.scene );
    },
    function ( xhr ) {
        //侦听模型加载进度
        console.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' );
    },
    function ( error ) {
        //加载出错时的回调
        console.log( 'An error happened' );
    }
);


image.png


通过这个代码可以遍历查看模型里的几何体列表


console.log(gltf.scene.children);
//可以用for,也可以用traverse api
//gltf.scene.children.traverse((child){});


贴图和材质


现在我们来给几何体添加贴图,贴图怎么做是设计师的专业。这里不过多的说,我们只需要知道,这些贴图如何使用即可。


image.png


  • 普通贴图(_col


material.map,替代颜色


  • 法线贴图(_nor


material.normalMap,让细节程度较低的表面生成高细节程度的精确光照方向和反射效果


  • 环境光遮蔽贴图(_occ


material.aoMap,用来描绘物体和物体相交或靠近的时候遮挡周围漫反射光线的效果


  • 环境反射贴图


material.envMap,用于模拟材质反射周围环境的效果


我们现在先把这些贴图文件统一加载到内存里


var allTexture;
function loadAllTexture(cb){
    allTexture = {};
    var loadIndex = 0;
    var textures = [
        "skymap",
        "shache_occ",
        "shache_nor",
        "shache_col",
        "neishi_occ",
        "neishi_nor",
        "mennei_col",
        "luntai_nor",
        "luntai_col",
        "lungu_occ",
        "lungu_nor",
        "lungu_col",
        "linjian_occ",
        "linjian_nor",
        "linjian_col",
        "floor",
        "deng_occ",
        "deng_nor",
        "deng_col",
        "cheshen_occ",
        "cheshen_nor",
        "chejia_occ",
        "chejia_nor",
        "chedengzhao_nor"
    ];
    function loadNextTexture(){
        var textureName = textures[loadIndex];
        loadTexture("images/textures/"+textureName+".jpg",function(texture){
            if(loadIndex<textures.length-1){
                allTexture[textureName] = {
                    texture:texture
                };
                loadIndex++;
                loadNextTexture();
            }else{
                if(cb)cb();
            }
        });
    }
    loadNextTexture();
}
function loadTexture(filepath,cb){
    const textureLoader = new THREE.TextureLoader();
    textureLoader.load(filepath,cb);
}


然后根据名称手动一一对应,比如我们先把车轮毂的贴图给加上


image.png


for(var i=0;i<gltf.scene.children[0].children.length;i++){
    var modelObj = gltf.scene.children[0].children[i];
    if(modelObj.name=="smart_lungu0"||modelObj.name=="smart_lungu1"||modelObj.name=="smart_lungu2"||modelObj.name=="smart_lungu3"){
        modelObj.material = new THREE.MeshStandardMaterial();
        modelObj.material.map = allTexture["lungu_col"].texture;
        modelObj.material.normalMap = allTexture["lungu_nor"].texture;
        modelObj.material.aoMap = allTexture["lungu_occ"].texture;
    }
}


我们继续把车轮的贴图给加上


image.png


else if(modelObj.name=="smart_chelun0"||modelObj.name=="smart_chelun1"||modelObj.name=="smart_chelun2"||modelObj.name=="smart_chelun3"){
    modelObj.material = new THREE.MeshStandardMaterial();
    modelObj.material.map = allTexture["luntai_col"].texture;
    modelObj.material.normalMap = allTexture["luntai_nor"].texture;
}


其余的材质贴图都如此添加上,后续当然还有很多材质的细节是可以去调整的,但这是个细活儿,这里主要重点分享下玻璃的反射和透明金属漆的反光


  • 透明的玻璃


天窗和前挡风玻璃的透明度以及基底颜色是不同的


else if(child.name=="smart_boli"){
    child.material=new THREE.MeshPhongMaterial();
    child.material.color = new THREE.Color( 0x333333 );
    child.material.transparent=true;
    child.material.opacity=.2;
}else if(child.name=="smart_tianchuang"){
    child.material=new THREE.MeshPhongMaterial();
    child.material.color = new THREE.Color( 0x000 );
    child.material.transparent=true;
    child.material.opacity=.5;
}


仔细看看动图里前挡风和天窗透明度的差异


image.png


  • 玻璃的反射


想真的去反射真实的环境?你别想多了,用envMap做个假的看起来就很可以了...


child.material.envMap=allTexture["skymap"].texture;
//环境反射贴图envMap的映射方式,这里用的是一个叫等量矩形投影的映射方法
child.material.envMap.mapping = THREE.EquirectangularReflectionMapping;
//环境反射贴图的强度
child.material.envMapIntensity=1;


image.png


仔细看动图里的前挡风玻璃,是不是反射了什么东西?看过 《三种前端实现VR全景看房的方案!说不定哪天就用得上!》的小伙伴们,记得这张图么?


image.png


  • 车身漆面质感


使用MeshStandardMaterial材质,通过调节metalnessroughness的值来调节金属的质感


child.material = new THREE.MeshStandardMaterial();
child.material.color=new THREE.Color(0x70631B);
child.material.metalness = 0.44;
child.material.roughness = 0;


image.png


信息点


毕竟是个在线展厅,在车身周围得呈现一些信息点,点击后可以弹窗显示更多信息对吧。实现方式同样在VR全景的文章中提到过了,就是Sprite+Raycast


image.png


//frame只是一个标记,叫什么都行
var poiPosArray=[
    {x:-1.47,y:0.87,z:-0.36,frame:1},
    {x:-1.46,y:0.49,z:-0.69,frame:2},
    {x:1.5,y:.7,z:0,frame:8},
    {x:0.33,y:1.79,z:0,frame:3},
    {x:0,y:0.23,z:0.96,frame:4},
    {x:0.73,y:1.38,z:-0.8,frame:5},
    {x:-.1,y:1.17,z:0.88,frame:6},
    {x:-1.16,y:0.16,z:0.89,frame:7}
],poiObjects=[];
function setupInfoPoint(){
    const pointTexture = new THREE.TextureLoader().load("images/point.png");
    var group = new THREE.Group();
    var materialC = new THREE.SpriteMaterial( { map: pointTexture, color: 0xffffff, fog: false } );
    for ( var a = 0; a < poiPosArray.length; a ++ ) {
        var x = poiPosArray[a].x;
        var y = poiPosArray[a].y-.5;
        var z = poiPosArray[a].z;
        var sprite = new THREE.Sprite( materialC );
        sprite.scale.set( .15, .15, 1 );
        sprite.position.set( x, y, z );
        sprite.idstr="popup_"+poiPosArray[a].frame;
        group.add( sprite );
        poiObjects.push(sprite);
    }
    scene.add( group );
    document.body.addEventListener("click",function (event) {
        event.preventDefault();
        var raycaster = new THREE.Raycaster();
        var mouse = new THREE.Vector2();
        mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
        mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
        raycaster.setFromCamera( mouse, camera );
        var intersects = raycaster.intersectObjects( poiObjects );
        if(intersects.length>0){
            var popIndex=parseInt(intersects[ 0 ].object.idstr.substr(6,1));
            console.log(popIndex);
        }
    });
}


UI怎么做


image.png



既然我们用了threejs,所以我们就要在threejs里把UI做出来吗?这么想的话,会把自己累死。要知道在3d场景里做2d的UI可不算是一件容易的事,还要实现UI的一些用户行为(点击,拖动等)的话就更麻烦了...所以我们直接用html来做UI就好啦~


到这里,这个3D汽车展厅的核心部分你已经学会(fei)了吧!


结语


以上只是对threejs一个非常粗浅的使用,threejs能实现的酷炫效果远远不止于此,希望本文能让你开始对Web3D开发产生兴趣,如果觉得本文还不错,请点赞收藏关注吧~




大帅老猿
目录
相关文章
大帅老猿
|
API 容器
2天赚了4个W,手把手教你用Threejs搭建一个Web3D汽车展厅!(上)
事情是这样的,前段时间外包工头老杨又来找我了,说某汽车大品牌要开发一个网页展厅,希望可以在网页里360度展示它家新款汽车的3d模型,还要可以让用户DIY汽车部件的颜色 嘿嘿,时间紧,预算多! 我心想报价四个W,再给他留点砍价空间, 谁知道老杨一口答应,还说完事要请我去XX人间 我猜他起码要从客户那赚10个W
大帅老猿
585 0
2天赚了4个W,手把手教你用Threejs搭建一个Web3D汽车展厅!(上)
桃李春风一杯酒
|
27天前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。
桃李春风一杯酒
59 5
vohelon
|
2月前
|
Web App开发 前端开发 开发工具
介绍Web开发的基础知识
介绍Web开发的基础知识
vohelon
30 7
L&ecirc;v&iuml;
|
7天前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
L&ecirc;v&iuml;
19 0
江帅帅
|
13天前
|
JSON Java fastjson
Spring Boot 底层级探索系列 04 - Web 开发(2)
Spring Boot 底层级探索系列 04 - Web 开发(2)
江帅帅
21 0
无糖可乐嘟嘟
|
13天前
|
安全 编译器 PHP
PHP 8.1版本发布:引领Web开发新潮流
PHP编程语言一直是Web开发的主力军,而最新发布的PHP 8.1版本则为开发者们带来了更多创新和便利。本文将介绍PHP 8.1版本的主要特性,包括更快的性能、新的语言功能和增强的安全性,以及如何利用这些功能来提升Web应用程序的质量和效率。
无糖可乐嘟嘟
16 0
坠入极夜的夏
|
16天前
|
PHP
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
web简易开发——通过php与HTML+css+mysql实现用户的登录,注册
坠入极夜的夏
23 0
1941623231718325
|
16天前
|
前端开发 数据挖掘 API
使用Python中的Flask框架进行Web应用开发
【4月更文挑战第15天】在Python的Web开发领域,Flask是一个备受欢迎的轻量级Web框架。它简洁、灵活且易于扩展,使得开发者能够快速地构建出高质量的Web应用。本文将深入探讨Flask框架的核心特性、使用方法以及在实际开发中的应用。
1941623231718325
18 0
龙大吉
|
25天前
|
安全 前端开发 Java
Java Web开发知识点学习总结
Java Web开发涉及Java基础、Servlet、JSP、数据库操作(SQL+JDBC)、MVC设计模式、Spring框架、Hibernate ORM、Web服务(SOAP&RESTful)、安全认证(HTTP Basic/Digest/OAuth)及性能优化(缓存、异步、负载均衡)。
龙大吉
19 3
桃李春风一杯酒
|
27天前
|
Java 持续交付 开发者
使用 Docker 容器化 Java Web 应用:提高开发和部署效率
【4月更文挑战第4天】Docker 作为轻量级容器技术,提升了 Java Web 应用的开发和部署效率。它提供类似生产环境的本地开发体验,减少环境配置时间,保证应用隔离性与稳定性。Docker 改善了部署流程,实现跨环境的无缝迁移,支持自动化构建、部署和扩展,并促进持续集成和持续部署,助力企业实现更高效、可靠的软件生命周期管理。
桃李春风一杯酒
41 8

热门文章

最新文章

  • 1
    阿里云安全产品,Web应用防火墙与云防火墙产品各自作用简介
  • 2
    构建高效响应式Web界面:现代前端框架的比较
  • 3
    Linux系统之部署web-check网站分析工具
  • 4
    《理解 WebSocket:Java Web 开发的实时通信技术》
  • 5
    Python Web框架比较:Django vs Flask vs Pyramid
  • 6
    < 今日份知识点:web常见的攻击方式(网络攻击)有哪些?如何预防?如何防御呢 ? >
  • 7
    从前端到后端:构建现代化Web应用的技术探索
  • 8
    Web 前端开发中的最佳实践
  • 9
    【好玩的经典游戏】Docker部署FC-web游戏模拟器
  • 10
    【Java Web】在 IDEA 中部署 Tomcat
  • 1
    实验目的1.编译安装httpd2.优化路径3.并将鲜花网站上传到web服务器为网页目录4.在客户机访问网站http://www.bdqn.com
    165
  • 2
    构建高效Python Web应用:异步编程与Tornado框架解析
    36
  • 3
    请描述在 Python WEB 开发中常用的测试方法。
    20
  • 4
    在 Python 中,如何处理 Web 请求和响应?
    31
  • 5
    Django是一个用Python编写的开源Web应用框架
    14
  • 6
    构建高性能Web应用:前端性能优化的关键策略与实践
    57
  • 7
    视觉智能平台常见问题之web端编辑器实现如何解决
    40
  • 8
    构建高性能Web应用的关键技术
    47
  • 9
    构建响应式Web界面:Flexbox的力量
    23
  • 10
    探索现代Web应用中的微前端架构
    30
  • 相关课程

    更多
  • Python Web开发基础
  • Java Web开发系列课程 - Spring框架入门
  • 企业Web常用架构LAMP-LNMP实战
  • 高校精品课-西安交通大学-Web 编程技术
  • Java Web项目实战 - 图书商城
  • Java面试疑难点解析 - Java Web开发
  • 相关电子书

    更多
  • Web应用系统性能优化
  • 高性能Web架构之缓存体系
  • PWA:移动Web的现在与未来
  • 相关实验场景

    更多
  • 每个IT人都想学的“Web应用上云经典架构”实战
  • 使用SLB+2ECS+NAS,部署电商web网站的高可用架构
  • 1分钟SAE部署Web在线游戏
  • 云上Web及FTP
  • WEB网页编程实战
  • 重温童年的“五子棋”,赢取专属阿里云Serverless证书
  • 下一篇
    2024年阿里云免费云服务器及学生云服务器申请教程参考

    装修网杭州简装价格比较好的家装 公司较好装饰公司法式轻复古装修风格200平房子简装大概多少钱公装的流程120平方装修多钱装饰装修行业排名90三室两厅装修北京装修一套房子多少钱步阳江南壹号装修简装一套130平米需要多少钱卧室装修简装济南公装装修装饰公司环保精装屋装修多少钱公装装修工程公司现代装修卧室公装 装修温馨风格装修十大公装公司简装防滑链现代装修效果图大全家庭装修电线要多少钱东圃装修公司房屋装修施工装饰布帘公装网70多平米房子装修店面简装香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声汪小菲曝离婚始末卫健委通报少年有偿捐血浆16次猝死单亲妈妈陷入热恋 14岁儿子报警雅江山火三名扑火人员牺牲系谣言手机成瘾是影响睡眠质量重要因素男子被猫抓伤后确诊“猫抓病”中国拥有亿元资产的家庭达13.3万户高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了男孩8年未见母亲被告知被遗忘张家界的山上“长”满了韩国人?倪萍分享减重40斤方法许家印被限制高消费网友洛杉矶偶遇贾玲何赛飞追着代拍打小米汽车超级工厂正式揭幕男子被流浪猫绊倒 投喂者赔24万沉迷短剧的人就像掉进了杀猪盘特朗普无法缴纳4.54亿美元罚金周杰伦一审败诉网易杨倩无缘巴黎奥运专访95后高颜值猪保姆德国打算提及普京时仅用姓名西双版纳热带植物园回应蜉蝣大爆发七年后宇文玥被薅头发捞上岸房客欠租失踪 房东直发愁“重生之我在北大当嫡校长”校方回应护栏损坏小学生课间坠楼当地回应沈阳致3死车祸车主疑毒驾事业单位女子向同事水杯投不明物质路边卖淀粉肠阿姨主动出示声明书黑马情侣提车了奥巴马现身唐宁街 黑色着装引猜测老人退休金被冒领16年 金额超20万张立群任西安交通大学校长王树国卸任西安交大校长 师生送别西藏招商引资投资者子女可当地高考胖东来员工每周单休无小长假兔狲“狲大娘”因病死亡外国人感慨凌晨的中国很安全恒大被罚41.75亿到底怎么缴考生莫言也上北大硕士复试名单了专家建议不必谈骨泥色变“开封王婆”爆火:促成四五十对测试车高速逃费 小米:已补缴天水麻辣烫把捣辣椒大爷累坏了

    装修网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化