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


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



相关文章
|
2月前
|
移动开发 JavaScript 前端开发
ThreeJs搭建web3D场景
这篇文章讲解了如何使用Three.js来搭建web端的3D场景,并介绍了创建3D项目的基本要素。
74 1
|
7月前
|
JavaScript 前端开发 CDN
Threejs搭建web3D场景
这是一个基本的Three.js 3D场景的示例。你可以根据自己的需求添加更多的3D元素、纹理、光照和交互功能。
95 4
|
安全 图形学 数据安全/隐私保护
基于云服务器发布Web虚拟中药展厅
通过Unity3D结合3d建模技术,实现对学校的中药博物馆的虚拟重建,并且通过阿里云服务器将项目部署到云服务器。实践课题研究旨在学习虚拟博物馆的构建过程,对中医中药文化传播,虚拟博物馆建设具有中药意义。用户可通过访问Web的端的实现对学校博物馆的漫游交互,在一定程度上打破了实体博物馆的时间、空间、人员等的限制。
基于云服务器发布Web虚拟中药展厅
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
158 3
|
1月前
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
169 45
|
15天前
|
前端开发 安全 JavaScript
2025年,Web3开发学习路线全指南
本文提供了一条针对Dapp应用开发的学习路线,涵盖了Web3领域的重要技术栈,如区块链基础、以太坊技术、Solidity编程、智能合约开发及安全、web3.js和ethers.js库的使用、Truffle框架等。文章首先分析了国内区块链企业的技术需求,随后详细介绍了每个技术点的学习资源和方法,旨在帮助初学者系统地掌握Dapp开发所需的知识和技能。
2025年,Web3开发学习路线全指南
|
22天前
|
存储 前端开发 JavaScript
如何在项目中高效地进行 Web 组件化开发
高效地进行 Web 组件化开发需要从多个方面入手,通过明确目标、合理规划、规范开发、加强测试等一系列措施,实现组件的高效管理和利用,从而提高项目的整体开发效率和质量,为用户提供更好的体验。
27 7
|
26天前
|
开发框架 搜索推荐 数据可视化
Django框架适合开发哪种类型的Web应用程序?
Django 框架凭借其强大的功能、稳定性和可扩展性,几乎可以适应各种类型的 Web 应用程序开发需求。无论是简单的网站还是复杂的企业级系统,Django 都能提供可靠的支持,帮助开发者快速构建高质量的应用。同时,其活跃的社区和丰富的资源也为开发者在项目实施过程中提供了有力的保障。
|
25天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
35 2