2、Three.js开发入门与调试设置

news2024/9/25 23:24:31

一、添加坐标轴辅助器

AxesHelper

用于简单模拟3个坐标轴的对象.
红色代表 X 轴. 绿色代表 Y 轴. 蓝色代表 Z 轴.

构造函数

AxesHelper( size : Number )

size -- (可选的) 表示代表轴的线段长度. 默认为 1.

//添加坐标轴
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);

二、设置物体移动

通过物体position的x轴、y轴、z轴数据

案例:设置X轴每次加0.01加到5,变为0.

//5、添加物体
//创建几何体
const cubeGeometry = new THREE.BoxGeometry();
const cubeMaterial = new THREE.MeshBasicMaterial({color: 0xfff00});

//6、根据几何体和材质 创建物体
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial);

//设置物体的位置
cube.position.set(5,0,0);
cube.position.x = 3;


//X轴移动
function render() {
    
    //设置物体位置x轴不断往返
    cube.position.x += 0.01;
    if(cube.position.x > 5){
         cube.position.x = 0;
    }

    //场景和相机重新渲染
    renderer.render(scene,camera);
    //渲染下一帧的时候就会调用render函数
    requestAnimationFrame(render);
}

render();

三、物体的缩放与旋转

缩放:scale 旋转函数,Math.PI = 180度

旋转:通过物体rotation的x轴、y轴、z轴数据

案例:设置X轴每次旋转0.01

//5、添加物体
//创建几何体
const cubeGeometry = new THREE.BoxGeometry();
const cubeMaterial = new THREE.MeshBasicMaterial({color: 0xfff00});

//6、根据几何体和材质 创建物体
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial);

//缩放
cube.scale.set(3,2,1);
cube.scale.x = 5;
//旋转
cube.rotation.set(Math.PI / 4,0,0,zxy);

//将几何体添加到场景当中
scene.add(cube);


function render(time) {

    //设置物体旋转
    cube.rotation.x += 0.01;
    
    //场景和相机重新渲染
    renderer.render(scene,camera);
    //渲染下一帧的时候就会调用render函数
    requestAnimationFrame(render);
}

render();

四、应用requestAnimationFrame

function render(){
    

    //场景和相机重新渲染
    renderer.render(scene,camera);
    //渲染下一帧的时候就会调用render函数
    requestAnimationFrame(render);
}

五、通过Clock跟踪时间处理动画

function render(){
    //获取时钟运行总时长
    //let time = clock.getElapsedTime();
    //获取间隔时间
    let deltaTime = clock.getDelta();
    console.log("两次获取时间的间隔时间:"+deltaTime);

    //场景和相机重新渲染
    renderer.render(scene,camera);
    //渲染下一帧的时候就会调用render函数
    requestAnimationFrame(render);
}

六、Gsap动画库基本使用与原理

    1.什么是GSAP?
    GSAP(GreenSock Animation Platform)是一个从flash时代一直发展到今天的专业动画库

    2.GSAP优点
    1、速度快。GSAP专门优化了动画性能,使之实现和CSS一样的高性能动画效果。
    2、轻量与模块化。模块化与插件式的结构保持了核心引擎的轻量,TweenLite包非常小(基本上低于7kb)。GSAP提供了TweenLite, TimelineLite, TimelineMax 和 TweenMax不同功能的动画模块,你可以按需使用。
    3、没有依赖。
    4、灵活控制。不用受限于线性序列,可以重叠动画序列,你可以通过精确时间控制,灵活地使用最少的代码实现动画。

    3.GSAP版本
    GSAP提供4个库文件供用户使用
    1.TweenLite:这是GSAP动画平台的核心部分,使用它可以用来实现大部分的动画效果,适合来实现一些元素的简单动画效果。
    2.TimelineLite:一个强大的,轻量级的序列工具,它就如一个存放补间动画的容器,可以很容易的整体控制补间动画,且精确管理补间动画彼此之间的时间关系。比如动画的各种状态,Pause,reverse,restart,speed up,slow down,seek time,add labels等。它适合来实现一些复杂的动画效果。
    3.TimelineMax:扩展TimelineLite,提供完全相同的功能再加上有用的(但非必需)功能,如repeat,repeatDelay,yoyo,currentLabel()等。TimelineMax的目标是成为最终的全功能工具,而不是轻量级的。
    4.TweenMax:可以完成TimelineLite做的每一件事,并附加非必要的功能,如repeat,yoyo,repeatDelay(重复延迟)等。它也包括许多常见的插件,如CSSPlugin,这样您就不需自行载入多个文件。侧重于全功能的,而不是轻量级的。
    >>建议在开发中使用TweenMax这个全功能的js文件,它包括了GreenSock动画平台的所有核心的功能。

    官网地址:GSAP官网
    github地址:GSAP github
    中文网: GSAP中文网

