首页 > 其他分享 >基于three.js的3D展厅Demo功能设计与实现

基于three.js的3D展厅Demo功能设计与实现

时间:2023-07-10 10:55:24浏览次数:46  
标签:demo 代码 three js Demo 展厅 3D

参考网址: http://www.webgl3d.cn/                   https://www.three3d.cn/

 

1、three.js 之 hello world

        功能:立方体在三维空间的转动。     代码位置:demo_0_scene

        目的:理解 场景 / 相机  / 渲染器 / 坐标系 / 几何体 / 材质 / 物体(网格) 的概念。

 

2、three.js 是什么,能做什么

           three.js:一个基于JavaScript的WebGL引擎(说白了就是封装了WebGL的代码库),其库提供大量特性与API可以在浏览器上绘制3D场景。

                           用最简单的一句话概括:WebGL 和 Three.js 的关系,相当于 JavaScript 和 jQuery 的关系。

          知识体系:几何体 / 材质 / 纹理 / 物体 / 外部模型的加载 / PBR材质与贴图 / 光源与阴影 / sprite / 射线 / 碰撞检测/ css2D / css3D / 动画 /  骨骼动画/tweenjs  /粒子特效 / 物理引擎 / 后处理效果 / sharder / 数学的知识(向量,正弦余弦,高等数学的一些函数)/  ......

          是否讲解:     √       √         √          √                  √                         ×                      ×               √         √           √            √            √         √          ×                 ×                 ×               ×           ×                  ×               ×

               

          公司可能用到的地方:

                (1) 在公司官网上用3D效果展示产品。

                (2) 公司门口的大数据看板用3D更震撼。

                (3) 商家后台的数据统计用3D展示更形象。

                (4)  网页/移动端 的3D游戏 /3D展厅。

                           比如:模拟现实的下雨/下雪。物体撞碎的粒子效果。飘扬的国旗。汹涌的海浪。

                (5)  公司的宣传视频。

  

3、搭建3D展厅框架

               Vite  + Vue3 + Yarn + Js   代码位置:demo_10_vite

             (1)用vite搭建开发环境

                     vite官网:https://vitejs.cn/

             (2)部署到服务器上遇到的问题

                           

 

                        解决方式:

                                           

 

                  

 

4、three.js 的基础知识

        (1)在本地运行官方示例 。 代码位置:demo_1_three.js_dev

          (2)  给物体添加纹理(贴图片)。代码位置:demo_2_texture

          (3) 使用射线选中物体。 代码位置:demo_3_ray

          (4) 加载外部模型。 代码位置:demo_4_load_model

          (5) 动画。 代码位置:demo_5_animate

          (6) css2D。 代码位置:demo_6_css2d

          (7) css3D。 代码位置:demo_7_css3d

          (8) sprite。 代码位置:demo_8_sprite

          (9) 盒子模型。 代码位置:demo_9_box

 

         问题1:sprite和Mesh的区别?

         

         问题2:在3D中,显示标签时,选择css2D,css3D,sprte?

               

 

5、3D展厅设计与实现

         演示Demo:https://dayuqa.rongyi.com/hf/qa/test003/demo_3d_1/dist/

         实现的功能有:1、点击空中的三个按钮观看机器人表演。

                                  2、点击地面的三个宝箱有惊喜。

                                  3、亭子/桌子/围墙 支持碰撞检测。                                   4、机器人可以通过台阶进入演讲台。                                   5、点击演讲台的图片可以切换到下一张。                                   6、传送门可以传送机器人。                                   7、视角切换可以点击。

      (1) 碰撞检测的设计与实现

            (1) 碰撞检测 之 射线

            (2) 碰撞检测 之 八叉树

      (2) 虚拟摇杆的设计与实现

      (3) 第一人称 和 第三人称的设计与实现

      (4) 传送带的设计与实现

      (5)  演讲台图片的切换

    (6)使用射线计算台阶的高度

      (7)  让滑动有阻尼的效果

    

6、解决的一些问题

     (1) 手机滑动效果比较生硬。

     (2) 虚拟摇杆 和 手机互动 不能同时操作(检测触摸多个点的问题)。

     (3) IOS 点击 物体 不生效

     (4) 模型没有阴影。

     (5) 默认的场景,Mesh锯齿感很强。

     (6) 控制animate函数内的调用频次。

     (7) 摄像头围绕模型旋转。

     (8) 轨道控制器OrbitControls 引起的冲突。

     (9) 性能监视器 随时观察FPS的变化。

     (10)  演讲台切换图片中 黑纹理的问题。

     (11) 机器人动画控制循环调用引起的问题。

     (12) 从场景中查找mesh的方法。

     (13) 屏幕滑动只接收触摸点高度小于3/4的位置。

     (14) 射线检测 与 移动 顺序的问题。

     (15) 模型放大缩小的问题。

     (16) 如何把射线画出来。

 

 

