three.js学习(基础)

目录

前言:

参考文档:

实现 

1、安装

2、声明

3、引入使用


前言:

前面学习了three.js物体的动画展示,接下来学习应用图形界面更改变量

目标、页面提供操作区域进行变量修改

参考文档:

dat.gui - npmA lightweight graphical user interface for changing variables in JavaScript.. Latest version: 0.7.9, last published: a year ago. Start using dat.gui in your project by running `npm i dat.gui`. There are 216 other projects in the npm registry using dat.gui.https://www.npmjs.com/package/dat.gui

实现 

1、安装

npm install --save dat.gui

或者

yarn add dat.gui

2、声明

在env.d.ts同级目录下创建dat.gui.d.ts

declare module 'dat.gui'

3、引入使用
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import * as THREE from 'three'
// 导入轨道控制器
import { OrbitControls } from 'three/addons/controls/OrbitControls.js'
// 导入gui
import * as dat from 'dat.gui'
import gsap from 'gsap'

const container = ref<HTMLDivElement>()

// 创建场景
const scene = new THREE.Scene()

// 创建相机对象
const camera = new THREE.PerspectiveCamera(
	75,
	window.innerWidth / window.innerHeight,
	0.1,
	1000
)
// 设置相机位置
camera.position.set(0, 0, 10)
scene.add(camera)

// 添加物体
// 创建几何体
const cubeGeometry = new THREE.BoxGeometry(1, 1, 1)
const cubeMaterial = new THREE.MeshBasicMaterial({ color: 0xffff00 })
// 根据几何体和材质创建物体
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial)
// 修改元素位置
// cube.position.x = 2
// 缩放
// cube.scale.x = 2
// 旋转
cube.rotation.set(Math.PI / 4, 0, 0, 'XYZ')
// 将几何体添加到场景中
scene.add(cube)

// 初始化渲染器
const renderer = new THREE.WebGLRenderer()
renderer.setClearColor(new THREE.Color(0xeeeeee))
// 设置three.js渲染区域的尺寸(像素px)
renderer.setSize(window.innerWidth, window.innerHeight)

// 创建控制器
const controls = new OrbitControls(camera, renderer.domElement)

// 坐标轴
const axesHelper = new THREE.AxesHelper(10)
scene.add(axesHelper)

// 监听页面变化
window.addEventListener('resize', () => {
	// 更新摄像头
	camera.aspect = window.innerWidth / window.innerHeight
	// 更新摄像机的投影矩阵
	camera.updateProjectionMatrix()
	// 更新渲染器
	renderer.setSize(window.innerWidth, window.innerHeight)
	// 设置渲染器的像素比
	renderer.setPixelRatio(window.devicePixelRatio)
})
// 监听事件,双击暂停
window.addEventListener('dblclick', () => {
	if (document.fullscreenElement === null) {
		renderer.domElement.requestFullscreen()
	} else {
		document.exitFullscreen()
	}
})

// 设置动画
const animatel = gsap.to(cube.position, {
	x: 5,
	duration: 5,
	// 设置重复次数
	repeat: -1,
	// 设置往返运动
	// 延迟两秒
	delay: 2,
	yoyo: true,
	onComplete: () => {
		console.log('动画完成')
	},
	onStart: () => {
		console.log('动画开始')
	}
})
const gui = new dat.GUI()
// 修改物体位置
gui
	.add(cube.position, 'x')
	.min(0)
	.max(5)
	.step(0.01)
	.name('移动X轴')
	.onChange((value: any) => {
		console.log(value)
	})
	.onFinishChange((value: any) => {
		console.log(value)
	})
// 修改物体颜色
const params = {
	color: '#ffff00',
	fn: () => {
		if (animatel.isActive()) {
			animatel.pause()
		} else {
			animatel.resume()
		}
	}
}
gui.addColor(params, 'color').onChange((value: any) => {
	cube.material.color.set(value)
})
// 设置物体的显示隐藏
gui.add(cube, 'visible').name('是否显示')
// 设置按钮点击触发事件
gui.add(params, 'fn').name('物体运动')
// 设置文件夹
const folder = gui.addFolder('设置立方体')
folder.add(cube.material, 'wireframe')
// 渲染
const render = () => {
	controls.update()
	renderer.render(scene, camera) // 执行渲染操作
	requestAnimationFrame(render)
}

