Threejs在vue中使用(场景、相机、渲染器、gltf模型添加、环境贴图等)

在Vue中使用three.js 近期项目需要做3D效果,因为以前没做过,所以准备学习Three.js来完成项目需求, 可是找了很多地方都只有很少的一些在Vue中使用three.js的文章 经过自己的整理,将详细步骤分享给大家 1.首先利用npm安装three.js,具体操作代码如下: npm install three 若安装了淘宝镜像,则操作命令为: cnpm install three 2.接下来利用npm安装轨道控件插件: npm install three-orbit-controls 3.接下来安装加载.obj和.m 阅读详情
AI摘要

本文介绍了如何在Vue项目中使用Three.js创建3D场景、设置相机、渲染器、添加gltf模型和环境贴图,以及实现交互功能。内容涵盖了Three.js的安装、场景、相机类型、光照、渲染过程、模型导入和环境映射,还讨论了解决模型显示为黑色的问题。

前言

Three.js ( Javascript 3D library ) 是基于原生WebGL封装运行的三维引擎,WebGL可以看成是浏览器给我们提供的接口,在JavaScript中可以直接用这些API进行3D图形的绘制;而Three.js它封装了诸如场景、灯光、阴影、材质、贴图、空间运算等一系列功能,让你不必要再从底层WebGL开始写起。 Three.js是通过对WebGL接口的封装与简化而形成的一个易用的图形库。
Three.js开发3D应用,通常包括渲染器(Renderer)、场景(Scene)、照相机(Camera),以及在场景中创建的物体,光照等。

一、threejs的安装

1、NPM的安装

   npm install --save three

2、组件内使用

import * as THREE from "three";

二、场景

1、场景(scene)介绍

它相当于一个容器,在3d场景中要展现的所有物体、灯光、摄像机等都必须添加到这个容器里面。

2、创建场景对象Scene

Var scene = new THREE.Scene();

3、设置场景的背景色

scene.background = new THREE.Color("#F7F7F7");

三、相机

在threejs中提供了一系列的相机,其中最常用到的是 PerspectiveCamera(透视相机) 和 OrthographicCamera(正交投影相机),它们之间的区别在于透视相机在观察场景中的物体时,呈现出来的物体近大远小,最接近自然的视图。正交投影相机无论从哪个角度观察物体,大小都是一样的。

1、PerspectiveCamera创建, 确定视野范围

let camera = new THREE.PerspectiveCamera(fov, aspect, near, far);

参数说明:
fov: 视场;垂直方向的观察角度,也就是眼睛上下俯视的观察角度。
aspect: (长宽比)是照相机水平方向和竖直方向长度的比值。
near: (近面距离)相机到视景体最近的距离。
far: (远面距离)相机到视景体最远的距离。

2、确定相机的位置

this.camera.position.set(0, 10, 20);

3、操作相机

在很多场景下,我们需要移动相机来观察物体的各个角度,这时需要相机操作控件来控制相机的位置。常用的控制器有:OrbitControls(轨道控制器)、TrackballControls(轨迹球控制器)

OrbitControls:可以使用鼠标控制场景中的对象围绕场景中心旋转和平移
TrackballControls:可以使用鼠标(或控制球)来轻松移动、平移和缩放场景
Pointerlockcontrols:第一人称控制器,以第一人称视角观察室内场景

1)添加控制器

controls = new OrbitControls(camera, canvas);

2)设置控制器聚焦点

 controls.target.set(0, 5, 0);

四、光照

在场景中,如果没有光源,那所有的物体都将看不见。最常用的几种光源是AmbientLight、PointLight、SpotLight、DirectionalLight。
AmbientLight:环境光;全局均匀地照亮场景中的所有对象。
PointLight:点光源;从空间中的一点向所有方向发射光线。
SpotLight:聚光源;投射出的是类似圆锥形的光线。
DirectionalLight:平行光;比如太阳光。
例:

 {
    const color = 0xf1f1f1;  //光的颜色
    const intensity = 1;    //光的强度
    const light = new THREE.DirectionalLight(color, intensity);
    light.castShadow = true;  //开启castShadow生成动态的投影
    light.position.set(10, 300, 20);//设置灯光的位置
    this.scene.add(light);//将灯光添加到场景中
  }

