第135篇:Three.js基础入门

three,js,基础,入门 · 浏览次数 : 82

小编点评

**三.js简介** Three.js是一款运行在浏览器中的 3D 引擎(基于WebGL的API的封装),你可以用它来创造你所需要的一系列 3D 动画场景。 **三.js安装** 1. 从 GitHub 上下载并安装三.js: ``` npm install three ``` **三.js三大要素场景** 1. **场景 (scene)**:场景是放置物体、灯光和相机的地方。 2. **相机 (camera)**:用于确定观察位置、方向、角度。 3. **渲染器 (renderer)**:将相机拍摄出的画面在浏览器中呈现出来。 **三.1.场景** ```javascript const scene = new THREE.Scene(); ``` **三.2.相机** ```javascript const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 ); ``` **三.3.渲染器** ```javascript const renderer = new THREE.WebGLRenderer(); renderer.setSize( window.innerWidth, window.innerHeight ); ``` **四.画点东西** ```javascript // 创建立方体 geometry const geometry = new THREE.BoxGeometry( 1, 1, 1 ); // 创建纹理 material const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } ); // 将纹理塞到立方体上 const cube = new THREE.Mesh( geometry, material ); // 将立方体添加到场景中 scene.add( cube ); // 设置相机位置 camera.position.z = 5; ``` **五.课后习题** 5.1. `requestAnimationFrame()` 是一个用于动画渲染的函数,它允许你将动画请求与浏览器渲染同步,这样可以保证动画流畅。 5.2. 由于三.js 使用 `requestAnimationFrame()` 来渲染动画,因此定时器 `setTimeout()` 不 suitable 用于动画渲染。

正文

好家伙,这东西太帅了,我要学会

 

先放张帅图(都是用three.js做出来的,这我学习动力直接拉满)

 

 还有另外一个

Junni is...

帧数太高,录不了

 

开始学习

官方文档

1.Three.js是什么?

Three.js是一款运行在浏览器中的 3D 引擎(基于WebGL的API的封装),你可以用它来创造你所需要的一系列3D动画场景,

 

2.安装,我们可以直接去到github上下载

 

选择要使用的版本

这里我们偷懒,直接用最方便的

<script type="module">
            import * as THREE from 'https://unpkg.com/three/build/three.module.js';
</script>

 

更多安装方法

安装 – three.js docs (threejs.org)

 

3.上手

three.js三大要素

场景(scene)、相机(camera)、渲染器(renderer)

 

3.1.场景(scene)

我们把它抽象成一个什么都没的房间

哦,他建立在xyz轴坐标之上

 

场景允许在什么地方、摆放什么东西来交给three.js来进行渲染,场景也就是放置物体、灯光和相机的地方。

 

使用

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

来创建一个新场景

 

3.2.相机(camera)

想象把你的眼球挖下来

想象有个相机来代替你的眼睛去"观察"这个场景

在场景中需要添加一个相机,相机用来确定观察位置、方向、角度,相机看到的内容,就是我们最终在屏幕上看到的内容。

可以远程控制相机移动,摄像机传给远程电脑上展示出来的画面,就是Threejs在屏幕上呈现的画面

 

使用:

const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );

来新建一个相机对象

参数:

 

 来自Three.js基础入门(一) - 掘金 (juejin.cn)

 

3.3.渲染器(renderer)

渲染器的作用就是将相机拍摄出的画面在浏览器中呈现出来。

Three.js中有很多种类的渲染器,例如webGLRenderer、canvasRenderer、SVGRenderer,通常使用的是WebGLRenderer渲染器。

使用

const renderer = new THREE.WebGLRenderer();

创建一个新的WebGLRenderer渲染器对象

 

4.画点东西

好了,我大概懂了,接下来我们来画点东西

来画官网的实例吧

<html>
    <head>
        <meta charset="utf-8">
        <title>My first three.js app</title>
        <style>
            body { margin: 0; }
        </style>
    </head>
    <body>
        <script type="module">
            import * as THREE from 'https://unpkg.com/three/build/three.module.js';
            //新建场景对象
            const scene = new THREE.Scene();
            //新建相机对象
            const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );
            //新建渲染器对象
            const renderer = new THREE.WebGLRenderer();
            renderer.setSize( window.innerWidth, window.innerHeight );// 通过调用 setSize() 方法设置渲染的长宽(设置渲染器为全屏)
            //dom操作添加渲染器
            document.body.appendChild( renderer.domElement );
            //添加立方体
            const geometry = new THREE.BoxGeometry( 1, 1, 1 );
            //添加纹理
            const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );
            //把纹理塞到立方体上
            const cube = new THREE.Mesh( geometry, material );
            //将立方体添加到场景中
            scene.add( cube );
            //移动相机,避免相机与物体重合
            camera.position.z = 5;

            function animate() {//动画请求框架
                requestAnimationFrame( animate );
                //改变正方体在场景中的位置,让正方体动起来
                cube.rotation.x += 0.01;
                cube.rotation.y += 0.01;

                renderer.render( scene, camera ); // 结合场景和相机进行渲染,即用摄像机拍下此刻的场景(最后一步)
            }

            animate();
        </script>
    </body>
