【three.js沉浸式商城】使用three.js实现模型展示

沉浸式商城主打使用模型展示产品信息,并提供不同展示背景。
由此产生的需求是:
1. 3D模型在网页上展示
2. 切换hdr背景,并调节环境光

接下来介绍实现思路

具体实现思路:

计划使用three.js来实现3D展示功能。
Threejs是一款WebGL三维引擎,开发文档three.js

在整个项目中新建Base3d.js
在这里插入图片描述
然后新建Scene.vue文件,引用3d库,并设置挂载响应式对象

<template>
  <div class="scene" id="scene"></div>
</template>

<script setup>
import Base3d from "../utils/Base3d.js";
import { reactive, onMounted } from "vue";
const data = reactive({
  base3d: {},
});

onMounted(() => {
  data.base3d = new Base3d("#scene");
});
</script>

导入需要的库

// export default Base3d;
import * as THREE from "three";
import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader";
// 导入控制器,轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
// 导入模型解析器
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";

接着新建一个构造器存放需要的变量,传入selector选择器和一个onFinish函数。
选择器的作用是定位到three.js要渲染的页面,在本项目中传入的是#product

  constructor(selector, onFinish) {
    this.container = document.querySelector(selector);
    this.camera;
    this.scene;
    this.renderer;
    this.model;
    this.panzi;
    this.animateAction;
    this.clock = new THREE.Clock();
    this.onFinish = onFinish;
    this.init();
    this.animate();
    this.progressFn;
  }

创建好构造器后,进行基本设置初始化。首先是对场景进行初始化,然后初始化相机,因为相机位置的变化才能记录物体的移动

  init() {
    //   初始化场景
    this.initScene();
    // 初始化相机
    this.initCamera();

    // 初始化渲染器
    this.initRenderer();
    // 控制器
    // this.initControls();
    // 添加物体
    this.addMesh();

  }

场景初始化中新建一个场景

  initScene() {
    this.scene = new THREE.Scene();

  }

初始化透视摄像机

  initCamera() {
    this.camera = new THREE.PerspectiveCamera(
      45,
      window.innerWidth / window.innerHeight,
      0.25,
      200
    );
    this.camera.position.set(-1.8, 0.6, 2.7);
  }

初始化渲染函数,渲染的尺寸大小设置为窗口大小
因为背景图片的hdr中带有不同的光照信息,我们需要在渲染器中设置色调映射
做好渲染设置后,使用appendChild添加所有渲染的元素

  initRenderer() {
    this.renderer = new THREE.WebGLRenderer({ antialias: true }); //抗锯齿
    // 设置屏幕像素比
    this.renderer.setPixelRatio(window.devicePixelRatio);
    // 渲染的尺寸大小
    this.renderer.setSize(window.innerWidth, window.innerHeight);
    // 色调映射
    this.renderer.toneMapping = THREE.ACESFilmicToneMapping;
    this.renderer.toneMappingExposure = 3; //设置曝光值
    this.container.appendChild(this.renderer.domElement); //
  }

初始化轨道控制器,实现在场景中全景旋转场景的效果

  initControls() {
    this.controls = new OrbitControls(this.camera, this.renderer.domElement);
  }

