在 Vue3 项目中安装和配置 Three.js

简介

Three.js 是一个轻量级的 WebGL 封装库,用于在浏览器中渲染复杂的 3D 图形。它提供了便捷的 API,可以快速构建 3D 场景、对象和动画。

Vue.js 是一个渐进式 JavaScript 框架,擅长构建用户界面。其响应式数据绑定和组件系统使得复杂的交互开发更加简单。

通过将 Three.js 和 Vue.js 结合,我们可以利用 Vue 的组件化和响应式特性,轻松管理和更新 3D 场景中的对象和状态,从而创建高效且交互性强的 3D 应用。

创建一个基于 Vite 的 Vue3 项目

初始化项目

pnpm create vite@latest vue-threejs-demo --template vue
cd vue-threejs-demo
npm install

安装 Three.js

npm install three

运行项目

npm run dev

至此,我们已经创建了一个基于 Vite 的 Vue3 项目,并安装了 Three.js 库。

在 Vue 组件中集成 Three.js

目录

以下是初始的目录结构

vue-threejs-demo/
├── src/
│   ├── assets/         # 放置静态资源
│   ├── components/     # 放置 Vue 组件
│   │   ├── ThreeScene.vue
│   ├── App.vue         # 应用根组件
│   ├── main.js         # 项目入口文件
│   └── styles/         # 可选:放置全局样式
├── public/             # 放置静态文件
├── package.json
├── vite.config.js
└── README.md

创建 ThreeScene.vue 组件

创建文件夹和文件: 在项目的 src/components 文件夹下,新建一个文件 ThreeScene.vue,用于管理 3D 场景逻辑。

src/
├── components/
│   └── ThreeScene.vue

在组件中初始化 Three.js 场景: 将以下代码复制到 ThreeScene.vue 文件中:

<template>
  <div id="three-container">
    <canvas ref="threeCanvas"></canvas>
  </div>
</template>

<script>
import * as THREE from "three";

export default {
  name: "ThreeScene",
  mounted() {
    this.initThree();
  },
  methods: {
    initThree() {
      const canvas = this.$refs.threeCanvas;

      // 初始化场景、相机和渲染器
      const scene = new THREE.Scene();
      const camera = new THREE.PerspectiveCamera(
        75,
        window.innerWidth / window.innerHeight,
        0.1,
        1000
      );
      camera.position.z = 5;

      const renderer = new THREE.WebGLRenderer({ canvas });
      renderer.setSize(window.innerWidth, window.innerHeight);

      // 创建一个立方体
      const geometry = new THREE.BoxGeometry();
      const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
      const cube = new THREE.Mesh(geometry, material);
      scene.add(cube);

      // 动画循环
      function animate() {
        requestAnimationFrame(animate);
        cube.rotation.x += 0.01;
        cube.rotation.y += 0.01;
        renderer.render(scene, camera);
      }

      animate();
    },
  },
};
</script>

<style scoped>
#three-container {
  width: 100%;
  height: 100vh;
}
canvas {
  display: block;
  width: 100%;
  height: 100%;
}
</style>

修改 App.vue 文件

将 ThreeScene.vue 组件引入并使用。
App.vue 文件结构:

<template>
  <div id="app">
    <ThreeScene />
  </div>
</template>

<script>
import ThreeScene from "./components/ThreeScene.vue";

export default {
  name: "App",
  components: {
    ThreeScene,
  },
};
</script>

<style>
#app {
  margin: 0;
  padding: 0;
  overflow: hidden;
}
</style>

修改 main.js 文件

import { createApp } from "vue";
import App from "./App.vue";

const app = createApp(App);
app.mount("#app");

完整的文件结构

完成上述步骤后,项目的文件结构应该类似于以下:

vue-threejs-demo/
├── src/
│   ├── assets/         # 可选:存放图片、材质等静态资源
│   ├── components/
│   │   └── ThreeScene.vue   # 3D 场景组件
│   ├── styles/         # 可选:全局样式文件夹
│   │   └── global.css  # 可选:定义全局 CSS 样式
│   ├── App.vue         # 根组件
│   ├── main.js         # 入口文件
├── public/             # 存放静态文件
│   └── index.html      # HTML 模板
├── package.json        # 项目信息
├── vite.config.js      # Vite 配置文件
└── README.md           # 项目说明