</html>

来看看效果:

 

 

 

 

当然我们也可以让它加快一点转速

function animate() {
//动画请求框架
                requestAnimationFrame( animate );
                //改变正方体在场景中的位置,让正方体动起来
                cube.rotation.x += 0.999;
                cube.rotation.y += 0.999;

                renderer.render( scene, camera ); // 结合场景和相机进行渲染,即用摄像机拍下此刻的场景(最后一步)
            }

 

来看看效果

 

 

gif效果显示不出来,想象一下有个绿色的正方体在中间鬼畜就对了

 

 

5.课后习题

 function animate() {
     //请求-动画-框架 requestAnimationFrame( animate ); //改变正方体在场景中的位置,让正方体动起来 cube.rotation.x += 0.01; cube.rotation.y += 0.01; renderer.render( scene, camera ); // 结合场景和相机进行渲染,即用摄像机拍下此刻的场景(最后一步) }

5.1.requestAnimationFrame()是什么?

动画渲染部分为什么不使用定时器setTimeout而使用requestAnimationFrame()?

下章回答

 

与第135篇:Three.js基础入门相似的内容:

第135篇:Three.js基础入门

好家伙,这东西太帅了,我要学会 先放张帅图(都是用three.js做出来的,这我学习动力直接拉满) 还有另外一个 Junni is... 帧数太高,录不了 开始学习 官方文档 1.Three.js是什么? Three.js是一款运行在浏览器中的 3D 引擎(基于WebGL的API的封装),你可以用它

第一百零五篇:变量的原始值和引用值

好家伙,JS基础接着学, 本篇内容为《JS高级程序设计》第四章学习笔记 1.原始值和引用值 ECMAScript变量可以包含两种不同类型的数据:原始值和引用值。原始值(primitive value)就是最简单的数据,引用值(reference value)则是由多个值构成的对象。 在把一个值赋给变

第一百零六篇:变量的不同声明(var,let和const的不同)

JS关于变量的声明,变量提升,暂时性死区

第一百零七篇:基本数据类型(undefined,null,boolean类型)

好家伙, 本篇内容为《JS高级程序设计》第三章学习笔记 1.数据类型 ECMAScript有6种简单数据类型(称为原始类型): Undefined, Null, Boolean, Number, String和Symbol。 Symbol (符号)是ECMAScript6新增的。还有一种复杂数据类型

第一百零八篇:最常用的基本数据类型(Number类型)

最常用的基本数据类型(Number类型)

第一百一十篇:内存泄漏和垃圾回收(JS)

好家伙,本篇内容为《JS高级程序设计》第四章的学习笔记 1.内存泄露 1.1.什么是内存泄漏? 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 内存泄漏缺陷具有隐蔽性、积累性的特征,比其

第一百一十一篇:基本引用类型Date

好家伙,本篇为《JS高级程序设计》第五章的学习笔记 1.基本引用类型 引用值(或者对象)是某个特定引用类型的实例,在ECMAScript中,引用类型是把数据和功能组织到一起的结构,(像极了“类”) 经常被人错误的称作“类”。 虽然从技术上讲JavaScript是一门面向对象语言,但是ECMAScri

第一百一十二篇: JS数组Array(一)数组基本用法

好家伙, 1.数组 Array应该就是ECMAScript中最常用的类型了。ECMAScript数组跟其他编程语言的数组有很大区别。 跟其他语言中的数组一样,ECMAScript 数组也是一组有序的数据, 但跟其他语言不同的是,数组中每个槽位可以存储任意类型的数据。 这意味着可以创建一个数组,它的第

第一百一十四篇: JS数组Array(三)数组常用方法

好家伙,本篇为《JS高级程序设计》第六章“集合引用类型”学习笔记 1.数组的复制和填充 批量复制方法 copyWithin(),以及填充数组方法fill()。 这两个方法的函数签名类似,都需要指定既有数组实例上的一个范围,包含开始索引,不包含结束索引。 使用这个方法不会改变数组的大小。 1.1.fi

第一百一十五篇: JS集合引用类型Map

好家伙,本篇为《JS高级程序设计》第六章“集合引用类型”学习笔记 1.Map ECMAScript6以前,在JavaScript中实现“键/值”式存储可以使用object来方便高效地完成,也就是使用对象属性作为键,再使用属性来引用值。 但这种实现并非没有问题,为此TC39委员会专门为“键/值”存储定