onMounted(() => {
	container.value?.appendChild(renderer.domElement)
	render()
})
</script>

<template>
	<div ref="container" class="container"></div>
</template>
<style scoped lang="scss">
.container {
	height: 100%;
	width: 100%;
}
</style>

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

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

相关文章

javaweb使用Thymeleaf 最凝练的CRUD项目-中

javaweb使用Thymeleaf 最凝练的CRUD项目-中 6、显示首页 ①目标 浏览器访问index.html&#xff0c;通过首页Servlet&#xff0c;渲染视图&#xff0c;显示首页。 ②思路 ③代码 [1]创建PortalServlet <servlet><servlet-name>PortalServlet</servlet-name…

玩转内存修改函数——【C语言】

在上篇博客中&#xff0c;我们学习了字符串函数&#xff0c;针对一些字符串我们可以做出一系列操作。接下来我们将学习一些内存修改函数&#xff08;#inlcude<string.h>&#xff09;&#xff0c;让我们一起走进mempy、memmove、memcmp函数中。 目录 mempcy函数​编辑 m…

kaggle新赛:学生摘要评估大赛赛题解析(NLP)

赛题名称&#xff1a;CommonLit - Evaluate Student Summaries 赛题链接&#xff1a; https://www.kaggle.com/competitions/commonlit-evaluate-student-summaries/ 赛题背景 摘要写作是所有年龄段学习者的一项重要技能。总结可以增强阅读理解能力&#xff0c;特别是在第二…

12. 一些开发中遇到的SQL问题

文章目录 一些开发中遇到的SQL问题1. sql报11090错误,原因可能是以下错误&#xff0c;在&#xff1f;占位符后有一个空格2. 占位符&#xff1f;的位置不能是表名&#xff0c;否则会无法进行预编译3. mysql中desc是关键字&#xff0c;如果字段名称为desc会报错4. 数据库中时间格…

[JavaScript游戏开发] 2D二维地图绘制、人物移动、障碍检测

系列文章目录 第一章 2D二维地图绘制、人物移动、障碍检测 文章目录 系列文章目录前言一、列计划1.1、目标1.2、步骤 二、使用步骤2.1、准备素材(图片)&#xff1a;草坪、人物(熊猫)、障碍(石头)2.2、初始化布局(表格)&#xff0c;边距设置为0&#xff0c;无边框&#xff0c;设…

【java】【基础1】数据类型运算符

目录 一、数据类型&#xff08;4大类8种&#xff09; 1.1类型转换 1、自动类型转换 2、表达式的自动类转换 3、强制类型转换 二、运算符 2.1基本算术运算符 2.2自增自减运算符 2.3赋值运算 2.4关系运算符 2.5逻辑运算符 2.6三元运算符 2.7运算符的优先级 三、API文档&am…

机械设计制造及其自动化专业向PLC方向发展的可行性

是的&#xff0c;机械设计制造及其自动化专业往PLC&#xff08;可编程逻辑控制器&#xff09;方向发展是可行的。PLC是一种用于控制和自动化各种机械设备和工业过程的计算机控制系统。它被广泛应用于工业自动化领域&#xff0c;包括制造业、能源行业、交通运输等。 我这里刚好…

uniapp引入echarts

作为前端在开发需求的时候经常会遇到将数据展示为图表的需求&#xff0c;之前一直用的HBuilder的图表插件uCharts&#xff0c;使用方法可以参考我的另一篇博客&#xff1a;uniapp 中使用图表&#xff08;秋云uCharts图表组件&#xff09; 但是最近发现uCharts很多功能都需要付…

基于单片机的智能路灯控制系统人体感应灯光控制系统的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;LCD1602液晶显示当前时间、年月日、时分秒&#xff1b;按键看看有设置自动手动模式&#xff1b;3路红外探头用来感应当前3个区域是否有人&#xff1b;按键可以设置当前时间、开启和关闭教室灯光时间&#xff1b;在手动模式下&#…

