首页 > 其他分享 >vue3简单使用threejs立方缓冲几何体(BoxGeometry)

vue3简单使用threejs立方缓冲几何体(BoxGeometry)

时间:2024-10-16 14:46:01浏览次数:8  
标签:threejs THREE 几何体 window renderer vue3 new three 全屏

文章目录


前言

three.js是一个基于原生‌WebGL封装的JavaScript库,用于在Web上创建和展示3D图形。‌ 它通过提供简单的API,帮助开发者创建复杂的3D场景,极大地简化了Web 3D应用的开发过程。

一、安装 three

使用npm或者pnpm包管理工具安装

npm install --save three
pnpm install --save three

二、使用步骤

1.导入three、建立场景、相机和渲染器

我们需要导入three库以及准备以下几个对象:场景(scene)、相机(camera)和渲染器(renderer)

<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);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);

//这里将renderer(渲染器)的dom元素(renderer.domElement)添加到HTML 文档中
document.body.appendChild(renderer.domElement);

</script>

2.添加立方体

  1. 创建一个立方体需要BoxGeometry(立方体)对象,此对象包含了一个立方体中所有的顶点(vertices)和面(faces)。
  2. 然后再给这个立方体一个材质(它的外观),Three.js 自带几种材质,在这里我们使用的是 MeshBasicMaterial。
  3. 需要一个 Mesh(网格), 网格包含一个几何体以及作用在此几何体上的材质。
<script setup>

//创建立方体
let geometry = new THREE.BoxGeometry( 1, 1, 1 ); 
//添加材质(外观)
const material = new THREE.MeshBasicMaterial( {color: 0x123456} );
//创建网格 
const cube = new THREE.Mesh( geometry, material ); 
//调用scene.add( ) 将物体添加到场景中
scene.add( cube );

</script>

3.渲染循环

以上代码写好后,运行页面并不会看到任何东西。这时候还需要将它渲染出来,代码如下:

<script setup>

// 渲染循环
function animate() {
  requestAnimationFrame(animate);
    //让立方体旋转
  cube.rotation.x += 0.01
  cube.rotation.y += 0.01
  renderer.render(scene, camera);
}
 
animate();
</script>

三、其他

1. 轨道控制器 OrbitControls 和 坐标轴辅助对象AxesHelper

轨道控制器 可以使得相机围绕目标进行轨道运动。
为了方便用户交互,提高代码的实用性,我们可以添加轨道控制器,并为其设置一些属性,但需要注意的是,设置属性后需要在循环渲染中调用update()更新轨道控制器。相关代码如下:

// 导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
// 添加OrbitControls来控制摄像机
const controls = new OrbitControls(camera, renderer.domElement);
//设置一些属性
controls.enableDamping  = true //启用阻尼(惯性)
controls.dampingFactor = 0.05 //阻尼惯性有多大
controls.autoRotate = true // 自动旋转
controls.autoRotateSpeed = 10.0 //围绕目标旋转的速度将有多快
// 为了更清晰的看到物体的运动轨迹,可以添加坐标轴辅助对象AxesHelper
// 红色代表 X 轴. 绿色代表 Y 轴. 蓝色代表 Z 轴.
const axesHelper = new THREE.AxesHelper( 5 );
scene.add( axesHelper );

// 渲染循环
function animate() {
  //注意:以上属性设置后,必须再动画循环里面调用update()更新控制器
  controls.update()
  requestAnimationFrame(animate);
  //让立方体旋转
  cube.rotation.x += 0.01
  cube.rotation.y += 0.01
  renderer.render(scene, camera);
}
 
animate();

2.GUI创建可交互的控件(点击全屏+退出全屏)

为方便用户调整和控制场景中的各种参数,我们可以使用gui调试器创建控件,代码如下:

// 导入gui调试开发
import {GUI} from 'three/examples/jsm/libs/lil-gui.module.min.js'

// 创建GUI
let gui = new GUI();
//准备一个对象,对象里包含点击全屏以及退出全屏的函数
let screenObj = {
	Fullscreen:function(){
		document.body.requestFullscreen()
		console.log("点击全屏");
	},
	ExitFullscreen:function(){
		document.exitFullscreen()
		console.log("退出全屏");
	}
}
gui.add(screenObj,"Fullscreen").name('点击全屏')
gui.add(screenObj,"ExitFullscreen").name("退出全屏")

3.监听窗口的变化 执行一些重置操作

// 监听窗口的变化
window.addEventListener('resize',()=>{
	// 重置渲染器宽高比
renderer.setSize(window.innerWidth,window.innerHeight)
	// 重置相机宽高比
	camera.aspect = window.innerWidth / window.innerHeight
	// 更新相机投影矩阵
	camera.updateProjectionMatrix()
});

四、完整代码

<script setup>
import * as THREE from 'three';
// 导入轨道控制器
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';

// 导入gui调试开发
import {GUI} from 'three/examples/jsm/libs/lil-gui.module.min.js'

// 场景、摄像机和渲染器设置
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
camera.position.set(1,1,5)
camera.lookAt(0,0,0)

//这里将renderer(渲染器)的dom元素(renderer.domElement)添加到HTML 文档中
document.body.appendChild(renderer.domElement);
//创建立方体
let geometry = new THREE.BoxGeometry( 1, 1, 1 ); 
//添加材质(外观)
const material = new THREE.MeshBasicMaterial( {color: 0x123456} );
//创建网格 
const cube = new THREE.Mesh( geometry, material ); 

