three.js学习(基础)

news2024/11/26 10:25:36

目录

前言:

参考文档:

实现 

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.coloradmin.cn/o/770257.html

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

相关文章

韦东山Linux驱动入门实验班(4)LED驱动

前言 &#xff08;1&#xff09;我们学习完hello驱动之后&#xff0c;对驱动程序开发有了一点点认识了之后。现在可以开始对硬件进行实际操作了&#xff0c;本人使用的是i.max6ull开发板&#xff0c;STM32MP157和全志的D1H也会进行讲解。 &#xff08;2&#xff09;如果还有对于…

ubuntu 设置系统时间矫正

1、安装ntpdate&#xff0c;同步标准时间 2、修改时区 3、在.profile文件中写入上面提示的信息&#xff0c;保存退出、更新配置文件或者重启生效 3.1、或者配合上面的cp那条命令&#xff0c;用下面的命令保存到底层 $ hwclock --systohc 4、重启之后&#xff0c;查看日期时间已…

【动手学深度学习】--14.网络中的网络 NiN

文章目录 网络中的网络 NiN1.NiN块1.2NiN架构1.3NiN模型1.4训练模型 网络中的网络 NiN 学习视频&#xff1a;网络中的网络 NiN【动手学深度学习v2】 官方笔记&#xff1a;网络中的网络&#xff08;NiN&#xff09; 全连接层的问题 LeNet、AlexNet和VGG都有一个共同的设计模式…

如果微信消息显示“已读”的话......

近日&#xff0c;一则 #如果微信显示已读的话# 话题冲上了微博热搜榜单。 “已读”是很多社交软件拥有的功能&#xff0c;如果对方接收并查看了消息&#xff0c;就会在消息上显示“已读”&#xff0c;但目前微信还没有推出这项功能。 对于“已读”功能&#xff0c;不少网友纷纷…

推荐一款在win、mac、android之间传递文件或消息的软件,LocalSend,前提需要在同一网络下

官方地址 https://github.com/localsend/localsend/releases/download/v1.10.0/LocalSend-1.10.0.dmg 可选择不同的设备进行发送接收&#xff0c;超级好用

我又被文章版权碰瓷公司起诉了:索赔10000元

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 事情是这样的&#xff0c;昨天我正在上班摸鱼&#xff0c;突然收到一个从新疆乌鲁木齐打来的电话。我本不想接&#xff0c;以为又是广告骚扰电话&#xff0c;结果突然弹出一条短信&#xff0c;说是…

Ceph 分布式存储之应用

一、创建 CephFS 文件系统 MDS 接口 1、服务端操作 1&#xff09;在管理节点创建 mds 服务 [rootadmin ceph]# cd /etc/ceph [rootadmin ceph]# ceph-deploy mds create node01 node02 node03 [ceph_deploy.conf][DEBUG ] found configuration file at: /root/.cephdeploy.c…

Vue3栅格(Grid)

24 栅格系统 概述 布局的栅格化系统&#xff0c;我们是基于行&#xff08;Row&#xff09;和列&#xff08;Col&#xff09;两个组件相互配合来定义信息区块的外部框架&#xff0c;以保证页面的每个区域能够稳健地排布起来。 下面简单介绍一下它的工作原理&#xff1a; 通过Ro…

java贪心算法案例

1.零钱找回问题 这个问题在我们的日常生活中就更加普遍了。假设1元、2元、5元、10元、20元、50元、100元的纸币分别有c0, c1, c2, c3, c4, c5, c6张。现在要用这些钱来支付K元&#xff0c;至少要用多少张纸币&#xff1f;用贪心算法的思想&#xff0c;很显然&#xff0c;每一步…

2023年,从0彻底打通自动化测试进阶高级岗,卷起来...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、自动化测试的分…

【设计模式】2、工厂方法模式

文章目录 当你在编写代码的过程中&#xff0c; 如果无法预知对象确切类别及其依赖关系时&#xff0c; 可使用工厂方法。 工厂方法将创建产品的代码与实际使用产品的代码分离&#xff0c; 从而能在不影响其他代码的情况下扩展产品创建部分代码。 例如&#xff0c; 如果需要向应…