需求条目化与自动估算强强联合 助力软件估算自动化

痛点&#xff1a; 需求是产品的源头&#xff0c;是项目规模估算的基石。而传统的软件规模估算是由项目成员手工进行&#xff0c;对人员能力、经验、方法都有一定的要求&#xff0c;但是效果不好而且耗时费力&#xff0c;不能保持规模估算的一致性。 而导致这些问题的原因&#…

leetcode 101.对称二叉树

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;对称二叉树 思路&#xff1a; 这道题和 leetcode 100.相同的树 类似&#xff0c;是上一道的变形题。✨leetcode 100.相同的树 代码链接&#xff1a;【往期文章】leetcode 100.相同的树。这道题把根的左子树和右子树看作两…

CANoe如何配置Master/Slave模式

系列文章目录 文章目录 系列文章目录前言一、CANoe配置端口二、CANoe配置Master模式三、CANoe配置Slave模式前言 随着智能电动汽车的行业的发展,车载以太网的应用越来越广泛,最近很多朋友在问CANoe Master/Slave模式如何设置,车载以太网物理层也有一项是测试Master/Slave模式…

数据结构day5(2023.7.19)

一、Xmind整理&#xff1a; 双向链表的插入与删除&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;单链表任意元素删除 /** function: 按元素删除* param [ in] * param [out] * return 返回堆区首地址*/ Linklist delete_by_data(datatype key,Linklist L) …

物联网(IoT):连接未来的万物之网

引言&#xff1a; 物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;是指通过各种智能设备和传感器&#xff0c;使物体能够互联互通、收集和共享数据的网络。随着科技的不断进步和智能设备的普及&#xff0c;物联网的应用呈现出爆发式增长&#xff0c;对各…

Leetcode-每日一题【109.有序链表转换二叉搜索树】

题目 给定一个单链表的头节点 head &#xff0c;其中的元素 按升序排序 &#xff0c;将其转换为高度平衡的二叉搜索树。 本题中&#xff0c;一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。 示例 1: 输入: head [-10,-3,0,5,9]输出: [0,-3,9,-…

Es存储和查询

基本概念 Cluster 集群&#xff0c;一个ES集群是由多个节点(Node)组成的&#xff0c;每个集群都有一个cluster name 作为标识&#xff0c; 在同一网段下的Es实例会通过cluster name 决定加入哪个集群下。 node 节点&#xff0c;一个ES实例就是一个node&#xff0c;一个机器可以…

SpringBoot(八)拦截器Interceptor

上篇介绍了Filter过滤器的使用&#xff0c;提起过滤器&#xff0c;就不得不再提起另外一个叫做拦截器的东西。两者的作用类似&#xff0c;都可以实现拦截请求的作用&#xff0c;但其实两者有着非常大的区别。本篇&#xff0c;我们就来学习下拦截器的使用。 如果你是新手&#x…

Java阶段五Day09

Java阶段五Day09 文章目录 Java阶段五Day09网关Gateway跨域的问题熔断限流组件sentinel微服务场景熔断降级限流降级 sentinel学习案例sentinel介绍重要的核心概念准备一个测试的工程定义资源定义规则sentinel运行原理本地文件定义规则整合nacos实现规则的远程读取规则的内容详解…

【广州华锐互动】AR远程巡检系统在设备维修保养中的作用

随着科技的不断发展&#xff0c;AR(增强现实)远程巡检系统在设备检修中发挥着越来越重要的作用。这种系统可以将AR技术与远程通信技术相结合&#xff0c;实现对设备检修过程的实时监控和远程指导&#xff0c;提高设备检修的效率和质量。 首先&#xff0c;AR远程巡检系统可以帮助…

Word字间距怎么调整?2023最新方法总结!

“作为一个Word新手&#xff0c;里面的好多功能我都没有弄清楚。今天正好写了一篇文章&#xff0c;但不知道应该怎么调整字间距。有朋友知道Word字间距怎么调的吗&#xff1f;快教教我&#xff01;” Word作为一个便捷的办公软件&#xff0c;让我们的工作更方便。学习好Word的使…