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


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



相关文章
|
安全 图形学 数据安全/隐私保护
基于云服务器发布Web虚拟中药展厅
通过Unity3D结合3d建模技术,实现对学校的中药博物馆的虚拟重建,并且通过阿里云服务器将项目部署到云服务器。实践课题研究旨在学习虚拟博物馆的构建过程,对中医中药文化传播,虚拟博物馆建设具有中药意义。用户可通过访问Web的端的实现对学校博物馆的漫游交互,在一定程度上打破了实体博物馆的时间、空间、人员等的限制。
基于云服务器发布Web虚拟中药展厅
|
1月前
|
数据库 开发者 Python
web应用开发
【9月更文挑战第1天】web应用开发
40 1
|
22天前
|
数据可视化 图形学 UED
只需四步,轻松开发三维模型Web应用
为了让用户更方便地应用三维模型,阿里云DataV提供了一套完整的三维模型Web模型开发方案,包括三维模型托管、应用开发、交互开发、应用分发等完整功能。只需69.3元/年,就能体验三维模型Web应用开发功能!
42 8
只需四步,轻松开发三维模型Web应用
|
12天前
|
安全 API 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
在当前的Web开发中,Python因能构建高效简洁的RESTful API而备受青睐,大大提升了开发效率和用户体验。本文将介绍RESTful API的基本原则及其在Python中的实现方法。以Flask为例,演示了如何通过不同的HTTP方法(如GET、POST、PUT、DELETE)来创建、读取、更新和删除用户信息。此示例还包括了基本的路由设置及操作,为开发者提供了清晰的API交互指南。
55 6
|
11天前
|
存储 JSON API
实战派教程!Python Web开发中RESTful API的设计哲学与实现技巧,一网打尽!
在数字化时代,Web API成为连接前后端及构建复杂应用的关键。RESTful API因简洁直观而广受欢迎。本文通过实战案例,介绍Python Web开发中的RESTful API设计哲学与技巧,包括使用Flask框架构建一个图书管理系统的API,涵盖资源定义、请求响应设计及实现示例。通过准确使用HTTP状态码、版本控制、错误处理及文档化等技巧,帮助你深入理解RESTful API的设计与实现。希望本文能助力你的API设计之旅。
35 3
|
12天前
|
JSON API 数据库
从零到英雄?一篇文章带你搞定Python Web开发中的RESTful API实现!
在Python的Web开发领域中,RESTful API是核心技能之一。本教程将从零开始,通过实战案例教你如何使用Flask框架搭建RESTful API。首先确保已安装Python和Flask,接着通过创建一个简单的用户管理系统,逐步实现用户信息的增删改查(CRUD)操作。我们将定义路由并处理HTTP请求,最终构建出功能完整的Web服务。无论是初学者还是有经验的开发者,都能从中受益,迈出成为Web开发高手的重要一步。
36 4
|
10天前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
31 1
|
12天前
|
JSON API 开发者
惊!Python Web开发新纪元,RESTful API设计竟能如此性感撩人?
在这个Python Web开发的新纪元里,RESTful API的设计已经超越了简单的技术实现,成为了一种追求极致用户体验和开发者友好的艺术表达。通过优雅的URL设计、合理的HTTP状态码使用、清晰的错误处理、灵活的版本控制以及严格的安全性措施,我们能够让RESTful API变得更加“性感撩人”,为Web应用注入新的活力与魅力。
30 3
|
12天前
|
SQL 安全 Go
SQL注入不可怕,XSS也不难防!Python Web安全进阶教程,让你安心做开发!
在Web开发中,安全至关重要,尤其要警惕SQL注入和XSS攻击。SQL注入通过在数据库查询中插入恶意代码来窃取或篡改数据,而XSS攻击则通过注入恶意脚本来窃取用户敏感信息。本文将带你深入了解这两种威胁,并提供Python实战技巧,包括使用参数化查询和ORM框架防御SQL注入,以及利用模板引擎自动转义和内容安全策略(CSP)防范XSS攻击。通过掌握这些方法,你将能够更加自信地应对Web安全挑战,确保应用程序的安全性。
43 3
下一篇
无影云桌面