设置RGBELoader来加载场景hdr纹理,把纹理值赋给场景背景和环境,当点击选择切换场景时,会将场景名称传到setEnvMap中,对应加载hdr

  setEnvMap(hdr) {
    new RGBELoader().setPath("./files/hdr/").load(hdr + ".hdr", (texture) => {
      texture.mapping = THREE.EquirectangularReflectionMapping;
      this.scene.background = texture;
      this.scene.environment = texture;
    });

到了这个阶段,我们已经有了一个设置好的渲染器,但是还没有进行渲染。
接下来在render()中进行渲染。由于网页页面每帧都在刷新,所以需要设置一个动画循环不断地绘制帧画面,保证渲染流畅。

  render() {
    this.renderer.render(this.scene, this.camera);
  }
  animate() {
    this.renderer.setAnimationLoop(this.render.bind(this));
  }

场景初始化了,渲染器也设置了,场景选择也写好了,终于迎来了最基础也是最重要的一步——设置模型
因为模型一般比较大,加载模型需要时间,所以可以设置一个进度来观察加载程度,使用异步函数进行封装。
同时,为了更好地展示产品效果,选择采用播放动画的方式来替代自主操作,这样更能全方位展示产品最好的角度。

  setModel(modelName){
    return new Promise((resolve,reject) => {
      const loader = new GLTFLoader().setPath("files/gltf/");
      loader.load(modelName,(gltf)=>{
        this.model&&this.model.removeFromParent();
        
        this.model = gltf.scene.children[0]; //子元素的第一个就是模型
        if('bag2.glb'==modelName&&!this.panzi){
          // this.panzi = gltf.scene.children[5];
          
          // this.scene.add(this.panzi)
          this.scene.add(gltf.scene);
          // 修改摄像头为模型摄像头
          this.camera = gltf.cameras[0]
          // 调用动画
          this.mixer = new THREE.AnimationMixer(gltf.scene.children[1]); //动画混合器,播放动画
          this.animateAction = this.mixer.clipAction(gltf.animations[0]); //调度加载动画
          // 设置动画播放时长
          this.animateAction.setDuration(20).setLoop(THREE.LoopOnce); //设置播放20s,只播放一次
          // 设置播放完动画后停止
          this.animateAction.clampWhenFinished = true;



          // 设置灯光
          this.spotlight1 = gltf.scene.children[2].children[0];
          this.spotlight1.intensity = 1;
          this.spotlight2 = gltf.scene.children[3].children[0];
          this.spotlight2.intensity = 1;
          this.spotlight3 = gltf.scene.children[4].children[0];
          this.spotlight3.intensity = 1;

          
        }
        this.scene.add(this.model);
        resolve(this.modelName+"模型添加成功");

      },(e)=>{
        // 模型加载进度
        this.onProgress(e);
      });
      
    });


  }

如果一味播放动画,会使得网页交互效果单调。为了增加网页趣味性,通过监听鼠标滚轮事件来对播放的动画进行交互。滚轮的滚动速度决定了动画的播放速度,滚轮暂停,动画也暂停。向前滚轮,动画向前播放,向后滚轮,动画向后播放。

这里的滚动使用到了防抖。
防抖,防抖就是当触发一个事件不会立即执行,会等待 n 秒后再执行该事件,如果在等待 n 秒期间你再次出发,则会重新计时,也就是说防抖不管你触发多少次这个事件,永远只有一次在执行,并且执行的是最后一次
什么意思,针对该项目具体来说,就是我需要滑动一次滚轮的时候,动画播放一段,然后暂停。如果持续滑动滚轮,那动画就持续播放不会暂停。
用防抖的意思来说,就是触发一次滚轮事件的时候,等待n秒(这n秒动画播放),然后执行暂停事件。

  onMouseWheel(e) {
    // console.log(this.animateAction);
    // 设置播放速度,先监听滚轮方向
    let timeScale = e.deltaY > 0 ? 1 : -1; //获取滚轮方向
    this.animateAction.setEffectiveTimeScale(timeScale);
    this.animateAction.paused = false; //去除暂停状态
    // 播放动画
    this.animateAction.play();

    
    if(this.timeoutid){
      clearTimeout(this.timeoutid);
    }
    this.timeoutid = setTimeout(()=>{
      this.animateAction.halt(0.5);
    },300)
  }

动画章节完结~~~

商城

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: three.js是一款基于webGL的JavaScript 3D引擎,可以实现3D建模、动画和渲染。全屋VR漫游是一种基于虚拟现实技术,通过VR眼镜等硬件设备,让用户像真实地在室内走动一样,进行家居空间的探索和体验。 实现全屋VR漫游需要进行以下步骤: 1.建立房屋模型使用3D建模软件建立房屋模型,并导入到three.js中。 2.添加交互控制:通过three.js自带的OrbitControls.js库,添加交互控制,让用户能够自由移动和旋转视角。 3.添加VR支持:引入WebVR API和WebVR polyfill插件,使全屋VR漫游能够在VR设备上运行,增强用户体验和交互感。 4.优化性能:对场景中的模型、纹理和灯光等要进行优化,减少性能消耗,提高页面响应速度和流畅度。 5.制作场景动画:通过动画制作软件和three.js提供的Tween.js库,制作房屋内的动画效果,如灯光变化、窗帘拉开等,增强场景的真实感和沉浸感。 6.分享源码:将实现全屋VR漫游的源码上传到开源社区,供其他开发者学习参考,促进开源文化和技术共享的发展。 总之,three.js实现全屋VR漫游需要综合考虑3D建模、交互控制、VR支持、性能优化、场景动画等方面,将它们整合起来,才能打造出一款高质量的全屋VR漫游应用。 ### 回答2: 作为一款WebGL三维引擎,three.js提供了各种各样的功能,使得构建VR漫游成为可能。实现全屋VR漫游需要用到以下几个步骤: 1.建模:利用3D建模软件,比如Blender, SketchUp等,建立卧室、客厅等各个房间的模型,导出为.obj或.glTF格。 2.引入three.js:在网页中引入three.js库并创建场景,载入相机、灯光、纹理等必要元素。 3.载入模型使用three.js提供的Loader载入之前建立好的模型,并将每个模型添加到场景中。注意,此时模型需要进行缩放、旋转、位移等操作,使其与场景匹配。 4.音效和交互:three.js提供了各种声音和动作库,可以为模型添加动画和音效,丰富用户体验。例如,点击灯具触发灯光开关等。 5.优化:考虑到VR漫游需要在各种设备上流畅运行,需要优化模型和纹理的大小和数量,减少不必要的资源开销。 以上是实现全屋VR漫游的主要步骤。具体的代码实现可以搜索相关的文档和教程,借助一些现成的库和框架。总之,这需要细心和耐心,不断实践和优化,才能完成一个高质量的VR漫游应用。 ### 回答3: Three.js是一款JavaScript 3D图形库,可以用来实现3D场景、动画、模型等。全屋VR漫游是一种实时交互的3D场景,用户可以通过头戴显示器或其他VR设备,在虚拟现实中漫游并与场景进行交互。 要实现全屋VR漫游源码,首先需要准备一个3D模型,包括所有房间、家具、装饰品等。这个模型可以使用各种3D建模软件制作,例如Blender、Maya等。 接下来,使用Three.js加载这个模型,并进行场景渲染。可以使用Three.js中的摄像机、灯光、材质等,来优化场景的效果和性能。 为了实现交互功能,需要使用Three.js中的控制器,例如OrbitControls、DeviceOrientationControls等,让用户可以通过鼠标、键盘、触屏等方进行操作。 最后,为了实现全屋VR漫游,需要与VR设备进行交互。可以使用WebVR API,让Web应用程序与VR设备进行连接,并将场景渲染到VR设备的显示器上。 总的来说,实现全屋VR漫游源码需要对Three.js有一定的了解,同时要有一定的3D建模技能和VR设备的调试经验。但通过学习和实践,可以让这项技术变得更加容易上手。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值