运行项目

完成后,运行以下命令启动开发服务器:

npm run dev

打开浏览器访问 http://localhost:5173 你将看到一个旋转的绿色立方体在页面中显示。

在这里插入图片描述

补充说明

  • 关于动态加载材质:将材质文件(如图片)放置在 src/assets 或 public 文件夹中,并通过 Three.js 的 TextureLoader 加载。

  • 关于响应式调整:可以监听窗口大小的变化,在 initThree 方法中加入如下代码:

window.addEventListener("resize", () => {
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
  renderer.setSize(window.innerWidth, window.innerHeight);
});

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【踩坑记录】C编程变量未初始化导致的程序异常

1、在编程的时候养成良好的习惯&#xff0c;定义变量以后记得给变量初始化&#xff0c;不然可能会产生一些意想不到的Bug。 2、比如下面的例子&#xff0c;如果定义的变量没有被初始化就有可能是一个随机值。如果代码少还好&#xff0c;很容易排查出来。但如果是一个比较大的项…

51c自动驾驶~合集42

我自己的原文哦~ https://blog.51cto.com/whaosoft/12888355 #DriveMM 六大数据集全部SOTA&#xff01;最新DriveMM&#xff1a;自动驾驶一体化多模态大模型&#xff08;美团&中山大学&#xff09; 近年来&#xff0c;视觉-语言数据和模型在自动驾驶领域引起了广泛关注…

CosyVoice安装过程详解

CosyVoice安装过程详解 安装过程参考官方文档 前情提要 环境&#xff1a;Windows子系统WSL下安装的Ubunt22.4python环境管理&#xff1a;MiniConda3git 1. Clone代码 $ git clone --recursive https://github.com/FunAudioLLM/CosyVoice.git # 若是submodule下载失败&…

逻辑的诗:类与对象(下)

一、初始化列表 初始化列表的使用方式是以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个“成员变量”后面跟一个放在括号中的初始化值或表达式&#xff1b; 每个成员变量在初始化列表中只能出现一次&#xff0c;语法理解上初始化列表可以认为…

什么是EMI测试,如何进行EMI测试?

什么是EMI测试&#xff1f; EMI&#xff08;Electromagnetic Interference&#xff0c;电磁干扰&#xff09;是指电子设备自身工作过程中产生的电磁波对外发射&#xff0c;从而对设备其它部分或外部其它设备造成干扰&#xff0c;属于电磁兼容的一种。实际测试中&#xff0c;主…

KingbaseES(金仓数据库)入门学习

前言 金仓是一种多进程架构&#xff0c;每一个连接到服务器的会话&#xff0c;在服务器上面都会为该会话分配进程 图形化界面管理 新建数据库名 然后新建一个模式 再创建一个表 新建一个表&#xff0c;然后设置列名 记得要保存 查询数据 也可以新建数据表&#xff0c;用命令…

Burp Suite的安装

1.安装Java 8环境: https://www.java.com/ 2.安装Burp Suite: 3.导出证书&#xff0c;安装证书&#xff1a; 不安装的话无法抓包https协议 4.设置浏览器的代理为Burp Suite: 将浏览器代理端口改为Burp Suite的默认端口 ###我个人在安装中遇到的一些问题&#xff1a; #浏览…

利用Spring Cloud Gateway Predicate优化微服务路由策略

利用Spring Cloud Gateway Predicate优化微服务路由策略 一、Predicate简介 Spring Cloud Gateway 是 Spring 生态系统中用于构建 API 网关的框架&#xff0c;它基于 Project Reactor 和 Netty 构建&#xff0c;旨在提供一种高效且灵活的方式来处理 HTTP 请求和响应。 Spring …

【Java基础面试题035】什么是Java泛型的上下界限定符?

回答重点 Java泛型的上下界限定符用于对泛型类型参数进行范围限制&#xff0c;主要有上界限定符和下届限定符。 1&#xff09;上界限定符 (? extends T)&#xff1a; 定义&#xff1a;通配符?的类型必须是T或者T的子类&#xff0c;保证集合元素一定是T或者T的子类作用&…

