Vue中如何进行3D场景展示与交互(如Three.js)

news2024/10/5 21:43:32

Vue中如何进行3D场景展示与交互(如Three.js)

随着WebGL技术的发展,越来越多的网站开始使用3D场景来展示产品、游戏等内容。在Vue中,我们可以使用第三方库Three.js来实现3D场景的展示与交互。本文将介绍如何在Vue中使用Three.js来创建3D场景,并实现交互功能。

在这里插入图片描述

Three.js简介

Three.js是一个用于创建3D图形的JavaScript库。它基于WebGL技术,并提供了一系列的工具和API,使得开发者能够轻松创建3D场景,包括模型、纹理、光照、动画等。Three.js还提供了一个场景图形界面,使得开发者可以直观地构建3D场景。

在Vue中使用Three.js,我们可以通过Vue组件的方式来创建3D场景,并将其嵌入到Vue应用中。

安装Three.js

在Vue中使用Three.js,我们首先需要安装Three.js库。可以通过以下命令来安装:

npm install three --save

创建Vue组件

下面是一个简单的Vue组件,用于创建3D场景:

<template>
  <div ref="container"></div>
</template>

<script>
import * as THREE from 'three'

export default {
  data() {
    return {
      scene: null,
      camera: null,
      renderer: null,
    }
  },
  mounted() {
    this.init()
  },
  methods: {
    init() {
      // 创建场景
      this.scene = new THREE.Scene()

      // 创建相机
      this.camera = new THREE.PerspectiveCamera(75, this.$el.offsetWidth / this.$el.offsetHeight, 0.1, 1000)
      this.camera.position.z = 5

      // 创建渲染器
      this.renderer = new THREE.WebGLRenderer({ antialias: true })
      this.renderer.setSize(this.$el.offsetWidth, this.$el.offsetHeight)
      this.$refs.container.appendChild(this.renderer.domElement)

      // 添加一个立方体
      const geometry = new THREE.BoxGeometry(1, 1, 1)
      const material = new THREE.MeshBasicMaterial({ color: 0xffffff })
      const cube = new THREE.Mesh(geometry, material)
      this.scene.add(cube)

      // 渲染场景
      this.renderScene()
    },
    renderScene() {
      requestAnimationFrame(this.renderScene)
      this.renderer.render(this.scene, this.camera)
    },
  },
}
</script>

在上面的代码中,我们首先引入了Three.js库,并定义了一个Vue组件。在mounted钩子函数中,我们调用了init方法来创建3D场景。在init方法中,我们创建了场景、相机、渲染器,并添加了一个立方体模型到场景中。最后,我们调用renderScene方法来渲染场景。

添加光照

在3D场景中,光照是一个非常重要的概念。下面是一个简单的例子,用于添加光照到场景中:

<template>
  <div ref="container"></div>
</template>

<script>
import * as THREE from 'three'

export default {
  data() {
    return {
      scene: null,
      camera: null,
      renderer: null,
    }
  },
  mounted() {
    this.init()
  },
  methods: {
    init() {
      // 创建场景
      this.scene = new THREE.Scene()

      // 创建相机
      this.camera = new THREE.PerspectiveCamera(75, this.$el.offsetWidth / this.$el.offsetHeight, 0.1, 1000)
      this.camera.position.z = 5

      // 创建渲染器
      this.renderer = new THREE.WebGLRenderer({ antialias: true })
      this.renderer.setSize(this.$el.offsetWidth, this.$el.offsetHeight)
      this.$refs.container.appendChild(this.renderer.domElement)

      // 添加一个立方体
      const geometry = new THREE.BoxGeometry(1, 1, 1)
      const material = new THREE.MeshPhongMaterial({ color: 0xffffff })
      const cube = new THREE.Mesh(geometry, material)
      this.scene.add(cube)

      // 添加光照
      const ambientLight =new THREE.AmbientLight(0xffffff, 0.5)
      this.scene.add(ambientLight)

      const pointLight = new THREE.PointLight(0xffffff, 1)
      pointLight.position.set(1, 1, 1)
      this.scene.add(pointLight)

      // 渲染场景
      this.renderScene()
    },
    renderScene() {
      requestAnimationFrame(this.renderScene)
      this.renderer.render(this.scene, this.camera)
    },
  },
}
</script>