七、Gsap控制动画属性与方法

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

//设置动画
//设置5s时间x轴走5  ease:"powerl.inout" 指动画速度  
var animation = gsap.to(cube.position,{x:5,duration:5,ease:"powerl.inout",
    //repeat 设置重复次数,无限次循环设置为-1
    repeat:2,
    //往返的运动
    yoyo: true,
    //延迟2s 运动
    delay:2,
    onComplete:() =>{
        console.log("动画完成")
    },onStart: () => {
        console.log("动画开始")
    }
});

gsap.to(cube.rotation,{x:2*Math.PI,duration:5,ease:"powerl.inout"});//设置5s时间旋转360度

//添加双击暂停
window.addEventListener("dblclick",() => {
    //console.log(animation);
    if(animation.isActive()){
        animation.pause();//暂停
    }else {
        animation.resume();//暂停
    }
    
});

八、根据尺寸变化实现自适应画面

添加监听

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

九、调用js接口控制画布全屏和退出全屏

添加双击事件,双击时全屏,再双击则退出全屏。

window.addEventListener("dblclick",() => {
    const fullScreenElement = document.fullscreenElement;
    if(fullScreenElement){
        //双击屏幕进入全屏
        document.exitFullscreen();

    }else{
        //双击屏幕进入全屏,退出全屏
        renderer.domElement.requestFullscreen();
    }
    
    
});

十、应用图形用户界面更改变量

安装依赖dat gui 轻量级UI界面控制库

npm install --save dat.gui

导入

//导入dat gui 
import * as dat from 'dat.gui';

上代码

//创建gui
const gui = new dat.GUI();
gui.add(cube.position,"x").min(0).max(5).step(0.01).name("x轴变换").onChange((value) => {
    console.log("值被改变了:",value);
}).onFinishChange((value) => {
    console.log("完全停下来:",value);
});

//修改物体的颜色
const params = {
    color : "#ffff00",
    fn:() => {
        //让立方体运动起来
        gsap.to(cube.position,{x:5,duration:2,yoyo:true,repeat: -1})
    }
}
gui.addColor(params,"color").onChange((value) => {
    console.log("值被改变了:",value);
    cube.material.color.set(value);
})

//设置是否显示 选项框
gui.add(cube,"visible").name("是否显示");

//设置按钮点击触发某个事件
gui.add(params,"fn").name("立方体运动");

var folder = gui.addFolder("设置立方体");
folder.add(cube.material,"wireframe");

界面展示:

 

全部代码:

main.js

import * as THREE from "three";
//目标:使用控制器去查看3d的物体
//console.log(THREE);


//导入轨道控制器
import {OrbitControls} from 'three/examples/jsm/controls/OrbitControls';
//导入动画库
import gsap from 'gsap';
//导入dat gui 
import * as dat from 'dat.gui';





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

//2、创建相机
const camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000);//透视相机(角度,屏幕宽高比、近端、远端)
//3、设置相机位置(x,y,z)
camera.position.set(0,0,10);
//4、将相机添加到场景当中
scene.add(camera);

//5、添加物体
//创建几何体
const cubeGeometry = new THREE.BoxGeometry();
const cubeMaterial = new THREE.MeshBasicMaterial({color: 0xfff00});

//6、根据几何体和材质 创建物体
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial);

//设置物体的位置
//cube.position.set(5,0,0);
//cube.position.x = 3;
//缩放
//cube.scale.set(3,2,1);
//cube.scale.x = 5;
//旋转
//cube.rotation.set(Math.PI / 4,0,0,zxy);

//将几何体添加到场景当中
scene.add(cube);

console.log(dat);
//创建gui
const gui = new dat.GUI();
gui.add(cube.position,"x").min(0).max(5).step(0.01).name("x轴变换").onChange((value) => {
    console.log("值被改变了:",value);
}).onFinishChange((value) => {
    console.log("完全停下来:",value);
});

//修改物体的颜色
const params = {
    color : "#ffff00",
    fn:() => {
        //让立方体运动起来
        gsap.to(cube.position,{x:5,duration:2,yoyo:true,repeat: -1})
    }
}
gui.addColor(params,"color").onChange((value) => {
    console.log("值被改变了:",value);
    cube.material.color.set(value);
})

//设置是否显示 选项框
gui.add(cube,"visible").name("是否显示");

//设置按钮点击触发某个事件
gui.add(params,"fn").name("立方体运动");

