使用Three.js创建旋转的立方体

使用Three.js创建旋转的立方体

在本篇技术博客中,我们将介绍如何使用Three.js创建一个简单的场景,其中包含一个旋转的立方体。我们将学习如何设置场景、摄像机、立方体和渲染器,以及如何使用OrbitControls和gsap库来实现立方体的旋转动画和交互效果。

准备工作

在开始之前,我们需要确保以下准备工作已完成:

  1. 在你的项目目录中创建一个HTML文件,例如index.html,并在其中引入Three.js库和OrbitControls库:
    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Three.js Rotate Cube</title>
    </head>
    <body><script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/jsm/controls/OrbitControls.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.8.0/gsap.min.js"></script><script src="app.js"></script>
    </body>
    </html>
    

  2. 在项目目录下创建一个app.js文件,并将你提供的Three.js代码复制到其中。
  3. 创建场景和立方体

    以下是在Three.js中创建场景、摄像机、立方体和渲染器的代码:

    // 导入Three.js库中的所有模块,并命名为THREE
    import * as THREE from 'three';
    // 导入OrbitControls模块,并命名为OrbitControls
    import { OrbitControls} from "three/examples/jsm/controls/OrbitControls";
    // 导入gsap库,并命名为gsap
    import { gsap } from "gsap";// 创建一个Three.js场景
    const scene = new THREE.Scene();// 创建透视相机,参数分别为视野角度,长宽比,近裁剪面和远裁剪面
    const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
    // 设置相机位置
    camera.position.set(10, 10, 10);
    // 将相机添加到场景中
    scene.add(camera);// 创建立方体的几何体
    const box = new THREE.BoxGeometry(1, 1, 1);
    // 创建立方体的材质,颜色为绿色
    const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
    // 创建立方体,并将几何体和材质传入
    const cube = new THREE.Mesh(box, material);
    // 将立方体添加到场景中
    scene.add(cube);// 创建WebGL渲染器
    const renderer = new THREE.WebGLRenderer();
    // 设置渲染器的大小为窗口大小
    renderer.setSize(window.innerWidth, window.innerHeight);
    // 将渲染器的DOM元素添加到页面中
    document.body.appendChild(renderer.domElement);

 

以上代码创建了一个Three.js场景,并在场景中添加了一个绿色的立方体。摄像机的位置被设置为(10, 10, 10),以便我们能够从不同角度看到立方体。

添加OrbitControls

为了能够通过鼠标控制摄像机视角,我们使用OrbitControls库:

// 使用OrbitControls添加交互控制
const controls = new OrbitControls(camera, renderer.domElement);
// 启用阻尼效果,使控制更加平滑
controls.enableDamping = true;

通过这段代码,我们添加了OrbitControls,使得用户可以通过鼠标拖拽和滚动来旋转和缩放场景中的内容。

渲染和动画

// 定义渲染和动画函数
function render(time) {// 更新OrbitControls的状态,以响应用户的交互controls.update();// 渲染场景和相机renderer.render(scene, camera);// 使用requestAnimationFrame持续进行渲染和动画requestAnimationFrame(render);
}// 调用渲染和动画函数,启动动画效果
render();

以上代码是一个渲染函数,它使用requestAnimationFrame来持续地更新场景和摄像机,从而实现动画效果。controls.update()用于更新OrbitControls的状态,以便用户能够交互地控制场景的旋转。

使用gsap创建动画效果

const gs = gsap.to(cube.rotation, {// 动画持续时间为5秒duration: 5,// 绕y轴旋转360度,即一圈y: Math.PI * 2,// 动画重复次数为无限次repeat: -1,// 动画来回反复播放yoyo: true,// 延迟1秒后开始动画delay: 1,// 使用反弹效果的缓动函数ease: "bounce.out"
});

在这段代码中,我们使用gsap库来创建一个立方体的旋转动画。立方体的旋转是围绕y轴旋转的,并且具有反弹效果,持续5秒钟,不断重复。

添加交互功能

// 添加双击事件监听器,用于暂停或继续动画
window.addEventListener("dblclick", () => {// 如果动画正在进行中,则暂停动画if (gs.isActive()) {gs.pause();} else {// 如果动画已经暂停,则继续动画gs.resume();}
});
//可以自己调整为双击进入全屏const fullscreen=document.fullscreenElement||document.webkitFullscreenElement;if(!fullscreen){renderer.domElement.requestFullscreen();}else{document.exitFullscreen();}

 以上代码为窗口添加了一个双击事件监听器。当用户双击窗口时,我们会检查立方体的旋转动画是否正在进行中,如果是,则暂停动画;如果不是,则继续动画。