在上面的代码中,我们添加了两种光照:环境光和点光源。环境光类似于光线在场景中弥漫的效果,点光源类似于一个光源,在特定位置上发出光线。通过添加光照,我们可以让3D场景更加真实。

添加交互

在3D场景中,交互是一个非常重要的概念。用户可以通过交互来控制场景中的模型,例如旋转、缩放、平移等。下面是一个简单的例子,用于添加交互到场景中:

<template>
  <div ref="container"></div>
</template>

<script>
import * as THREE from 'three'

export default {
  data() {
    return {
      scene: null,
      camera: null,
      renderer: null,
      cube: null,
      mouse: new THREE.Vector2(),
    }
  },
  mounted() {
    this.init()
  },
  methods: {
    init() {
      // 创建场景
      this.scene = new THREE.Scene()

      // 创建相机
      this.camera = new THREE.PerspectiveCamera(75, this.$el.offsetWidth / this.$el.offsetHeight, 0.1, 1000)
      this.camera.position.z = 5

      // 创建渲染器
      this.renderer = new THREE.WebGLRenderer({ antialias: true })
      this.renderer.setSize(this.$el.offsetWidth, this.$el.offsetHeight)
      this.$refs.container.appendChild(this.renderer.domElement)

      // 添加一个立方体
      const geometry = new THREE.BoxGeometry(1, 1, 1)
      const material = new THREE.MeshPhongMaterial({ color: 0xffffff })
      this.cube = new THREE.Mesh(geometry, material)
      this.scene.add(this.cube)

      // 添加光照
      const ambientLight = new THREE.AmbientLight(0xffffff, 0.5)
      this.scene.add(ambientLight)

      const pointLight = new THREE.PointLight(0xffffff, 1)
      pointLight.position.set(1, 1, 1)
      this.scene.add(pointLight)

      // 添加交互
      this.$refs.container.addEventListener('mousemove', this.onMouseMove, false)

      // 渲染场景
      this.renderScene()
    },
    renderScene() {
      requestAnimationFrame(this.renderScene)
      this.renderer.render(this.scene, this.camera)
    },
    onMouseMove(event) {
      // 计算鼠标位置
      this.mouse.x = (event.clientX / this.$el.offsetWidth) * 2 - 1
      this.mouse.y = -(event.clientY / this.$el.offsetHeight) * 2 + 1

      // 更新立方体的旋转角度
      const targetRotationX = this.mouse.x * Math.PI * 2
      const targetRotationY = this.mouse.y * Math.PI * 2
      this.cube.rotation.x += (targetRotationY - this.cube.rotation.x) * 0.05
      this.cube.rotation.y += (targetRotationX - this.cube.rotation.y) * 0.05
    },
  },
}
</script>

在上面的代码中,我们通过添加mousemove事件来实现了交互功能。当鼠标在场景中移动时,我们计算鼠标的位置,并更新立方体模型的旋转角度。通过添加交互,我们可以让用户更加自由地控制场景中的模型。

总结

在本文中,我们介绍了如何在Vue中使用Three.js来创建3D场景,并实现交互功能。通过添加光照和交互,我们可以让3D场景更加真实和生动。在实际开发中,我们可以根据需求来选择不同的3D库和工具,以便更好地实现我们的目标

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/652370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

和 if else说再见,SpringBoot 这样做参数校验才足够优雅!

1. 概述 当我们想提供可靠的 API 接口&#xff0c;对参数的校验&#xff0c;以保证最终数据入库的正确性&#xff0c;是 必不可少 的活。比如下图就是 我们一个项目里 新增一个菜单校验 参数的函数&#xff0c;写了一大堆的 if else 进行校验&#xff0c;非常的不优雅&#xf…