五、渲染器

渲染器决定了渲染的结果应该画在页面的什么元素上面,首先在需要渲染的位置添加页面元素

 <canvas id="con"></canvas>

1、渲染器创建
WebGLRenderer:WebGL渲染器使用WebGL来绘制场景(如果设备支持),使用WebGL能够利用GPU硬件加速从而提高渲染性能。

  const canvas = document.querySelector("#con");
  var renderer = new THREE.WebGLRenderer({
           canvas,
           antialias: true,  //默认为false。是否开启反锯齿
           alpha: true,      //默认为false。是否可以设置背景色透明
       });

2、开始渲染

  this.renderer.render(scene, camera);

scene:前面定义的场景。
camera:前面定义的相。

3、domElement属性-canvas对象

  const canvas = this.renderer.domElement;

4、循环渲染

  requestAnimationFrame(this.render);

requestAnimationFrame(render):这个函数就是让浏览器去执行一次参数中的函数,这样通过上面render中调用requestAnimationFrame()函数,requestAnimationFrame()函数又让rander()再执行一次,就形成了循环渲染。

六、模型添加

3D模型的格式有很多种类可供选择,但每一种格式都具有不同的目的、用途以及复杂性,常用的模型有obj、gltf等等;

OBJ:是一种文本格式存储的模型文件格式,只能存储静态模型;
gltf: 以JSON(.gltf)或二进制(.glb)格式提供模型数据;glTF资源可以传递一个或多个场景,包括网格,材质,纹理,外观等等。

1、引入gltf模型加载器

import GLTFLoader from "three/examples/js/loaders/GLTFLoader";

2、实例化加载器并添加到场景中

const gltfLoader = new GLTFLoader();  //实例化加载器
       gltfLoader.load("../../../../static/gltf/zoom/waibucj.gltf", gltf => {
       const root = gltf.scene;    
       root.castShadow = true;    //  投影
       root.traverse(
       function(child) {
            if (child.isMesh) {
//设置mesh的一些属性
                child.material.metalness = 0.8;  //金属度 
                child.material.roughness = 0.3;  //粗糙度
              }
            },
            undefined,
            function(error) {
              console.error(error);
             }
);
       this.scene.add(root); //将该模型添加到场景中
      });
    }

七、环境贴图

在threejs中环境贴图就是利用三维来模拟周边的环境,它通过HDR图像来实现;

1、引入RGBELoader加载器

   import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader";

2、如何加载hdr环境贴图

      //加载hdr
      {
        var that = this;
         // 使用hdr作为背景色
        var pmremGenerator = new THREE.PMREMGenerator(this.renderer);
        pmremGenerator.compileEquirectangularShader();//阴影
        new RGBELoader()
          .setDataType(THREE.UnsignedByteType)
          .load("../../../../static/gltf/env4.hdr", texture => {
            const envMap = pmremGenerator.fromEquirectangular(texture).texture;
            this.scene.environment = envMap;  // 给场景添加环境光效果
            //this.scene.background = envMap;// 给场景添加背景图
            pmremGenerator.dispose();
          });
      }

八、交互

在物联网项目中,所有三维物体与鼠标交互样式采用的是动态收缩变化的点,此方法弊端是有多少个交互位置就需要创建多少个动态点;

1、动态点实现方式

要实现效果图
在这里插入图片描述

a) 创建一个三维物体对象

 this.obj = new THREE.Object3D();

b) 创建两个圆的物体
1)外部透明的圆

  const geometry = new THREE.CylinderGeometry(8, 8, 0.2, 40, 40); //形状
        const material = new THREE.MeshPhongMaterial({
          color: 0x01cd88,   //物体颜色
          opacity: 0.15,     //物体透明度
          transparent: true
        });    //物体材质
        const cube = new THREE.Mesh(geometry, material);  //创建网格物体

2)内部的圆

        const geometry1 = new THREE.CylinderGeometry(4, 4, 1, 40, 40);
        const material1 = new THREE.MeshPhongMaterial({
          color: 0x01cd88
        });
        const cube1 = new THREE.Mesh(geometry1, material1);

