three.js学习2(基础)

news2024/12/23 13:22:12

目录

前言:

参考文档(gsap使用):

目标一、使物体移动、旋转

Ⅰ、设置时钟方式

Ⅱ、使用gsap

1、安装

2、引入使用 

 目标二、自适应

目标三、双击全屏或者退出全屏


前言:

上面学习了three.js在页面上的简单显示,本次学习把展示在页面上的物体动起来

参考文档(gsap使用):

TweenMax 基础案例_TweenMax中文网tweenmax 是greensock 动画平台的核心插件,greensock 是一套用于在所有主流浏览器中制作高性能html5动画的工具。tweenmax中文网提供tweenmax、tweenlite、timelinemax、timelinelite核心功能的中文文档和greensock 相关插件下载。icon-default.png?t=N6B9http://www.tweenmax.com.cn/demo/ 

目标一、使物体移动、旋转

Ⅰ、设置时钟方式
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import * as THREE from 'three'
// 导入轨道控制器
import { OrbitControls } from 'three/addons/controls/OrbitControls.js'

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)

// 设置时钟
const clock = new THREE.Clock()

// 渲染
const render = () => {
	// 物体移动
	const deltaTime = clock.getDelta()
	console.log(deltaTime)
	const time = clock.getElapsedTime()
	cube.position.x = (time % 5) * 1
	if (cube.position.x > 8) {
		cube.position.x = 0
	}
	// 物体旋转
	cube.rotation.x += 0.01
	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>
Ⅱ、使用gsap
1、安装

 yarn add gsap

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

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)

// 设置动画
const animatel = gsap.to(cube.position, {
	x: 5,
	duration: 5,
	// 设置重复次数
	repeat: -1,
	// 设置往返运动
	// 延迟两秒
	delay: 2,
	yoyo: true,
	onComplete: () => {
		console.log('动画完成')
	},
	onStart: () => {
		console.log('动画开始')
	}
})
gsap.to(cube.rotation, { x: 2 * Math.PI, duration: 5, repeat: -1 })

// 监听事件,双击暂停
window.addEventListener('dblclick', () => {
	// 动画
	if (animatel.isActive()) {
		animatel.pause()
	} else {
		animatel.resume()
	}
})
// 渲染
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>

 目标二、自适应

解决页面在进行缩放之后,显示bug

// 监听页面变化
window.addEventListener('resize', () => {
	// 更新摄像头
	camera.aspect = window.innerWidth / window.innerHeight
	// 更新摄像机的投影矩阵
	camera.updateProjectionMatrix()
	// 更新渲染器
	renderer.setSize(window.innerWidth, window.innerHeight)
	// 设置渲染器的像素比
	renderer.setPixelRatio(window.devicePixelRatio)
})

目标三、双击全屏或者退出全屏

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

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 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/773020.html

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

相关文章

【Java项目实战-牛客社区】--idea maven配置

第一 IDEA集成Maven插件&#xff0c;并配置Maven 以下步骤中&#xff0c;重点关注红色方框的配置 第二 IDEA 创建 Maven 项目 步骤一&#xff1a;创建模块&#xff0c;选择Maven&#xff0c;点击Next 步骤二&#xff1a;填写模块名称&#xff0c;坐标信息&#xff0c;点击finis…

vue2 实现后台管理系统左侧菜单联动实现 tab根据路由切换联动内容,并支持移动端框架

效果图&#xff1a; pc端 移动端 由于代码比较多&#xff0c;我这里就不一一介绍了&#xff0c;可以去我的git上把项目拉下来 git地址https://gitee.com/Flechazo7/htglck.git 后台我是用node写的有需要的可以评论联系

EDM营销过时了?不,这才是跨境电商成功的最佳工具

根据最近的一项研究&#xff0c;电子邮件仍然是最具说服力的营销工具和沟通形式之一。虽然即时通讯等其他渠道正在扎根&#xff0c;但电子邮件仍然是影响最深远的商业交流形式。到2023年&#xff0c;每天发送和接收的电子邮件总数可能会超过333亿封。所以&#xff0c;如果您希望…

Tensorflow和Keras安装流程,jupyter无法使用keras解决方案

Tensorflow和Keras安装流程,jupyter无法使用keras解决方案 1.Base: anaconda https://www.anaconda.com/download 2.安装python3.8&#xff0c;Tensorflow2.13.0&#xff0c;Keras2.13.1 –创建conda环境-在Anaconda Prompt中输入命令&#xff0c; conda create -n tensorfl…

安森美深力科汽车空调自动控制方案,助力推动能效、安全、节能、环保

NCV4266-2CST50T3G 安森美深力科汽车空调自动控制方案&#xff0c;助力推动能效、安全、节能、环保 汽车智能化、自动驾驶、电动汽车/汽车功能电子化等趋势的推进正使汽车变得更加安全、舒适、环保和节能&#xff0c;是创新的关键。为自动驾驶、汽车功能电子化、传统动力总成…

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

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