语音验证码短信原理和应用场景分析

引言 随着移动互联网的快速发展&#xff0c;短信验证码成为了许多应用和服务中常用的身份验证方式。然而&#xff0c;有时候用户可能由于各种原因无法接收到短信验证码&#xff0c;或者对于文字验证码不够方便或友好。 为了解决这些问题&#xff0c;语音验证码短信API 应运而…

【论文精读ACL_2021】Prefix-Tuning: Optimizing Continuous Prompts for Generation

【论文精读ACL_2021】Prefix-Tuning: Optimizing Continuous Prompts for Generation 0、前言Abstract1 Introduction2 Related Work2.1 Fine-tuning for natural language generation.2.2 Lightweight fine-tuning2.3 Prompting.2.4 Controllable generation. 3 Problem State…

Python做数据分析需要学什么?

下面分别从这四个方面来带大家学习数据分析&#xff1a; 第一&#xff0c;做数据分析要精通Python吗&#xff1f;第二&#xff0c;数据分析流程是什么&#xff1f;学什么&#xff1f;第三&#xff0c;如何培养数据分析思维&#xff1f;第四&#xff0c;数据分析书籍推荐 一、…

关于linux服务器上生成的图片中文字为的乱码问题

一、功能描述 linux服务器后端生成图表&#xff08;使用了canvas和echarts&#xff09;&#xff0c;并将生成的图片发送到企业微信群里。 二、出现的问题 生成的图表中文展示不出来&#xff0c;是乱码。错误图表展示如下&#xff1a; 三、 文字乱码出现的原因 linux服务器没有…

git在windows及linux(源码编译)环境下安装

git在windows及linux(源码编译)环境下安装 环境信息: 系统版本:CentOS Linux release 7.9.2009 (Core) git指令安装: yum install -y git 一、git在windows下安装 下载地址:https://git-scm.com/ 默认安装即可 验证 git --version 二、git在linux下安装 下载地址…

电子标签服务器搭建说明文档

一、安装运行环境 1.安装jdk 运行JDK_1.8.0_64bit.exe程序,可自定义安装路径 ​ 2.配置环境变量 择计算机图标&#xff0c;鼠标右键选择属性 ​ 选择高级系统设置&#xff0c;在系统属性中找到环境变量 ​ 在系统变量中新建JAVA_HOME环境变量&#xff0c;变量值为jdk的安装路…

跨域请求!!!

1.见过的请求类型都有哪些 getpostputdeleteoptions 和跨域相关的请求头 2.什么是跨域 当主机、域名、端口有任何一个不一致的时候&#xff0c;会出现跨域 3.跨域只有在哪里会出现 浏览器里出现了&#xff0c;它是浏览器的一个行为 4.为什么有跨域 为了安全不同域名之间…

系统编程(3):进程

文章目录 一、概念1.1 什么是进程&#xff1f;1.2 进程ID1.3 进程间通信1.4 进程的三种态的转换 二、进程控制2.1 创建进程函数&#xff1a;fork函数2.1.1 获得pid函数写代码&#xff1a;方式一&#xff1a;最简单的方式二&#xff1a;加入while&#xff08;1&#xff09;死循环…

基于Arduino的LED显示屏驱动实现

基于Arduino的LED显示屏驱动实现可以通过使用Arduino板上的数字引脚和相关库来控制LED显示屏的亮灭和显示效果。LED显示屏加载不出图像怎么办&#xff1f; 下面是基于Arduino的LED显示屏驱动实现的详细介绍&#xff1a; 硬件准备&#xff1a; Arduino开发板&#xff1a;可以使用…

ROS中 mpc_local_planner 局部路径规划器参数配置文件中参数含义