var folder = gui.addFolder("设置立方体");
folder.add(cube.material,"wireframe");


//7、初始化渲染器
const renderer = new THREE.WebGLRenderer();
//8、设置渲染的尺寸大小
renderer.setSize(window.innerWidth,window.innerHeight);
//console.log(renderer);
//9、将webgl渲染的Canvas内容添加到body
document.body.appendChild(renderer.domElement);

//10、使用渲染器,通过相机将场景渲染进来
//renderer.render(scene,camera);



//1、创建轨道控制器
const controls = new OrbitControls(camera,renderer.domElement);
//设置控制器阻尼,让控制器更有真实效果 必须在动画循环里面调用update
controls.enableDamping = true;

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



window.addEventListener("dblclick",() => {
    const fullScreenElement = document.fullscreenElement;
    if(fullScreenElement){
        //双击屏幕进入全屏
        document.exitFullscreen();

    }else{
        //双击屏幕进入全屏,退出全屏
        renderer.domElement.requestFullscreen();
    }
    
    
});

function render(){
    
    controls.update();
    //场景和相机重新渲染
    renderer.render(scene,camera);
    //渲染下一帧的时候就会调用render函数
    requestAnimationFrame(render);
}

render();

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

//添加坐标轴
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="./assets/css/style.css"> 
</head>
<body>
    <script src="./main/main.js" type="module"></script>
</body>
</html>

style.css

#取消全局边距
* {
    margin: 0;
    padding: 0;
}
#设置body的颜色天空蓝
body {
    background-color: skyblue;
}

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

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

相关文章

CSS 特效之心形-彩虹-加载动画

CSS 特效之心形-彩虹-加载动画参考描述效果HTMLCSS重置元素的部分默认样式bodyli动画定义指定animationul抖动代码总汇参考 项目描述搜索引擎BingMDNMDN Web Docs 描述 项目描述Edge109.0.1518.61 (正式版本) (64 位) 效果 HTML <!DOCTYPE html> <html lang"e…

Keil C51工程转VSCode Keil Assistant开发全过程

Keil C51工程转VSCode Keil Assistant开发全过程✨这里以stc15W408AS为例。&#x1f4cc;相关篇《【开源分享】自制STC15W408AS开发板》 &#x1f4fa;编译-烧录演示&#xff1a; &#x1f4cb;转VSCODE开发环境主要原因可能代码提示以及代码跳转功能&#xff0c;或者其他。 &…

在java中操作redis

在普通项目中操作redis 1.导入maven坐标 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.0</version> </dependency>2.打开redis 如果redis-server闪退&#xff0c;那就先打开re…

【Spring Security】如何使用Lambda DSL配置Spring Security

本期目录1. 概述2. 新老配置风格对比Lambda风格等效的旧配置风格3. WebFlux Security4. Lambda DSL的目标1. 概述 在 Spring Security 5.2 中增强了 DSL 的功能&#xff1a;允许使用 Lambda 表达式来配置 HTTP security 。 需要注意的是&#xff1a;先前版本的配置风格仍然是…

二分查找——“C”

各位CSDN的uu们你们好呀&#xff0c;欢迎来到小雅兰的课堂&#xff0c;今天我们的内容是复习之前的内容&#xff0c;并把之前的内容的一些习题一起来做一做&#xff0c;现在&#xff0c;就让我们进入二分查找的世界吧 首先&#xff0c;我们介绍的题目就是二分查找&#xff0c;也…

module ‘tensorflow‘ has no attribute ‘Session‘

1. module ‘tensorflow‘ has no attribute ‘Session‘ 指定一个会话来运行tensorflow程序&#xff0c;在使用tensorflow1.x版本中用tensorflow.Session即可 但当我的库版本升级到2.x之后&#xff0c;就会出现标题式报错&#xff0c;于是我去查看了tensorflow库的源码&…

使用Keras搭建深度学习模型

前言 目前深度学习领域的主流框架 tensorflowkeraspytorchcaffetheanopaddlepaddle keras 代码架构 keras代码风格相比于其他框架更符合人的思维。 模型 模型的组成分为三部分&#xff1a;输入层、网络层、输出层。 输入层 输入层的作用时规定了模型输入的shape fro…

2022年智源社区年度热点推荐丨新春集锦

本文为2022年最受智源社区小伙伴喜爱的文章&#xff0c;根据文章质量和热门程度等维度计算得出。还有AI大佬的全年总结盘点总结&#xff0c;也一并推荐给你。虎年除旧&#xff0c;兔年迎新&#xff0c;藉此机会、智源编辑组全员谨祝大家新春快乐&#xff01;2022智源社区20篇最…