用套接字的UDP,TCP知道什么是HTTP吗?

文章目录 UDP和TCP七层网络架构Omnipeek抓包分析举例图片备注code参考code HTTP协议的构成 UDP和TCP UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09; 和 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09; 是…

Apache Log4j漏洞复现

所用环境 宝塔云服务器 log4j2 是Apache的⼀个java日志框架&#xff0c;我们借助它进行日志相关操作管理&#xff0c;然而在2021年末log4j2爆出了远程代码执行漏洞&#xff0c;属于严重等级的漏洞。 apache log4j通过定义每⼀条日志信息的级别能够更加细致地控制日志⽣成地过…

苍穹外卖-day05redis 缓存的学习

苍穹外卖-day05 课程内容 Redis入门Redis数据类型Redis常用命令在Java中操作Redis店铺营业状态设置 学习目标 了解Redis的作用和安装过程 掌握Redis常用的数据类型 掌握Redis常用命令的使用 能够使用Spring Data Redis相关API操作Redis 能够开发店铺营业状态功能代码 功能实…

CV-OCR经典论文解读|An Empirical Study of Scaling Law for OCR/OCR 缩放定律的实证研究

论文标题 An Empirical Study of Scaling Law for OCR OCR 缩放定律的实证研究 论文链接&#xff1a; An Empirical Study of Scaling Law for OCR论文下载 论文作者 Miao Rang, Zhenni Bi, Chuanjian Liu, Yunhe Wang, Kai Han 内容简介 本论文在光学字符识别&#xf…

PTA数据结构题目:链表操作集合

寻找结点 插入结点 错误分析 while (prev ! NULL && prev->Next ! P) 为什么我写成 while (prev->Next ! P && prev ! NULL) 的时候会发生段错误&#xff0c;这两种写法逻辑上不是一样的吗&#xff1f; 野指针 逻辑顺序导致的潜在风险 在 C 语言中&am…

路由器做WPAD、VPN、透明代理中之间一个

本文章将采用家中TP-Link路由器 路由器进行配置DNS DNS理解知识本文DNS描述参考&#xff1a;网络安全基础知识&中间件简单介绍_计算机网络中间件-CSDN博客 TP LINK未知的错误&#xff0c;错误编号&#xff1a;-22025 TP-LINK 认证界面地址&#xff1a;https://realnam…

Java 小白入门必备知识点

11.我们发现现在有两个x&#xff0c;一个是成员变量&#xff0c;一个是局部变量&#xff0c;在sum方法中为了区分两个s&#xff0c;我们给成员变量前加上this以此来区分成员变量和局部变量 12.成员方法:在java中&#xff0c;必须通过方法才能完成对类和对象的属性操作&#xf…

gitlab代码推送

点击这个√ 修改的文件全部选上 填好提交的名称 点击commit 选取提交的 gitlab 库 点击Push

vscode添加全局宏定义

利用vscode编辑代码时&#xff0c;设置了禁用非活动区域着色后&#xff0c;在一些编译脚本中配置的宏又识别不了 遇到#ifdef包住的代码就会变暗色&#xff0c;想查看代码不是很方便。如下图&#xff1a; 一 解决&#xff1a; 在vscode中添加全局宏定义。 二 步骤&#xff1a…

【电路设计】LDO旁路电容的选择

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时&#xff0c;也能帮助其他需要参考的朋友。如有谬误&#xff0c;欢迎大家进行指正。 一、引言 虽然人们普遍认为电容是解决噪声相关问题的灵丹妙药&#xff0c;但是电容的价值并不仅限于此。设计人员常常只想到…

生产看板管理系统涵盖哪些方面

嘿&#xff0c;各位搞生产管理的朋友&#xff0c;肯定都碰到过些麻烦事儿吧。我就寻思着&#xff0c;能不能弄出个 “明明白白” 的工作场地呢&#xff1f;让员工和管理人员都能随时查查生产进度&#xff0c;一发现生产里有啥问题就能立马知道。 生产进度不好追踪生产过程不清…