使用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场景,其中包含一个旋转的立方体。用户可以通过鼠标来控制场景的旋转和缩放,双击窗口可以暂停和继续立方体的旋转动画。同时,当用户调整窗口大小时,场景会自动适应窗口大小。

 

 

 

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

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

相关文章

基于Spring Boot的美食分享网站设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的美食分享网站设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java springboot…

HawkEye设备智能维保平台:助力制药行业设备管理实现数字化转型

随着科技的不断进步和市场竞争的日益激烈&#xff0c;制药行业的设备管理的数字化转型已经成为一个不可逆转的趋势。尤其是在疫情时代&#xff0c;制药企业肩负着重大的社会责任&#xff0c;致使其设备管理的数字化转型之路迫在眉睫。 设备管理的数字化不仅可以提高企业的生产效…

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

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

leetcode 135. 分发糖果

2023.8.1 这道题只从前向后遍历会出各种问题&#xff0c;所以最后决定向前向后各遍历一次。 先定义一个饼干数组biscuits&#xff0c;记录每个孩子的饼干数量&#xff0c;初始化每个孩子饼干数量为1。 然后从前向后遍历、从后向前遍历&#xff0c;使其满足“相邻两孩子评分更高…

【CSS】视频文字特效

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

R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析

在自然和社会科学领域有大量与地理或空间有关的数据&#xff0c;这一类数据一般具有严重的空间异质性&#xff0c;而通常的统计学方法并不能处理空间异质性&#xff0c;因而对此类型的数据无能为力。以地理加权回归为基础的一系列方法&#xff1a;经典地理加权回归&#xff0c;…

英雄的力量【力扣2681】

1、解题思路 将数组按从大到小的顺序排列&#xff0c;i<j&#xff0c;那么以nums[i]开始&#xff0c;nums[j]结尾&#xff0c;i----j中的任意数&#xff0c;组成的排列&#xff0c;其英雄力量都是nums[i]*nums[i]*nums[j]&#xff1b; 若ij&#xff0c;则只有一种排列组合…

微信小程序开发学习之--地图绘制行政区域图

不知道大家有没有感觉就是在做微信小程序地图功能时刚刚接触时候真的感觉好迷茫呀&#xff0c;文档看不懂&#xff0c;资料找不到&#xff0c;就很难受呀&#xff0c;比如我现在的功能就想想绘制出一个区域的轮廓图&#xff0c;主要是为了显眼&#xff0c;效果图如下&#xff1…

xinput1_4.dll丢失的解决方法,三种解决方法分享

xinput1_4.dll是一个动态链接库文件&#xff08;DLL&#xff09;&#xff0c;它是Microsoft DirectX的一部分&#xff0c;用于处理游戏控制器输入。当你的电脑提示xinput1_4.dll文件丢失时&#xff0c;意味着与这个文件相关的游戏或应用程序无法正常运行。 当你的电脑提示xinp…

<C++> 引用

1.引用的概念 引用&#xff08;Reference&#xff09;是一种别名&#xff0c;用于给变量或对象起另一个名称。引用可以理解为已经存在的变量或对象的别名&#xff0c;通过引用可以访问到原始变量或对象的内容。引用在声明时使用 & 符号来定义。 示例&#xff1a; #inclu…

ad+硬件每日学习十个知识点(16)23.7.27 (总线保持、lin报文、逻辑器件手册解读)

文章目录 1.总线保持是怎么实现的&#xff1f;有什么需要注意的&#xff08;驱动电流和电阻&#xff09;&#xff1f;2.LIN报文3.芯片datasheet的features、applications、description看完&#xff0c;应该能大致判断逻辑器件能否满足我们的要求。4.什么是逻辑器件的传输延时&a…

InnoDB存储引擎——事务原理

1.什么是事务 2.redo log 脏页是指缓冲区的数据与磁盘中的数据不一致时的状态。脏页的数据并不是实时刷新的&#xff0c;而是一段时间之后通过后台线程把脏页的数据刷线到磁盘&#xff0c;假如说脏页的数据在往磁盘中刷新的时候出错了&#xff0c;内存中的数据没有刷新到磁盘当…

软件测试技能大赛任务二单元测试试题

任务二 单元测试 执行代码测试 本部分按照要求&#xff0c;执行单元测试&#xff0c;编写java应用程序&#xff0c;按照要求的覆盖方法设计测试数据&#xff0c;使用JUnit框架编写测试类对程序代码进行测试&#xff0c;对测试执行结果进行截图&#xff0c;将相关代码和相关截…

如何运行疑难解答程序来查找和修复Windows 10中的常见问题

如果Windows 10中出现问题&#xff0c;运行疑难解答可能会有所帮助。疑难解答人员可以为你找到并解决许多常见问题。 一、在控制面板中运行疑难解答 1、打开控制面板&#xff08;图标视图&#xff09;&#xff0c;然后单击“疑难解答”图标。 2、单击“疑难解答”中左上角的…

RocketMQ 在业务消息场景的优势详解

作者&#xff1a;隆基 01 消息场景 RocketMQ 5.0 是消息事件流一体的实时数据处理平台&#xff0c;是业务消息领域的事实标准&#xff0c;很多互联网公司在业务消息场景会使用 RocketMQ。 我们反复提到的“消息、业务消息”&#xff0c;指的是分布式应用解耦&#xff0c;是 R…

nmake编译Qt第三方库出现无法打开包含文件type_traits

最近需要为个人项目ShaderLab添加内嵌的代码编辑窗口功能&#xff0c;支持语法高亮和Intellisense&#xff0c;最初使用了QCodeEditor,发现这个第三方的库对词法分析的实现效果不太行. 代码换行后直接缩进到首行&#xff0c;无法定位到前一句的首行 考虑换QScintilla&#xff…

Java 基础进阶总结(一)反射机制学习总结

文章目录 一、初识反射机制1.1 反射机制概述1.2 反射机制概念1.3 Java反射机制提供的功能1.4 反射机制的优点和缺点 二、反射机制相关的 API2.1 一、初识反射机制 1.1 反射机制概述 JAVA 语言是一门静态语言&#xff0c;对象的各种信息在程序运行时便已经确认下来了&#xff0…

微信小程序防盗链referer问题处理

公司使用百度云存储一些资源&#xff0c;然后现在要做防盗链&#xff0c;在CDN加入Referer白名单后发现PC是正常的&#xff0c;微信小程序无法正常访问资源了。然后是各种查啊&#xff0c;然后发现是微信小程序不支持Referer的修改&#xff0c;且在小程序开发工具是Referer是固…

优先级队列 (堆)

目录 一&#xff0c;堆的概念 二&#xff0c; 堆的存储结构 三&#xff0c; 堆的实现 3.1 shiftDown() 3.2 shiftUp() 3.3 shiftDown 与 shiftUp 的时间复杂度 四&#xff0c;堆排序 一&#xff0c;堆的概念 堆常用于实现优先队列&#xff08;Priority Queue&#xff0…

偶数科技与白鲸开源完成兼容性认证

近日&#xff0c;偶数科技自主研发的云原生分布式数据库 OushuDB v5.0 完成了与白鲸开源集成调度工具 WhaleStudio v2.0 的兼容性相互认证测试。 测试结果显示&#xff0c;双方产品相互良好兼容&#xff0c;稳定运行、安全&#xff0c;同时可以满足性能需求&#xff0c;为企业级…