3)将内部和外部圆组合在一起,添加到第一步创建的三维物体对象,并设置位置添加到场景

    this.obj.add(cube);
    this.obj.add(cube1);
    this.obj.position.set(-220, 192, 121); //设置物体位置
    this.scene.add(this.obj);   //添加到场景中

4)动画效果添加(此方法执行放在render方法中,它才会一直被执行)
//气泡框动画

    BubbleAnimation: function() {
      var rot = 0;
      if (this.mark == 1) {
        const speed = 1 - 1 * 0.1;
        rot = 0.006 * speed;
        if (this.obj.scale.x <= 1) {
          this.mark = 0;
        }
        this.obj.scale.x -= rot;
        this.obj.scale.y -= rot;
      } else {
        const speed = 1 + 1 * 0.1;
        rot = 0.006 * speed;
        if (this.obj.scale.x > 1.4) {
          this.mark = 1;
        }
        this.obj.scale.x += rot;
        this.obj.scale.y += rot;
      }
      this.obj.lookAt(this.camera.position);//使物体始终朝向摄像机
    }

九、遇到过问题

问题一:模型加载到场景中是黑色的
解决办法:
1)检查是否是模型本身导出问题。可用在线查看器查看导出的模型(https://gltf-viewer.donmccurdy.com/)
2)添加环境贴图

vue使用three.js实现外部加载模型的自动缩放的效果(进一步优化) 一、vue使用three.js加载外部模型自适应渲染区域大小 1、实现效果 当在http://localhost:8080/#/scale?name=tree2.glb 中name参数中输入不同名字的.glb模型时,都可以自动进行缩放来适用所定义页面的大小。 但需要注意的是:模型需要为.glb格式。若不是glb格式,可以通过blender软件进行导入后再导出为glb格式。 2、实现思路 (1)定... 阅读详情

相关推荐

【threeJS + Vue3】导入glft模型

小编的第一个3d页面

zxsy19966的博客 1888

一篇文章了解 threejs 在 vue 项目中的基本使用

threejs 是运行在浏览器中的 3D 引擎,是JavaScript编写的WebGL第三方库。提供了非常多的3D显示功能。开发者可以用它创建各种三维场景,包括了摄影机、光影、材质等各种对象。可以在它的主页上看到许多精彩的演示。不过,这款引擎还处在比较不成熟的开发阶段,其不够丰富的 API 以及匮乏的文档增加了初学者的学习难度(尤其是文档的匮乏)。在讲解 threejs 的时候,我们通过一个基本的简单的案例,来实现一个小的效果,然后把常用的 API、工具、功能稍微说一下哈!

“跟他人学,和自己比” 2万+

three.js加载gltf模型常见问题与Blender导出优化指南

本文深入探讨了使用three.js加载gltf模型时常见的路径、颜色、材质和层级问题,并提供了详细的解决方案。同时,文章重点介绍了从Blender导出glTF/GLB模型时的关键优化设置,如坐标系转换、应用修改器和PBR材质导出,旨在帮助开发者高效解决3D模型在Web端加载与显示的核心难题。

weixin_29008055的博客 417

three.js+vue3打造VR掌上博物馆

本课程通过three.js+vue3框架打造掌上VR博物馆,可以在手机端和PC端全方位观察文物和书画。通过本次课程您将学会:1.vue3开发环境搭建及基本用法。2.three.js基本用法及操作模型。3.书画及文物的渲染及操作。4.如何利用手机来对现实中的文物进行3D建模。

Three.js入门指南:从环境搭建到3D场景渲染全流程解析

WebGL作为底层JavaScript API,允许在浏览器中直接利用GPU进行2D和3D图形渲染,但其原生API较为复杂。Three.js通过封装WebGL底层细节,提供了一套更高级、面向对象的API,显著降低了Web端3D开发的门槛。该技术实现了跨平台、免插件的3D图形展示,在交互式产品展示、沉浸式数据可视化等领域具有重要价值。本文聚焦于Three.js的下载方式选择、核心概念理解以及场景搭建实践,特别针对glb模型导入后显示异常等常见问题提供了解决方案,并深入探讨了NDC坐标在图形渲染管线中的作用。

weixin_34275734的博客 663

Vue2 结合 threejs 打造动态3D登录界面:从建模导入到交互实现