// 添加OrbitControls来控制摄像机
const controls = new OrbitControls(camera, renderer.domElement);
//设置一些属性
controls.enableDamping  = true //启用阻尼(惯性)
controls.dampingFactor = 0.05 //阻尼惯性有多大
controls.autoRotate = true // 自动旋转
controls.autoRotateSpeed = 10.0 //围绕目标旋转的速度将有多快

// 为了更清晰的看到物体的运动轨迹,可以添加坐标轴辅助对象AxesHelper
// 红色代表 X 轴. 绿色代表 Y 轴. 蓝色代表 Z 轴.
const axesHelper = new THREE.AxesHelper( 5 );
scene.add( axesHelper );

//调用scene.add( ) 将物体添加到场景中
scene.add( cube );

// 渲染循环
function animate() {
  //注意:以上属性设置后,必须再动画循环里面调用update()更新控制器
  controls.update()
  requestAnimationFrame(animate);
  //让立方体旋转
  cube.rotation.x += 0.01
  cube.rotation.y += 0.01
  renderer.render(scene, camera);
}
 
animate();

// 创建GUI
let gui = new GUI();
//准备一个对象,对象里包含点击全屏以及退出全屏的函数
let screenObj = {
	Fullscreen:function(){
		document.body.requestFullscreen()
		console.log("点击全屏");
	},
	ExitFullscreen:function(){
		document.exitFullscreen()
		console.log("退出全屏");
	}
}
gui.add(screenObj,"Fullscreen").name('点击全屏')
gui.add(screenObj,"ExitFullscreen").name("退出全屏")

// 监听窗口的变化
window.addEventListener('resize',()=>{
	// 重置渲染器宽高比
	renderer.setSize(window.innerWidth,window.innerHeight)
	// 重置相机宽高比
	camera.aspect = window.innerWidth / window.innerHeight
	// 更新相机投影矩阵
	camera.updateProjectionMatrix()
});
</script>

五、效果图

在这里插入图片描述vue3简单使用threejs立方缓冲几何体(BoxGeometry)效果图

标签:threejs,THREE,几何体,window,renderer,vue3,new,three,全屏
From: https://blog.csdn.net/m0_50383069/article/details/142974406

相关文章

  • vue3使用pinia仓库解构赋值响应式丢失的解决方式
    代码storeimport{defineStore}from"pinia";import{ref}from"vue";exportconstuseMyTestStore=defineStore('mytestStore',()=>{//stateconstcount=ref(0);constcount2=ref(1);constincrement2......
  • Vue3 + Openlayers10示例 台风轨迹和台风圈
    前言假装已经完成了vue3和Openlayers10开发环境的搭建,如果有需要,可搜索vue+Openlayers环境搭建的相关文章。本示例基于Vue3和Openlayers10的环境,实现台风轨迹和台风圈的效果。一、安装插件安装Element-plus插件,其实只在台风列表的地方用到了el-checkbox,可根据实际需......
  • vue3+h5+echarts引入折线图
     实现效果:1.引入echarts,在终端输入命令npminstallecharts--save2.安装成功后直接复制以下代码即可<template><divref="chartDom"class="echart"id="main"></div></template><scriptsetup>import{onMounted,......
  • vue3+vite+ts+vue3-qr-reader实现移动端h5+pc端调起摄像头核销二维码
    1、首先我们看示例图:h5:pc:  2、我们开始做第一步就是装依赖:yarnadd vue3-qr-reader或者npminstall vue3-qr-reader我记得装完后还需要装一个 yarnadd-Dsass 3、封装一个组件公用:组件位置你们自己定我写在了components/QrScanner/ind......
  • 在Vue3中使用vuex
    Vuex简介Vuex是Vue.js官方的状态管理库,帮助我们在中大型应用中集中管理组件间的共享状态。它通过state、getters、mutations和actions实现响应式数据管理Vuex核心概念State:全局状态,存储应用的核心数据。Getters:类似于组件中的计算属性,用于从state中派生出......
  • Vue3 路由(上)
    路由器两种模式history模式:constrouter=CreateRouter({history:createWebHistory(),//history模式})优点:url更加美观,不带有#,更接近传统网站的url缺点:后期项目上限,需要配合服务端处理路径问题,否则刷新会404错误hash模式:constrouter=CreateRouter({histor......
  • nbsaas vue3管理后台框架
    nbsaasvue3管理后台框架一、项目概述NbsaasAdminVue是一个基于Vue.js3.0构建的轻量级后台管理系统,结合了现代前端技术栈的最佳实践,旨在帮助开发者快速构建具有高可扩展性和良好用户体验的后台管理系统。该项目拥有简洁的UI设计,强大的功能模块,支持多种自定义配置,......
  • vue3中的defineProps,defineEmits,defineExpose的使用详解
    defineProps 和 defineEmits 都是只能在 <scriptsetup> 中使用的编译器宏。他们不需要导入,且会随着 <scriptsetup> 的处理过程一同被编译掉。defineProps 接收与 props 选项相同的值,defineEmits 接收与 emits 选项相同的值,它们具备完整的类型推断并且在scriptse......
  • vue3 antvX6的使用源码
    npminstall--save@antv/x6<template><divclass="dashboard-container"><p>选择节点</p><button@click="save">保存</button><divclass="antvBox"><divclass="m......
  • vue3 做个点击拖拽的的按钮
    //视图层<divclass="regularAI"ref="draggableDiv":style="{top:`${position.y}px`,left:`${position.x}px`}"> <span@mousedown="startDrag">{{isDragging?'拖拽中':'点击拖拽'}}</span&......