【three.js】结合vue进行开发第一个3d页面

一、创建vue项目 

 新建一个项目目录,在集成终端打开,输入

npm init vite@latest

回车后,依次输入项目名,选择vue和js开发 

然后安装依赖并运行项目

 

 

二、安装three 

接下来我们开始安装three

npm install three

 

 三、Three.js 的运行需要4个条件  

  • 场景 (scenes)
  • 渲染器 (renderers)
  • 相机 (cameras)
  • 对象 (objects)

什么是场景?

在 Three.js 中,场景是一个非常重要的概念。它类似于一个容器或者说世界,可以包含各种对象、模型、粒子和灯光等。场景是 Three.js 中的一个核心组件,它是构建一个 3D 场景所必需的。通过将不同的对象添加到场景中,我们可以创建一个复杂的 3D 环境,从而实现更加生动、吸引人的 3D 体验。

什么是渲染器?

渲染器是一个非常重要的组件,它的工作是将我们的代码与设计渲染到我们的web中。在threejs中,我们通常使用 WebGLRenderer 类来进行渲染。WebGL是一种3D绘图标准,它允许我们在web上呈现复杂的3D图形,而不需要插件,这是非常棒的。 WebGLRenderer的一个伟大之处在于它提供了丰富的功能,例如对材质、灯光、阴影和反射的支持。这使得我们能够创建出更加逼真的场景和模型,从而提高用户体验。总之,渲染器是任何三维场景的重要组成部分,也是threejs中不可或缺的组件

什么是对象?

在 Three.js 中,所有的元素都是对象,包括几何体、模型、粒子和灯光等。这些对象可以应用不同的材质和纹理,并使用相机和光源进行渲染。 Three.js 还提供了许多扩展和库,例如 MeshStandardMaterial 和 dat.gui,可以让你创建更高级的渲染效果和用户界面。

什么是相机?

在 Three.js 中,相机是非常重要的一个元素,用来决定我们观察场景的角度和位置。相机被用来模拟人眼对场景的观察,因此非常重要。在 Three.js 中,创建相机非常简单,我们可以使用 PerspectiveCamera 类来创建。这个类允许我们设置许多参数,例如视角、宽高比、近截面和远截面等等,因此我们可以完全控制相机的行为

另外,在 Three.js 中,相机本身是不可见的,它仅用于计算和确定场景中物体的位置和角度。因此,我们只能看到相机所观察到的内容,而不能看到相机本身。这意味着,我们需要在场景中加入其他可见的对象,例如物体、灯光等等,才能看到场景。因此,在使用 Three.js 时,不仅需要了解相机的使用,还需要了解如何创建和操作其他类型的对象。

PerspectiveCamera( fov : Number, aspect : Number, near : Number, far : Number )
fov — 摄像机视锥体垂直视野角度 aspect — 摄像机视锥体长宽比 near — 摄像机视锥体近端面 far — 摄像机视锥体远端面

在Three.js中,我们可以拥有多个相机,但通常情况下只需要一个。

相机在Three.js中类似于一个锥形体,它受到视野范围和纵横比的影响。

视野范围:

视野是你的视角有多大。如果你使用一个非常大的角度,你将能够同时看到各个方向,但会失真很多,因为结果将绘制在一个小矩形上。如果使用小角度,则物体看起来会被放大。

概念图示:相机在场景中的位置示意图:

 

那么如何将渲染到指定的位置呢?

在这种情况下,我们需要理解笛卡尔坐标系(这个比较难解释,所以这里我们使用图片来解释),通过x,y,z三个坐标轴在三维空间中进行定位。在WebGL与Threejs中使用的是正交右手坐标系:

  • 正交右手坐标系:右手拇指代表X轴,食指代表Y轴,中指代表Z轴。
  • 手臂和拇指代表Y轴。
  • 与地面平行的是Z轴。
  • 拇指代表X轴。

 

 四、创建3d物体

在App.vue中

<script setup>
// 引入three
import * as THREE from "three";// 创建场景
const scene = new THREE.Scene();// 创建相机
const camera = new THREE.PerspectiveCamera(45, //视角,视角越大,看的东西越多window.innerWidth / window.innerHeight, //宽高比0.1, //近平面,相机最近看到的物体1000 //远平面,相机最远看到的物体
);// 创建渲染器,最终由渲染器渲染到canvas画布上
const renderer = new THREE.WebGL1Renderer();
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth, window.innerHeight);
// 设置好大小之后,将画布添加到页面的body上
document.body.appendChild(renderer.domElement);// 创建几何体,下面创建的是正方体
const geometry = new THREE.BoxGeometry(1, 1, 1);
// 创建材质,不同材质效果是不同的,下面设置的是基础的黄色的材质
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
// 创建网格,将几何体和材质都传进去(形成物体)
const cube = new THREE.Mesh(geometry, material);// 最后将网格添加到场景当中,我们才能看到它
scene.add(cube);
// 设置相机位置,表示我们要在哪个位置看这个物体
camera.position.z = 5; //xy轴不设置默认为0
// 设置相机看向原点
camera.lookAt(0, 0, 0);// 渲染函数
function animate() {requestAnimationFrame(animate);// 旋转,对立方体进行旋转cube.rotation.x += 0.01;cube.rotation.y += 0.01;// 渲染,每次旋转后都调用这个渲染函数renderer.render(scene, camera);
}
animate();
</script><template></template><style>
* {margin: 0;padding: 0;
}
canvas {display: block;position: fixed;left: 0;top: 0;width: 100vw;height: 100vh;
}
</style>