响应窗口大小改变

// 添加窗口大小改变事件监听器,使场景自适应窗口大小
window.addEventListener("resize", () => {// 更新相机的长宽比camera.aspect = window.innerWidth / window.innerHeight;// 更新相机投影矩阵camera.updateProjectionMatrix();// 更新渲染器的大小renderer.setSize(window.innerWidth, window.innerHeight);// 重新渲染场景和相机renderer.render(scene, camera);
});

最后,我们为窗口的大小改变添加了一个事件监听器。当用户调整窗口大小时,我们会重新设置摄像机的视角和渲染器的大小,以保持场景的纵横比。

运行应用

通过以上的代码,我们成功地创建了一个Three.js场景,其中包含一个旋转的立方体。用户可以通过鼠标来控制场景的旋转和缩放,双击窗口可以暂停和继续立方体的旋转动画。同时,当用户调整窗口大小时,场景会自动适应窗口大小。

 

 

 

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

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

相关文章

VBA技术资料MF38:VBA_在Excel中隐藏公式

【分享成果&#xff0c;随喜正能量】佛祖也无能为力的四件事&#xff1a;第一&#xff0c;因果不可改&#xff0c;自因自果&#xff0c;别人是代替不了的&#xff1b;第二&#xff0c;智慧不可赐&#xff0c;任何人要开智慧&#xff0c;离不开自身的磨练&#xff1b;第三&#…

svn工具使用

svn 介绍 解决之道&#xff1a; SCM&#xff1a;软件配置管理 所谓的软件配置管理实际就是对软件源代码进行控制与管理 CVS&#xff1a;元老级产品 VSS&#xff1a;入门级产品 ClearCase&#xff1a;IBM 公司提供技术支持 SVN&#xff1a;主流产品 什么是SVN&#xff…

Diffusion扩散模型学习3——Stable Diffusion结构解析-以图像生成图像(图生图,img2img)为例

Diffusion扩散模型学习3——Stable Diffusion结构解析-以图像生成图像&#xff08;图生图&#xff0c;img2img&#xff09;为例 学习前言源码下载地址网络构建一、什么是Stable Diffusion&#xff08;SD&#xff09;二、Stable Diffusion的组成三、img2img生成流程1、输入图片编…

Kubernetes系列-Ingress

1 Ingress 概述 Kubernetes 对外暴露服务&#xff08;Service&#xff09;主要有两种方式&#xff1a;NodePort&#xff0c;LoadBalance&#xff0c;此外 externalIps 也可以使各类 service 对外提供服务&#xff0c;但是当集群服务很多的时候&#xff0c;NodePort方式最大的缺…

SpringBoot第28讲:SpringBoot集成MySQL - MyBatis-Plus方式

SpringBoot第28讲&#xff1a;SpringBoot集成MySQL - MyBatis-Plus方式 本文是SpringBoot第28讲&#xff0c;MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。MyB…

Spring框架——IOC配置文件方式

Spring框架的概述和入门 目录 Spring框架的概述和入门 什么是Spring框架 Spring框架的特点 Spring框架的IOC核心功能快速入门 Spring框架中的工厂&#xff08;了解&#xff09; Spring 创建Bean对象的三种方式 Spring框架的Bean管理的配置文件方式 Spring框架中标签的配…

《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(16)-Fiddler如何充当第三者再识AutoResponder标签-上

1.简介 Fiddler充当第三者&#xff0c;主要是通过AutoResponder标签在客户端和服务端之间&#xff0c;Fiddler抓包&#xff0c;然后改包&#xff0c;最后发送。AutoResponder这个功能可以算的上是Fiddler最实用的功能&#xff0c;可以让我们修改服务器端返回的数据&#xff0c…

python面向对象

面向对象概述 python是一门面向对象语言&#xff0c;面向对象的三大特性&#xff0c;封装、继承、多态&#xff0c;python支持多继承&#xff0c;这里与java语言等还是有区别的 创建类关键字 class &#xff0c;类中包含属性和方法&#xff0c;通过类创建对象 python的类和对象…

