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

简介: 事情是这样的,前段时间外包工头老杨又来找我了,说某汽车大品牌要开发一个网页展厅,希望可以在网页里360度展示它家新款汽车的3d模型,还要可以让用户DIY汽车部件的颜色嘿嘿,时间紧,预算多!我心想报价四个W,再给他留点砍价空间,谁知道老杨一口答应,还说完事要请我去XX人间我猜他起码要从客户那赚10个W

3D引擎的基本知识


本文的目标是让大家看完之后可以立刻上手用起来,既然要用3d引擎,那我们理解了一些3d的基本知识后,再看threejs的API文档效率就会很高。无论什么3d引擎,都不外乎由以下几种基本元素构成


场景(scene


一个容器,容纳着除渲染器以外的三维世界里的一切。场景的元素采用右手笛卡尔坐标系,x轴正方向向右,y轴正方向向上,z轴由屏幕从里向外


image.png


摄像机(camera


就像人的眼睛,在一个空间里可以看向任意方向,可以通过参数调节可视角度和可视距离。


一般我们使用符合物理世界近大远小真实情况的透视相机PerspectiveCamera,还有一些特殊情况,需要远近大小是一样的,那就要用正交相机OrthographicCamera


PerspectiveCamera( fov : Number, aspect : Number, near : Number, far : Number )
//构造函数参数
//fov:视场角
//aspect:视场宽高比(一般用 画布宽/画布 高即可)
//near:能看多近
//far:能看多远
//这几个参数决定了哪些scene里的三维顶点会被渲染/绘制出来


image.png


渲染器(renderer


camerascene里看到的内容渲染/绘制到画布上


几何体(geometry


3D世界里的所有物体都是点组成面面组成几何体。相信大家对以下标准的几何体比较熟悉


  • 球体
  • 立方体
  • 圆锥体
  • 圆柱体


是由点构成的,又可以组成各式各样的几何体。以球体举例,球体面上的点越多,球就越圆。但点越多,运算量也会越大...


image.png


另外我们一般说的3d模型就是一个或多个几何体,只是有的3d模型文件里除了包含几何体还可以包含一些额外的信息,比如贴图,材质等...需要在读取模型文件时解析出来


灯光(light


3d引擎在没有手动创建光的情况下会默认有个环境光,不然你什么都看不到。常见的灯光有以下几种类型


  • AmbientLight(环境光,没有方向全局打亮,不会产生明暗)


  • DirectionLight(平行光,参考日光来理解)


image.png


  • PointLight(点光源,参考灯泡来理解)


image.png


  • SpotLight(聚光灯,参考舞台聚光灯)


image.png


贴图(texture


想象一下你手里有一个立方体,你用一张A4纸包裹上立方体的所有面,并在上面画画。你画的内容就是贴图


image.png


有一些类型的贴图会和光照发生反应...后面我们用到的时候再说


材质(material


延续贴图里的想象,你用白卡纸画画,还是用油纸画画,呈现出来的质感是不同的对不对,这就是材质!下面五个球的颜色都是一样的,而材质从左至右分别是


  • MeshBasicMaterial(基础材质,不受光照影响)


  • MeshStandardMaterial(PBR标准材质)


  • MeshPhongMaterial(高光材质,适用于陶瓷,烤漆类质感)


  • MeshToonMaterial(卡通材质,俗称三渲二)


  • MeshStandardMaterial(PBR标准材质模拟金属反射)


image.png


来实战吧!


有了这些基础知识,再来使用threejs就很容易上手了。可以说在3dmax等软件中调出来的90%的效果,用threejs都能找到对应的配置参数。


搭建基础场景


//<div id='container' style="width:100%;height: 100%;"></div>
var scene, camera, renderer;
function init(){
    scene = new THREE.Scene();
    //这里参数不懂的同学回去看基本知识里的camera部分
    camera = new THREE.PerspectiveCamera(90, document.body.clientWidth / document.body.clientHeight, 0.1, 100);
    //camera的位置在x0,y0,z3,还记得迪尔卡右手坐标系吗?
    camera.position.set(0, 0, 3);
    renderer = new THREE.WebGLRenderer();
    renderer.setSize(document.body.clientWidth, document.body.clientHeight);
    document.getElementById("container").appendChild(renderer.domElement);
    var controls = new THREE.OrbitControls(camera, renderer.domElement);
    //等待添加模型
    loop();
}
function loop() {
    requestAnimationFrame(loop);
    renderer.render(scene, camera);
}
window.onload = init;


现在我们可以先添加一个标准几何体来试试看,比如我们添加一个立方体来试试看


const geometry = new THREE.BoxGeometry( 1, 1, 1 );
const material = new THREE.MeshBasicMaterial( {color: 0x00ff00} );
const cube = new THREE.Mesh( geometry, material );
scene.add( cube );
复制代码


image.png


很显然,场景是生效的...大家注意看源码块中的注释


汽车模型


回到咱们的项目上来,品牌方给的是一个非常精细的模型,文件量有好几百兆,数百万面(triangles)。


image.png


我说这可用不了,你得减面还得给我转成引擎能支持的格式gltfobj


根据我的评估,要想在移动端网页里流畅运行,最多不能超过10万面


外包工头老杨说,你也别让客户给你弄了,他们都不会


我知道你懂,你就给弄了算了,我给你加【5K】


加5K你让我怎么好意思拒绝呢...


image.png


然后,我花25美刀巨资在sketchfab上购买了一个模型


再稍微改改就能满足要求,当然sketchfab也有免费模型


但毕竟收了老杨5K,不花点钱我心里略感不安呐 :p


优化模型结构


image.png


根据实际的需求,比如车窗要透明可以看到内饰,所以车窗就得单独给有透明属性的材质。车轮,灯罩,车网,车架,车身等等都要拆成独立的几何体才能独立配置材质


image.png


梳理好模型结构后,我们就要准备模型文件了



相关文章
|
移动开发 JavaScript 前端开发
ThreeJs搭建web3D场景
这篇文章讲解了如何使用Three.js来搭建web端的3D场景,并介绍了创建3D项目的基本要素。
572 2
|
JavaScript 前端开发 CDN
Threejs搭建web3D场景
这是一个基本的Three.js 3D场景的示例。你可以根据自己的需求添加更多的3D元素、纹理、光照和交互功能。
312 4
|
安全 图形学 数据安全/隐私保护
基于云服务器发布Web虚拟中药展厅
通过Unity3D结合3d建模技术,实现对学校的中药博物馆的虚拟重建,并且通过阿里云服务器将项目部署到云服务器。实践课题研究旨在学习虚拟博物馆的构建过程,对中医中药文化传播,虚拟博物馆建设具有中药意义。用户可通过访问Web的端的实现对学校博物馆的漫游交互,在一定程度上打破了实体博物馆的时间、空间、人员等的限制。
基于云服务器发布Web虚拟中药展厅
|
2月前
|
算法 Java Go
【GoGin】(1)上手Go Gin 基于Go语言开发的Web框架,本文介绍了各种路由的配置信息;包含各场景下请求参数的基本传入接收
gin 框架中采用的路优酷是基于httprouter做的是一个高性能的 HTTP 请求路由器,适用于 Go 语言。它的设计目标是提供高效的路由匹配和低内存占用,特别适合需要高性能和简单路由的应用场景。
224 4
|
6月前
|
缓存 JavaScript 前端开发
鸿蒙5开发宝藏案例分享---Web开发优化案例分享
本文深入解读鸿蒙官方文档中的 `ArkWeb` 性能优化技巧,从预启动进程到预渲染,涵盖预下载、预连接、预取POST等八大优化策略。通过代码示例详解如何提升Web页面加载速度,助你打造流畅的HarmonyOS应用体验。内容实用,按需选用,让H5页面快到飞起!
|
6月前
|
JavaScript 前端开发 API
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
本文深入解析了鸿蒙开发中Web加载完成时延的优化技巧,结合官方案例与实际代码,助你提升性能。核心内容包括:使用DevEco Profiler和DevTools定位瓶颈、四大优化方向(资源合并、接口预取、图片懒加载、任务拆解)及高频手段总结。同时提供性能优化黄金准则,如首屏资源控制在300KB内、关键接口响应≤200ms等,帮助开发者实现丝般流畅体验。
|
前端开发 JavaScript Shell
鸿蒙5开发宝藏案例分享---Web页面内点击响应时延分析
本文为鸿蒙开发者整理了Web性能优化的实战案例解析,结合官方文档深度扩展。内容涵盖点击响应时延核心指标(≤100ms)、性能分析工具链(如DevTools时间线、ArkUI Trace抓取)以及高频优化场景,包括递归函数优化、网络请求阻塞解决方案和setTimeout滥用问题等。同时提供进阶技巧,如首帧加速、透明动画陷阱规避及Web组件初始化加速,并通过优化前后Trace对比展示成果。最后总结了快速定位问题的方法与开发建议,助力开发者提升Web应用性能。
|
6月前
|
JSON 开发框架 自然语言处理
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(三)
本文主要介绍了应用开发中的三大核心内容:生命周期管理、资源限定与访问以及多语言支持。在生命周期部分,详细说明了应用和页面的生命周期函数及其触发时机,帮助开发者更好地掌控应用状态变化。资源限定与访问章节,则聚焦于资源限定词的定义、命名规则及匹配逻辑,并阐述了如何通过 `$r` 引用 JS 模块内的资源。最后,多语言支持部分讲解了如何通过 JSON 文件定义多语言资源,使用 `$t` 和 `$tc` 方法实现简单格式化与单复数格式化,为全球化应用提供便利。
254 104
|
6月前
|
JavaScript 前端开发 API
【HarmonyOS Next之旅】基于ArkTS开发(三) -> 兼容JS的类Web开发(二)
本文介绍了HarmonyOS应用开发中的HML、CSS和JS语法。HML作为标记语言,支持数据绑定、事件处理、列表渲染等功能;CSS用于样式定义,涵盖尺寸单位、样式导入、选择器及伪类等特性;JS实现业务逻辑,包括ES6语法支持、对象属性、数据方法及事件处理。通过具体代码示例,详细解析了页面构建与交互的实现方式,为开发者提供全面的技术指导。
273 104

热门文章

最新文章