LINUX学习之网络配置(十一)

1.修改IP地址 使用ifconfig命令 例如要将eth0接口的IP地址更改为192.168.1.100&#xff0c;你可以使用以下命令 ifconfig eth0 192.168.1.100如果你想为IP地址设置子网掩码&#xff0c;可以使用“netmask”参数。例如&#xff0c;要将eth0接口的子网掩码设置为255.255.255.0…

[Linux]进程优先级 Linux中的环境变量

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【LINUX】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文…

liunx centos9中安装Redis数据库,并在win10中连接redis图文详解

首先我们去Redis的官网点击download下载tar的压缩包 https://redis.io/download/#redis-downloads 用xftp将安装包上传到你的liunx服务器本地地址 解压 tar -xvf /root/redis-7.0.8.tar.gz cd进入你刚才解压的文件夹中 cd /root/redis-7.0.8 执行make进行编译 编译完成后cd进入…

普中科技MicroPython基于esp32的基础教程-03-字符串

目录 字符串 字符串的表示方式 普通字符串 原始字符串 长字符串 字符串与数字相互转换 将字符串转换为数字 将数字转换为字符串 格式化字符串 占位符% format方法 f-strings 操作字符串 字符串拼接 字符串查找 字符串替换 字符串分割 去处字符串两…

目标检测:Focal Loss

目标检测&#xff1a;Focal Loss前言Focal LossCross Entropybalanced Cross EntropyFocal Loss Definition前言 Focal loss这个idea来源于论文《Focal Loss for Dense Object Detection》,主要是为了解决正负样本、难易样本不平衡的问题。 Focal Loss Cross Entropy 在目标…

不懂Pod?不足以谈K8s

文章目录✨ 前言1. myblog改造及优化2. Pod生命周期&#x1f351; 如何编写资源 yaml&#x1f351; pod状态与生命周期3. Pod操作总结✨ 前言 在上一篇文章中&#xff0c;我们学习了 Pod 的常用设置&#xff0c;那么这篇文章咱们继续开动&#xff01; K8s落地实践之旅 —— P…

LabVIEW异步调用VI的多个实例实现并行执行

LabVIEW异步调用VI的多个实例实现并行执行默认情况下&#xff0c;如对一个VI进行多个异步调用&#xff0c;LabVIEW将这些调用按顺序排列&#xff0c;依次执行。各个调用的执行时间累加&#xff0c;效率不高。按照下列步骤&#xff0c;并行执行各个调用&#xff0c;避免一个调用…

Python小技巧:__str__()的妙用

前言 这里是Python小技巧的系列文章。这是第三篇&#xff0c;object.__str__(self)方法的妙用。 书接上回&#xff0c;这次还是介绍Python类的内置方法&#xff0c;__str__() 据官方文档的介绍&#xff0c;在使用 str(object) 、format() 和 print() 的时候会调用__str__() 方…

一文搞懂go并发编程设计原理

前言 主要学习其设计原则&#xff0c;大体流程&#xff0c;权衡利弊 不要纠结于部分难懂的实现细节&#xff0c;因为不同的人对相同接口的实现细节不一样&#xff0c;就算是相同的人实现两次也可能不一样 context context的作用主要有两个&#xff1a; 在整个请求的执行过程…

stm32 笔记 PWM输入模式测量脉宽和占空比原理

一、PWM 输入模式测量脉宽 1.1 测量脉宽简介 在测量占空比之前&#xff0c;我们先一步一步来&#xff0c;先让 STM32 可以测量脉宽。 TIM3_CH1&#xff08;tim3 定时器通道 1&#xff09;捕获模式测量脉宽步骤如下&#xff1a; 1.输入捕获到 PWM 上升沿触发 2.发送中断&am…

机器视觉_HALCON_快速向导_2.用HALCON开发程序

文章目录使用HALCON开发应用程序1. 认识HALCON&#xff1a;架构&数据结构1.1. HALCON算子1.2. 参数与数据结构1.2.1. Images 图像1.2.2. Regions 区域1.2.3. XLDS 扩展线1.2.4. Handles 句柄1.2.5. Tuple Mode 元组模式1.3. HALCON与并行编程1.4. HALCON支持计算设备1.5. H…

grant之后要跟着flush privileges吗?

在 MySQL 里面,grant 语句是用来给用户赋权的。不知道你有没有见过一些操作文档里面提到,grant 之后要马上跟着执行一个 flush privileges 命令,才能使赋权语句生效。我最开始使用 MySQL 的时候,就是照着一个操作文档的说明按照这个顺序操作的。 那么,grant 之后真的需要…