ASFF Learning Spatial Fusion for Single-Shot Object Detection 论文学习

1. 解决了什么问题&#xff1f; 目标检测取得了显著成绩&#xff0c;但是检测不同尺度的目标仍然是一个挑战。金字塔或多层级特征是解决目标检测中尺度变化的常用手段。但对于单阶段目标检测器而言&#xff0c;各特征尺度之间不一致性制约了算法的表现。与图像金字塔相比&…

Java版知识付费源码 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台

知识付费平台主要指的是能够通过付费来满足用户知识需求的平台&#xff0c;用户可以通过该平台来消费知识或者开展知识买卖等行为。 此处的平台是一个广义的概念&#xff0c;可以是微信小程序或者论坛&#xff0c;也可以是网页或者手机APP&#xff0c;等&#xff0c;就我国的情…

新东方教育收入前景良好,估值低迷,股票回购令人失望

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 分析师对新东方的收入预测 考虑到新东方&#xff08;EDU&#xff09;的销售指引和卖方分析师的预测&#xff0c;猛兽财经认为&#xff0c;新东方目前的收入增长前景非常好。 根据其财务指引的中点&#xff0c;新东方预计其…

Mysql——》InnoDB内存结构和磁盘存储结构

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

options 预检测请求

文章目录 产生原因简单请求复杂请求携带了 cookie 情况 优化预检测请求 产生原因 在跨域的情况下&#xff0c;如果浏览器发送的是复杂请求&#xff0c;会先发送一个 OPTIONS 预检测请求&#xff0c;从而获知服务端是否允许该跨域请求。服务器确认允许之后&#xff0c;才发起实…

认识Spring(1)

hi,大家好,今天继续为大家带来Spring的相关内容 文章目录 &#x1f9c1;1.理解Spring和IOC&#x1f9c1;2.DI和DF&#x1f378;2.1什么是DI&#x1f378;2.2什么是DF&#x1f378;2.3DI和DF的区别 &#x1f9c1;3 Spring创建和使用&#x1f378;3.1创建Spring项目&#x1f361…

如何调整Vivado菜单栏字体大小

Vivado整体字体缩放开关 点击齿轮图标Settings 点击齿轮图标Settings Tool Settings下找到Display选项&#xff1a;找到Scaling选项选择User defined即可调整缩放倍率&#xff08;100/125/150/175%…&#xff09;。 点击Apply重启后生效

字符函数和字符串函数上篇(详解)

❤️ 作者简介 &#xff1a;RO-BERRY 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识&#xff0c;对纯音乐有独特的喜爱 &#x1f4d7; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;如果你也感兴趣的话欢迎关注博主&#xff0c;期待更新 字符函数和字符串函数 &a…

css之flex两端对齐,且元素自动换行、flex、flow

文章目录 效果图htmlstyleflex-flow 效果图 html <div class"parent_element"><div class"item">7</div><div class"item">7</div><div class"item">7</div><div class"item"…

红队打靶:KIOPTRIX1.2打靶思路详解(vulnhub)

目录 写在开头 第一步&#xff1a;主机发现和端口扫描 第二步&#xff1a;Web渗透与CMS漏洞利用 第三步&#xff1a;敏感信息搜索 第四步&#xff1a;SSH登录与提权 总结与思考 写在开头 本篇博客根据大佬红队笔记的视频进行打靶&#xff0c;详述了打靶的每一步思路&a…

ACL 2023 | 通过语音离散表示统一语音翻译和机器翻译

前言 在当今全球化和多元文化的时代&#xff0c;语音翻译技术正成为我们跨越语言障碍的得力助手&#xff01;语音翻译&#xff08;Speech Translation, ST&#xff09;旨在将源语言语音翻译成目标语言文本&#xff0c;广泛应用于会议演讲翻译、视频字幕翻译、AR增强翻译等各种…

【启发式算法】灰狼优化算法【附python实现代码】

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…

快速批量改名文件!随机字母命名,让文件名更有创意!

想要让文件名更加有创意和个性化吗&#xff1f;不妨尝试使用随机字母来批量改名文件&#xff01;无论是照片、文档还是其他文件&#xff0c;只需要简单的几个步骤&#xff0c;您就可以为它们赋予一个独特的随机字母命名。这不仅可以帮助您整理文件&#xff0c;还能增加一些乐趣…

AtCoder Beginner Contest 310-D - Peaceful Teams(DFS)

Problem Statement There are N sports players. Among them, there are M incompatible pairs. The i-th incompatible pair (1≤i≤M) is the Ai​-th and Bi​-th players. You will divide the players into T teams. Every player must belong to exactly one team, an…