效果:由于我们设置的是从z轴看这个正方体,因此正对z轴看到的是平面

如果我们想要不断的渲染,让它动起来,看到它不同方位的形状,需要调用渲染函数,如下所示

将上面的静态渲染改为下面的旋转动画渲染

// 渲染函数
function animate() {requestAnimationFrame(animate)// 旋转,对立方体进行旋转cube.rotation.x += 0.01cube.rotation.y += 0.01// 渲染,每次旋转后都调用这个渲染函数renderer.render(scene, camera)
}
animate()

效果如下: 

此时就完成了在vue中开发的一个简单的3d页面 ~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode-94-二叉树的中序遍历

题目描述&#xff1a; 题目链接&#xff1a;LeetCode-94-二叉树的中序遍历 解题思路&#xff1a;递归&#xff0c;具体可以参考 LeetCode-144-二叉树的前序遍历 代码实现&#xff1a; class Solution {List<Integer> listnew ArrayList<>();public List<Integer…

什么是云计算?云计算简介

其实“云计算”作为一个名词而言&#xff0c;那是相当成功滴。很多人都有听过。但提及云计算”具体是什么?很多人&#xff0c;知其然&#xff0c;却不知其所以然! 利用软件将这些成千上万不可靠的硬件组织成一个稳定可靠的IT系统&#xff0c;以此支撑其公司的IT基础服务。这家…

对音频切分成小音频(机器学习用)

我是把so-vits中小工具&#xff0c;分析源码然后提取出来了。以后可以写在自己的程序里。 -------流程&#xff08;这是我做的流程&#xff0c;你可以不用看&#xff09; 从开源代码中快速获取自己需要的东西 如果有界面f12看他里面的接口&#xff0c;然后在源码中全局搜索&…

U盘部分文件无故消失?3招帮你恢复数据!

“怎么会这样呢&#xff1f;我的u盘有一段时间没用了&#xff0c;今天把它插入电脑后发现有些文件无故消失了&#xff0c;明明我也没有删除这些文件啊。还有办法可以找回它们吗&#xff1f;” U盘作为便捷小巧的存储工具&#xff0c;逐渐成为人们数据存储的好帮手。但在使用u盘…

从0开始python学习-31.selenium 文本输入框、下拉选择框、文件上传、时间插件选择元素定位

目录 1. 纯文本输入框 2. 存在默认值的文本输入 3. 下拉选择框 4. 输入后下拉选择框 5. 文件上传 6. 时间插件 1. 纯文本输入框 driver.find_element(By.XPATH,/html/body/div[2]/td[2]/input).send_keys(测试名称) 2. 存在默认值的文本输入 注意&#xff1a; 1. 这种存…

PET/MRI:技术和方法

前言 多模态信息通常用于诊断或研究的目的&#xff0c;因为每种成像技术提供了互补的信息&#xff0c;例如有关解剖学、生理学或代谢的信息。正电子发射断层扫描(PET)测量体内特定分子的分布和浓度&#xff0c;磁共振成像(MRI)反映质子密度和组织弛豫时间&#xff0c;计算机断…

非线性权重纵横交叉t分布改进麻雀算法

目录 1 横向交叉操作 2 纵向交叉操作 3 非线性惯性权重 4 基于t分布变异 5 实验结果 1 横向交叉操作 横向交叉操作类似于遗传算法中的交叉操作&#xff0c;是在不同 种群的相同维度中进行交叉运算。针对麻雀搜索算法全局 搜索能力不强的问题&#xff0c;本文应用横向交叉策…

VR酒店虚拟仿真情景实训教学演示

在传统的酒店管理教学过程中&#xff0c;学生往往缺乏实践操作经验&#xff0c;难以将理论知识与实际工作相结合。而VR酒店虚拟仿真情景实训教学应用可以为学生提供一个逼真的、沉浸式的酒店管理环境&#xff0c;使学生能够在模拟实践中掌握酒店管理的各项技能。 VR酒店虚拟仿真…