本文详细介绍了如何利用Vue2和threejs打造动态3D登录界面,从建模导入到交互实现的全过程。通过实战案例展示了3D模型加载、场景初始化、鼠标交互效果等关键技术点,帮助开发者快速掌握现代Web应用的3D视觉开发技巧,提升用户体验。

weixin_29018335的博客 309

threejs 导入gltf模型并添加Sprite标注,在vue结合websocket实时更新贴图的信息

效果展示: 1. 导入依赖 import * as THREE from 'three' import {GLTFLoader} from 'three/examples/jsm/loaders/GLTFLoader'; import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls'; 2.创建相机、场景、光源、渲染器、控制器 //创建相机 initCamera() { this.camera =

Zwain_M的博客 5802

Three.js + Vue3 实现3D模型展示:从模型加载到精灵图动画的全流程

本文详细介绍了如何使用Three.js和Vue3实现3D模型展示的全流程,包括模型加载优化、精灵图动画实现和高级相机控制技巧。通过GLTF格式加载3D模型,结合Vue3的Composition API,开发者可以构建高性能的3D可视化应用,提升用户体验。

7z8x2c4v6b9的博客 533

用threejs封装3d渲染器

InitBase() //初始化基础设施InitModels() //初始化模型renderer.setAnimationLoop(animation) //循环渲染})

hyy的博客 818

Vue2 结合 threejs 与 GSAP 打造沉浸式交互登录页

本文详细介绍了如何使用Vue2结合threejs与GSAP打造沉浸式交互登录页。通过Vue2的响应式特性管理3D场景状态,threejs提供专业的WebGL渲染能力,GSAP实现流畅交互动画,开发者可以高效创建高性能、兼容性强的3D登录页。文章包含环境搭建、模型加载优化、GSAP动画实现等实战技巧,帮助开发者快速掌握这一技术组合。

weixin_29001423的博客 212

Vue+Three.js,三维3d模型 虚拟人 glb gltf

原因是设备的物理像素分辨率与CSS像素分辨率的比值的问题,我们的canvas绘制出来后图片因为高清屏设备的影响,导致图片变大,然而我们在浏览器的渲染窗口并没有变大,因此图片会挤压缩放使得canvas画布会变得模糊。该值也可以被解释为像素大小的比例:即一个CSS像素的大小相对于一个物理像素的大小的比值。渲染结果的横向尺寸和纵向尺寸的比值,这里我们使用的是 浏览器窗口的宽高比。透视相机用来模拟人眼所看到的景象,物体的大小会受远近距离的影响,它是3D场景的渲染中使用得最普遍的投影模式。

南七小僧的学海无涯 3569

three.js和vue.js学习 -- 创建一个3d模型demo

写在开头 转载链接: https://zhuanlan.zhihu.com/p/333615381 https://techbrood.com/threejs/docs 属于对该项目的学习,对于其中基础部分的细分和笔记 准备 three的流程参考图 Part1:创建项目,引入three 同样使用vue-cli脚手架直接搭建vue项目 cd 到当前项目目录下 vue init webpack xxxxx xxx表示项目名称 安装 three npm install -D three 引入three im

qq_44787943的博客 2744

017:vue+threeJS 加载gltf文件

GLTF格式是一种高效传输、加载3D内容的开放格式规范。它以JSON(.gltf)格式或二进制(.glb)格式提供,外部文件可以存储贴图(如.jpg、.png)和额外的二进制数据(.bin)。一个GLTF组件几乎包含所有的三维模型相关信息的数据,可传输一个或多个场景,包括网格、材质、贴图、蒙皮、骨架、变形目标、动画、灯光以及摄像机。

大剑师兰特的GIS世界 385

Vue3 + Three.js 实战入门:从零搭建可交互3D场景(含模型加载与性能优化)

本文面向有Vue基础但Three.js零基础的前端开发者,完整演示如何在Vue3项目中集成Three.js创建交互式3D场景。内容涵盖:Vite环境初始化、Three.js核心三要素(场景/相机/渲染器)配置、光照与基础几何体创建、轨道控制器实现交互、glTF模型加载、动画循环与响应式适配。文章提供可运行的完整代码示例,并包含5个关键性能优化技巧和常见错误排查指南,帮助开发者快速上手3D可视化开发。

