首页 > 其他分享 >GLB 3d文件在前端页面的展示

GLB 3d文件在前端页面的展示

时间:2024-01-10 17:33:12浏览次数:33  
标签:GLB scene controls camera renderer child 3d 3D 页面

                      GLB 3d文件在前端页面的展示

1. 选择方案

前端实现3D效果的选项有以下四点:

A. CSS 3D技术;

B. SVG;

C. WebGL技术;

D. Canvas或者图片模拟3D

其中最后一种是用其他技术或方法去模拟3D效果,前3种才是浏览器真正意义上支持的3D技术。而three.js直接支持前3种渲染方式。three.js是JavaScript编写的WebGL第三方库。提供了非常多的3D显示功能。使用此组件可以自己绘制3D图像或展示在线及本地的3D模型。

2. 引入

three.js可以使用模块化引入,也可以直接用script来引入。在本项目中使用npm引入。

注意事项:

A. 此组件在几年前由three.js更名为three.所以安装时的命令应为npm install three --save。

B. 引入后在应用中需要加载本地或在线的3d文件,需要用户能够在屏幕上交互,所以还需引入构建器。注意引入的路径,其中第一项为对应文件的构建器。

import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'

import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'

3. 引入后的必要配置

A. 基本配置

//指定区域

        let container = document.getElementById('scene')

        this.scene = new THREE.Scene()

        //新建相机(参数意义:摄像机视锥体垂直视野角度, 摄像机视锥体长宽比,摄像机视锥体近端面, 摄像机视锥体远端面)

        this.camera = new THREE.PerspectiveCamera(70, container.clientWidth / container.clientHeight, 0.01, 10)

        this.camera.position.set(0,1,1)


        // 添加灯光

        this.ambientLight = new THREE.AmbientLight(0xffffff) // 环境光

        this.scene.add(this.ambientLight)


        // 加载模型

        const loader = new GLTFLoader();

        loader.load("../../static/3dtest.glb", (result) => {

            console.log(result)

            result.scene.position.set(0,0,0)

            result.scene.scale.set(0.3,0.3,0.3)

            result.scene.traverse( function ( child ) {

            if ( child.isMesh ) {

                // child.frustumCulled = false;

                // //模型阴影

                // child.castShadow = false;

                // //模型自发光

                child.material.emissive =  child.material.color;

                child.material.emissiveMap = child.material.map ;

            }})

            this.scene.add(result.scene);

        });

        // 设置渲染器

        this.renderer = new THREE.WebGLRenderer({antialias: true})

        this.renderer.setSize(container.clientWidth, container.clientHeight)

        container.appendChild(this.renderer.domElement)

B. 挂载场景和相机

animate() {

       this.renderer.render(this.scene, this.camera)

        requestAnimationFrame(this.animate)

    },

C. 设置控制项

initControls() {

      //controls = new THREE.OrbitControls( camera, renderer.domElement );

      this.controls = new OrbitControls(

        this.camera,

        this.renderer.domElement

      );

      // 如果使用animate方法时,将此函数删除

      //controls.addEventListener( 'change', render );

      // 使动画循环使用时阻尼或自转 意思是否有惯性

      this.controls.enableDamping = false;

      //动态阻尼系数 就是鼠标拖拽旋转灵敏度

      //controls.dampingFactor = 0.25;

      //是否可以缩放

      this.controls.enableZoom = true;

      //是否自动旋转

      this.controls.autoRotate = true;

      //设置相机距离原点的最远距离

      this.controls.minDistance = 1;

      //设置相机距离原点的最远距离

      this.controls.maxDistance = 10;

      //是否开启右键拖拽

      this.controls.enablePan = false;

    },

D. 设置视角重置

onWindowResize() {

      this.camera.aspect = window.innerWidth / window.innerHeight;

      this.camera.updateProjectionMatrix();

      this.renderer.render(this.scene, this.camera)

    },


E. 在vue的mounted周期中集合上述方法

this.init()

    this.initControls()

    this.animate()

    window.onresize = this.onWindowResize;

4. 销毁实例