阿里云 腾讯云 配置二级域名并解析指向非80端口操作指南

目标&#xff1a;主域名 imps.com 已完成配置&#xff0c;新增配置 kpi.imps.com 等二级域名并指向 8083 端口。 &#xff08;此操作需要主域名已经通过备案3天后&#xff0c;最好指向的IP地址网站也通过了备案申请&#xff0c;否则会提示域名没有备案。&#xff09; 操作流程…

使用 nodejs,SpringBoot 两种方式实现 WebSocket

前言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议&#xff0c;它可以让浏览器和服务器之间实现实时双向数据传输。 WebSocket 的优点是&#xff1a; 可以节省服务器资源和带宽&#xff0c;提高性能和效率可以让服务器主动向客户端推送数据&#xff0c;实现实时响…

HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Stack

堆叠容器&#xff0c;子组件按照顺序依次入栈&#xff0c;后一个子组件覆盖前一个子组件。该组件从API Version 7开始支持。可以包含子组件。 一、接口 Stack(value?: { alignContent?: Alignment }) 从API version 9开始&#xff0c;该接口支持在ArkTS卡片中使用。 二、…

alsa pcm接口之pcm设备的状态STATE

应用和库之间的协作: ALSA pcm api设计使用状态来确定应用程序和库之间的通信阶段,实际的状态可以被决定通过使用snd_pcm_state调用,下面列举出来状态: SND_PCM_STATE_OPEN: 表示pcm设备被打开的状态,使用了snd_pcm_open()之后进入该状态,并且让snd_pcm_hw_params()调用失败后,…

linux,write:xxx has messages disabled 与 Ubuntu多用户同时登录的问题 ubuntu 20.04

write&#xff1a;xxx has messages disabled 问题 被这问题折磨了好久&#xff0c;搜都搜不到&#xff0c;还是灵机一动想到的。 很多 帖子说&#xff0c;要使用 mesg y用了还是没有用&#xff0c;后面我登录了很多用户&#xff0c;发现只有root用户可以给别的用户使用write…

各类高危漏洞介绍及验证方式教程(一)

本期整理的漏洞验证教程约包含50多类漏洞&#xff0c;分多个章节编写&#xff0c;可从以下链接获取全文&#xff1a; 各类高危漏洞验证方式.docx (访问密码: 1455) 搭建dvwa测试环境基础教程.docx(访问密码: 1455) web逻辑漏洞挖掘快速入门基础教程.docx(访问密码: 1455) 01 Ca…

实验1机器学习之线性回归实验

一、实验目的&#xff1a; &#xff08;1&#xff09;理解一元线性回归和多元线性回归的数学原理&#xff0c;能够利用sklearn中相关库解决现实世界中的各类回归问题&#xff1b; &#xff08;2&#xff09;掌握利用matplotlib对一元线性回归模型进行可视化的方法&#xff0c…

【数据结构初阶】七、非线性表里的二叉树(堆的实现 -- C语言顺序结构)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【数据结构初阶】六、线性表中的队列&#xff08;链式结构实现队列&#xff09;-CSDN博客 1 . 非线性表里的 树(Tree) 树的概念及结构&#xff1a; 树的概念 树是一种非线性的数据…

【计算机网络】高级IO初步理解

文章目录 1. 什么是IO&#xff1f;什么是高效 IO? 2. IO的五种模型五种IO模型的概念理解同步IO与异步IO整体理解 3. 阻塞IO4. 非阻塞IOsetnonblock函数为什么非阻塞IO会读取错误&#xff1f;对错误码的进一步判断检测数据没有就绪时&#xff0c;返回做一些其他事情完整代码myt…

黑马JVM总结(二十九)

&#xff08;1&#xff09;语法糖-重写桥接 &#xff08;2&#xff09;语法糖-匿名内部类 &#xff08;3&#xff09;类加载-加载 类加载可以分为3个阶段&#xff0c;加载、连接、初始化 我们知道java类编译成字节码以后&#xff0c;运行呢需要类加载器把类的字节码加载到方法…

git的基本使用

git地址 https://git-scm.com/ git首次安装必须设置签名代码&#xff0c;否则无法提交代码 git init git status 14 idea中连接gitee file-setting中安装gitee插件&#xff0c;安装gitee插件后可以在version control中看到gitee&#xff0c;点击 添加gitee账号&#xff…

Kafka和RabbitMQ的对比

Rabbitmq比kafka可靠&#xff0c;kafka更适合IO高吞吐的处理&#xff0c;比如ELK日志收集 Kafka和RabbitMq一样是通用意图消息代理&#xff0c;他们都是以分布式部署为目的。但是他们对消息语义模型的定义的假设是非常不同的。 a) 以下场景比较适合使用Kafka。如果有大量的事…