7、3D展厅性能优化

     优化前的问题: 手机发烫,FPS较低。

     (1) 删掉没用的模型和功能。 下雨功能删除后,性能提升很大。雨滴class 只new 不 循环调用也影响性能。

     (2) 删掉没用的日志。 循环日志消耗性能也很大。

     (3) 同时渲染css2d/css3d  导致render的渲染性能变低。

     (4)  事件的合并。

     (5) 区分PC/ Android/ IOS的事件,删除重复的事件。比如 click事件, 在android手机同时支持mouse事件和touch事件。

     (6) 碰撞检测的数组 不要添加重复的Mesh。

     (7) camera near 和 far参数的设置。

 

8、3D展厅待解决的问题与方案

     (1) 在亭子下面,FPS降低的原因

     (2) 演讲台首次点击加载慢的原因

     (3) 超多模型的加载

     (4) 手机浏览器 / 支付宝 打不开的问题

     (5) 视角切换造成虚拟摇杆方向错乱的问题(滑动的方向)

     (6) IOS 视频背景音乐 不播放 或 播放但弹出全屏的问题。

     

标签:demo,代码,three,js,Demo,展厅,3D
From: https://www.cnblogs.com/maohuidong/p/17540363.html

相关文章

  • vscode + nodesjs import 和 require 使用的两种case
    在环境nodejs+vscode的环境下,使用nodejs作为js的解释器, 在这种环境中直接使用export/import是无法正常工作的。 解决方式有两个:1.npminit-y胜场package.json修改内容增加: "type":"module",{"name":"javascript","version":"1.0.0&qu......
  • js复制文本到剪切板
    参考:https://blog.csdn.net/evanyanglibo/article/details/127851585//复制文本functioncopyText(text){varelement=createElement(text);element.select();element.setSelectionRange(0,element.value.length);document.execCommand('copy');el......
  • 黑马程序员前端JS基础视频课程(pink老师)
    共计76个视频,20小时时长课程分为三大块1.JavaScript基础2.webAPIs3.JS进阶之前看过pink老师的css+html讲的那是扛扛,刚刚在其他社区找到这套课程特意分享给大家! download:黑马程序员前端JS基础视频课程(pink老师) ......
  • React18+TS+NestJS+GraphQL 全栈开发在线教育平台
    第1章这里,将带你进行一次全面,高效的进阶试看3节‖36分钟学习本课程你能得到什么?不论是技术提升,职场晋升,面试跳槽,你都会有所收获。第2章了解用户需求,懂得如何做项目试看4节‖54分钟本章让大家了解一个企业级项目的用户需求是什么,有哪几种角色,是如何使用我们的产品的,知道......
  • Cesium中的QuadtreeTile.js类
    /***Asingletileina{@linkQuadtreePrimitive}.**@aliasQuadtreeTile*@constructor*@private**@param{Number}options.levelThelevelofthetileinthequadtree.*@param{Number}options.xTheXcoordinateofthetileinthequadtree......
  • Python调用 JS -PyExecJS, Python 调用 JS -js2py
    Python调用JS-PyExecJS日常Web端爬虫过程中,经常会遇到参数被加密的场景,因此,我们需要分析网页源代码通过调式,一层层剥离出关键的JS代码,使用Python去执行这段代码,得出参数加密前后的Python实现//计算两个数的和functionadd(num1,num2){returnnum1+num2;}......
  • 创建 Code Interpreter Demo: 一次实践的探索
    好消息,好消息,CodeInterpreter可以测试使用了!!!在这篇文章中,我们将探索如何创建一个CodeInterpreterDemo。提交一个2023年1-5月份的融资记录数据,让它来帮我们分析一下这些数据。执行的过程如下:生成图表的代码我们也可以找到,需要做调整的话,可以把代码复制到本地进行修......
  • JS 中单例模式的具体实现细节和实践
    通用的创建单例模式的方法:1创建实例对象的职责和管理单例的职责分别放置于两个方法中。2两个方法可以互相独立而互不影响。3惰性加载单例模式,等到用到的时候才加载。1letcreateSingle=function(fn){2letresult;3returnfunction(){4//app......
  • jmeter--后置处理器之json提取器介绍和使用
    1、json提取器使用场景jmeter后置处理器中,有三种提取器组件:json提取器、xpath提取器、正则表达式提取器,这三种组件的功能相同,只是分别使用三种不同的方式进行提取数值。一般在使用jmeter来调接口时,B接口的请求参数值是A接口的响应值时,需要通过提取器组件来提取出A接口相应中的......
  • JS设置网页图标
    <body><script>//设置网页图标functionseticon(url){varlink=document.querySelector("link[rel*='icon']")||document.createElement('link');link.type='image/x-ico......