mpc_local_planner与我们比较熟悉的teb_local_planner出自同一研究所&#xff08;多特蒙德大学-控制理论与系统工程研究所&#xff09;&#xff0c;所以参数配置文件中的参数有很多相似之处&#xff0c;很多参数的含义也是相同的&#xff0c;所以熟悉teb_local_planner的参数含…

亚马逊认证考试系列 - 知识点 - 安全组介绍

AWS的安全组是一种虚拟防火墙&#xff0c;可以用于控制进入和离开AWS虚拟私有云(VPC)的流量。安全组是一种网络访问控制列表(NACL)的补充&#xff0c;因为安全组是在实例级别上进行管理的&#xff0c;而NACL是在子网级别上进行管理的。 AWS的安全组可以通过以下方式保护您的资源…

自然语言处理: 第一章N-Gram

一. 理论基础 定义: 语言模型在wiki的定义是统计式的语言模型是一个几率分布&#xff0c;给定一个长度为 m 的字词所组成的字串 W1 , W2 &#xff0c; &#xff0c;Wn &#xff0c;派几率的字符串P(S) P(W1 , W2 , &#xff0c;Wn &#xff0c; )而其中由条件概率公式我们可以…

风景类Midjourney prompt提示词

稳定输出优美风景壁纸的Midjourney prompt提示词。 1\在夏夜&#xff0c;有淡蓝色的星空&#xff0c;海边&#xff0c;流星&#xff0c;烟花&#xff0c;海滩上全是蓝色的玫瑰和绿色的植物&#xff0c;由Ivan Aivazovsky和Dan Mumford&#xff0c;趋势在cgsociety&#xff0c;…

CAN转串口设备在使用时可能遇到的问题和解决方案

上位机软件通过232串口发送数据经过CAN转232设备转换成CAN数据发送到仪表中&#xff0c;仪表接收到指定的数据后&#xff0c;返回特定的CAN数据。 使用过程中可能遇到的问题 1、串口按照规则发送数据后&#xff0c;设备端没有数据返回 遇到这种情况&#xff0c;先检查发送的数…

STM32 Proteu直流电机正反转控制系统限位开关-0035

STM32 Proteu直流电机正反转控制系统限位开关-0035 Proteus仿真小实验&#xff1a; STM32 Proteu直流电机正反转控制系统限位开关-0035 功能&#xff1a; 硬件组成&#xff1a;STM32F103C6单片机 L298N电机控制电路直流电机3个按键&#xff08;正转、反转、停止&#xff09;L…

AM62X+FPGA+AD+vxworks实时操作系统数据采集处理解决方案

Specification Description 处理器 AM6231 at up to 1.2GHz 操作系统 VXWORKS 存储 DDR4,8GB EMMC 接口 •PrPMC接口 •1个USB2.0 •3路RMII •1路RS485 •1路IRIGB •1路RS232 调试接口 JTAG / COP debug port 工业环境监测设备&#xff1a; Specification Desc…

常见优化器详解

优化器 目前有两种主流优化器&#xff1a;随机梯度下降系&#xff08;Stochastic Gradient Descent, SGD&#xff09;和Adam系。 应该认识到的是&#xff0c;优化器并不是某类数学上的优化算法&#xff0c;而是梯度下降&#xff08;一阶迭代法&#xff09;的工程实现方案和包…

VALSE2023-内容总结(正在更新)

博文为精选内容&#xff0c;完整ppt请留言索取 一周内更新完毕&#xff0c;敬请期待 2023年度视觉与学习青年学者研讨会 (Vision And Learning SEminar, VALSE)于6月10日至12日在无锡太湖国际博览中心召开&#xff0c;由中国人工智能学会、中国图象图形学学会主办&#xff0c;…

Transformer与注意力机制

Transformer与注意力机制 1. RNN基础 循环神经网络&#xff08;RNN&#xff09;是专门用来处理自然语言、金融信息等时序数据的一种神经网络。它的结构和运作方式如下图所示&#xff0c;基于马尔可夫决策模型。 图1 循环神经网络的结构和运作方式 应该注意到以下几个性质&a…