在项目中发现频繁的在3D场景的页面和其他页面切换会导致页面卡顿,是由于在切换路由时没有清除相关模型导致大量占用了内存;所以需要在离开3D场景销毁模型,并且释放相关的变量,例如renderer、scene、camera、controls。

beforeDestroy() {

    this.scene.remove()

    this.scene = null

    this.camera = null

    this.scene = null

    this.renderer = null

    this.ambientLight = null

    this.controls = null

  }



5. 实现效果

GLB 3d文件在前端页面的展示_3d


标签:GLB,scene,controls,camera,renderer,child,3d,3D,页面
From: https://blog.51cto.com/u_15140246/9183198

相关文章

  • 为什么maven配置完Tomcat且运行之后页面内容没有显示出来?
    1、如何在maven项目中配置一个webapp项目?首先新建一个maven项目项目目录<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"......
  • Unity3D 在移动端的性能优化指标怎样才算合理方面详解
    Unity3D是一款非常强大的跨平台游戏开发引擎,它能够在不同的平台上实现高质量的游戏开发。然而,在移动端上,由于硬件性能的限制,需要进行一定的性能优化才能保证游戏的流畅运行。本文将详细介绍Unity3D在移动端性能优化方面的指标和技术,并给出相关的代码实现。对啦!这里有个游戏开发交......
  • Unity3D 原始对象和占位对象详解
    Unity3D是一款强大的跨平台游戏引擎,提供了丰富的功能和工具,方便开发者创建各种类型的游戏。在Unity3D中,原始对象和占位对象是两个重要的概念。本文将详细介绍原始对象和占位对象的概念、技术详解以及代码实现。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小......
  • Layui官网—按钮 - 页面元素
    向任意HTML元素设定class="layui-btn",建立一个基础按钮。通过追加格式为layui-btn-{type}的class来定义其它按钮风格。内置的按钮class可以进行任意组合,从而形成更多种按钮风格。<buttontype="button"class="layui-btn">一个标准的按钮</button><ahref="/2.7"class="layui-bt......
  • 在Unity中使用动捕数据实时驱动3D数字人,让3D内容创作更简单
    Unity引擎和UE引擎,是当今使用人数最多的游戏引擎软件之一,它们被广泛用于游戏开发、虚拟现实、增强现实和其他交互式3D应用程序的开发。DSFUN-Unity插件能够帮助开发者更便捷地在Unity平台中利用动捕数据进行高效创作,提升项目效率。一、插件放入当前项目文件夹下将资源包包放入unit......
  • WGCLOUD 大屏页面如何设置刷新时间
    大屏页面会自动刷新,默认10分钟会自动刷新一次,如果想修改刷新时间,也可以的,需要升级到v3.5.0或以上版本公众看板页面可以支持自动刷新,监控概要页面和主机列表页面可以支持每10分钟自动刷新一次在server/config/application.yml文件中的配置项copyRight下添加配置项dapingRefreshTimes......
  • IOS移动端,表单input聚焦时页面放大的问题解析以及解决办法
    在移动端开发H5项目中,发现页面在使用iPhone访问的时候,点击input和textarea等文本输入框聚焦focus()时,页面会整体放大,而且失去焦点之后页面不能返回原来的样子。原因:苹果系统觉得点击输入框放大是一个“很好”的体验,就擅自把页面给放大了,触发机制,IOS端input字体应大于15px,否......
  • Vue单页面应用开发指南
    Laravel是一个流行的PHP框架,它具有出色的可测试性,可以帮助开发人员在更短的时间内编写可靠的代码。但是,即使使用了这个框架,也可能会出现测试覆盖率较低的情况。测试覆盖率是指代码中已由测试案例覆盖的部分比例。测试覆盖率越高,代码质量越高。在本文中,我们将分享几种技巧,帮助您提......
  • loopy登录注册模板(可跳转其他页面)
    登录页面账户登入扫码登入账号密码记住密码登录注册</div></form></div><scriptsrc="./js/login.js"></script>......
  • Unity3D UGUI的Button组件的介绍及使用详解
    Unity3D是一款功能强大的游戏开发引擎,而UGUI是Unity3D提供的一套用户界面系统。在UGUI中,Button组件是最常用的组件之一,本文将详细介绍Button组件的使用方法和相关技术细节。对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大......