组合模式——树形结构的处理

1、简介 1.1、概述 树形结构在软件中随处可见&#xff0c;例如操作系统中的目录结构、应用软件中的菜单、办公系统中的公司组织结构等。如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题。组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形…

小目标检测(1)——大恒(DaHeng)相机操作与控制编程

文章目录 引言正文相关开发库的介绍编程准备配置引用头文件GalaxyIncludes.h配置lib文件 具体编程过程初始化和反初始化枚举设备开关设备 属性控制属性控制器种类 图像采集控制和图像处理采单帧回调采集图像处理流对象属性控制 获取设备事件获取掉线事件通知 样例程序分析补充&…

转机来了,国内全新芯片技术取得突破,关键驱动引擎开始提速

芯片技术转机来了 我们都知道&#xff0c;芯片技术是现代信息技术的基石&#xff0c;它驱动着计算机、智能手机、物联网设备等各类电子设备的运行。 科技的不断进步&#xff0c;芯片技术也在不断演进。 从传统的集成电路到现代的微处理器和系统芯片&#xff0c;其计算能力和能…

dubbo配置---重试与版本号

1、重试次数 失败自动切换&#xff0c;当出现失败&#xff0c;重试其它服务器&#xff0c;但重试会带来更长延迟。可通过 retries“2”{默认} 来设置重试次数(不含第一次)。 &#xff08;1&#xff09;在调用端&#xff0c;Reference注解添加属性 retries&#xff0c;设置重试…

Mysql5.8 Windows安装

1、下载安装包 MySQL :: Download MySQL Community Server 下载后解压到某个文件夹 2、配置环境变量 3.创建my.ini文件 [mysqld] # 设置3306端口 port3306 # 设置mysql的安装目录 basedirE:\\software\\mysql\\mysql-8.0.11-winx64 # 切记此处一定要用双斜杠\\&#xff0c;…

【CSS】圆形放大的hover效果

效果 index.html <!DOCTYPE html> <html><head><title> Document </title><link type"text/css" rel"styleSheet" href"index.css" /></head><body><div class"avatar"></…

Pytorch基础

文章目录 一、Pytorch简介二、安装2.1 安装GPU环境2.2 安装Pytorch2.3 测试 三、Tensor3.1 Tensor创建3.1.1 torch.tensor() && torch.tensor([])3.1.2 torch.randn && torch.randperm3.1.3 torch.range(begin,end,step)3.1.4 指定numpy 3.2 Tensor运算3.2.1 A…

113、单例Bean是单例模式吗?

单例Bean是单例模式吗? 通常来说,单例模式是指在一个JVM中,一个类只能构造出来一个对象,有很多方法来实现单例模式,比如懒汉模式,但是我们通常讲的单例模式有一个前提条件就是规定在一个JVM中,那如果要在两个JVM中保证单例呢?那可能就要用分布式锁这些技术,这里的重点…

iOS开发-实现热门话题标签tag显示控件

iOS开发-实现热门话题标签tag显示控件 话题标签tag显示非常常见&#xff0c;如选择你的兴趣&#xff0c;选择关注的群&#xff0c;超话&#xff0c;话题等等。 一、效果图 二、实现代码 由于显示的是在列表中&#xff0c;这里整体控件是放在UITableViewCell中的。 2.1 标签…

使用 AntV X6 + vue 实现单线流程图

使用 AntV X6 vue 实现单线流程图 X6 是 AntV 旗下的图编辑引擎&#xff0c;提供了一系列开箱即用的交互组件和简单易用的节点定制能力&#xff0c;方便我们快速搭建 DAG 图、ER 图、流程图等应用。 官方文档 安装 yarn add antv/x61.34.6Tips&#xff1a; 目前 X6 有 1.x…

二叉树迭代遍历

PS:以下代码均为C实现 1.二叉树前序遍历 力扣 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 class Solution { public:vector<int> preorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> str;TreeNode* curroot;whil…

python面试题【题目+答案】

最近遇到了一份python的面试题&#xff0c;题目比较简单&#xff0c;时间控制在一个小时之内。以下是面试的题目跟答案&#xff0c;答案不代表最优解&#xff0c;只是当时所想到的一些思路&#xff0c;接下来将分享给大家。 目录 1. 给出下面打印结果 2.字典如何删除键、如何…