Redis的五大数据类型和各自的

- 字符串(String) string 数据结构是简单的 key-value 类型。简单动态字符串**&#xff08;simple dynamic string&#xff0c;SDS&#xff09;。相比于 C 的原生字符串&#xff0c;Redis 的 SDS 不光可以保存文本数据还可以保存二进制数据&#xff0c;并且获取字符串长度复杂度…

手把手教你玩爆破 --- 关于暴力破解的一些故事

今天不是来打游戏的&#xff0c;我们的重点是了解一些针对web登陆界面的爆破手法。 就是在很多场合中上不了台面的一类攻击手法。简单的通过正常请求的发送&#xff0c;不断尝试用户名密码&#xff0c;最终登陆上去的方法。我们可以称之为爆破、穷举攻击。 1.概述 穷举就是枚…

OpenCv之图像金字塔

目录 一、图像金字塔介绍 二、高斯金字塔 三、拉普拉斯金字塔 一、图像金字塔介绍 图像金字塔是图像中多尺度表达的一种&#xff0c;最主要用于图像的分割&#xff0c;是一种以多分辨率来解释图像的有效但概念简单的结构。简单来说&#xff0c;图像金字塔是同一图像不同分辨率…

基于区块链技术的元宇宙游戏将成为时代浪潮的弄潮儿

区块链技术作为互联网新兴技术逐渐走进公众视野&#xff0c;其中心化、分布式、公开透明、不可篡改等技术特性使其可以在各个领域大展拳脚。区块链技术在金融、公益、文化、物流、农业等领域带来了全新的思维视角、全新的场景与全新的解决方案&#xff0c;无疑是移动互联网之后…

Spring Batch之读数据库—JdbcCursorItemReader之自定义PreparedStatementSetter(三十八)

一、自定义PreparedStatementSetter 详情参考我的另一篇博客&#xff1a; Spring Batch之读数据库——JdbcCursorItemReader&#xff08;三十五&#xff09;_人……杰的博客-CSDN博客 二、项目实例 1.项目实例 2.代码实现 BatchMain.java&#xff1a; package com.xj.dem…

推荐10款设计师都在用的3d机械工程软件

新产品和系统的研究和开发需要特定的软件。您必须能够设计建筑物、系统、机械和设备的蓝图和示意图。您还需要能够与其他工程师、绘图员和团队成员协作&#xff0c;同时有效且高效地工作。设计工程师的软件必须简化其流程&#xff0c;以避免妨碍他们的设计和开发工作。 好的工…

SpringBoot项目中WEB与Controller的联系--【SB系列之009】

SpringBoot系列文章目录 SpringBoot 的项目编译即报错处理–SB系列之001 —第一部的其它章节可以通过001链接 ———————————————— SpringBoot项目中WEB页面放哪里–【SB系列之008】SpringBoot项目中WEB与Controller的联系–【SB系列之009】SpringBoot项目中MVC…

喜报|英码科技联合广师大荣获“智芯杯”AI芯片应用创新创业大赛两大奖项

7月15日&#xff0c;由中国仪器仪表学会主办的全国首届“智芯杯”AI芯片应用创新创业大赛总决赛暨颁奖典礼圆满结束&#xff0c;英码科技联合广东技术师范大学设计开发的“AI视觉&#xff0c;让工厂建设更智慧”和“基于AI的智慧校园无感考勤系统”创新项目均荣获三等奖。 ​ 自…

曲师大2023大一新生排位赛-C.String题解

C.String 题目描述 众所周知&#xff0c;许师哥精通字符串。 一天&#xff0c;许师哥意外的获得了一个字符串&#xff0c;但他发现这个字符串并不是一个回文串&#xff0c;因此他非常生气。于是他决定从这个字符串中删除若干个字符使得 剩余的字符串为一个回文串。 回想回文串…