qq_1208409371的博客 1662

SNAP计算哨兵二号的叶面积指数(LAI)

对于哨兵二号数据以及LANDSAT8数据,SNAP提供已经集成好的模块计算LAI。在Optical->Thematic Land Processing->Biopyhsical Processor目录下面。 对于经过Sen2Cor处理好的数据,需经过重采样才可进行计算。重采样工具在Raster->Geometric->Resampling。 如果选择Biopyhsical Processor S2_10m进行计算,需要将所有的波段都重采样为10米(哨兵二号的第二波段为10米,可据此波

gxwwww的博客 9414

企业微信群机器人Webhook配置全攻略:从创建到发送消息的完整流程

本文详细解析了企业微信群机器人的Webhook配置全流程,从创建机器人、获取关键Webhook地址,到使用代码发送文本、Markdown等多种消息类型。内容涵盖安全加固、错误处理及与CI/CD等系统集成的实战指南,帮助企业快速构建高效、稳定的内部通知系统。

ik678901的博客 1779

Three.js 场景编辑器 (Vue3 + TypeScript 实现)

因此我决定开发一个基于 Vue3 + TypeScript 的 Three.js 场景编辑器,保留核心功能的同时,提供更友好的开发体验。

huhuan123456的博客 3397

从Arduino IDE到Atmel Studio:ATmega328P开发的进阶之路

本文探讨了从Arduino IDE转向Atmel Studio进行ATmega328P开发的进阶路径。通过对比两者差异,详细介绍了Atmel Studio的环境配置、寄存器操作思维、烧录方法及高级调试功能,帮助开发者突破Arduino的封装限制,实现对单片机底层硬件的精细控制与性能优化,提升嵌入式开发的专业能力。

weixin_29193259的博客 121

uniapp vue3 使用three.js

therr.js文件 和 therr.js插件 自行下载。

weixin_50236740的博客 2497

华为数通---配置风暴控制案例

风暴控制可以通过阻塞报文或关闭端口来阻断广播、未知组播和未知单播报文的流量。

2301_77081516的博客 1624

手把手教你用U盘制作Win11启动盘:从PE工具到系统安装全流程

本文提供了一份详尽的Windows 11启动盘制作与系统安装全流程指南。从选择合适的U盘和PE工具开始,重点讲解了如何正确制作包含EFI引导分区的启动盘,并详细演示了在PE环境下进行GPT分区、使用CGI工具安装系统镜像,以及首次启动后的关键设置步骤,帮助用户轻松完成从零到一的系统安装。

weixin_28475533的博客 1284

Three.js--》实现3d水晶小熊模型搭建

今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。

ztK63LrD的博客 2638

ArduPilot飞控系统代码解读及架构分析

ArduPilot飞控系统是一个复杂而强大的系统,通过模块化设计和分层架构,实现了灵活的飞行控制功能。模块化设计: 各个功能模块相对独立,便于维护和扩展多种飞行模式: 满足不同的飞行需求强大的控制算法: 实现稳定的姿态和位置控制完善的安全机制: 保障飞行安全丰富的配置选项: 通过参数系统实现高度可定制性这种架构使ArduPilot能够适应从简单的多旋翼到复杂的自主飞行器等各种应用场景。类结构分析:Mode基类 (mode.h/mode.cpp)

fengforky的专栏 3018

threejs-汽车模型换肤

这是我之前发zhihu上的一个文章,很久了,现在把他们都集中到这里来,以后难得到处找这是一个官网的小示例,我基于vue2实现,自己加了一些注释•最终实现效果。

u011233151的博客 978

NSX-T 4.1部署搭建

NSX-T4.1 部署搭建

weixin_58250887的博客 564

Matplotlib之bar3d画3D柱状图

3D柱状图通常用于展示数据集中不同分类项的数据大小或数量。与普通的柱状图相比,3D柱状图更适合展示数据的三个维度 3D 柱状图 按行/列涂颜色 柱加阴影、描黑边 自定义座标轴名、刻度标签、范围

我走的每一步都算数 1120
上一篇: gltf模型存在棱角,面不平滑
下一篇: threejs如何在三维场景中添加点击事件
兴芳
博客等级 码龄8年 33粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值