首页 > 其他分享 >第135篇:Three.js基础入门

第135篇:Three.js基础入门

时间:2023-04-07 21:58:39浏览次数:62  
标签:场景 const THREE Three 相机 135 new js

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

 

先放张帅图(都是用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()?

下章回答

 

标签:场景,const,THREE,Three,相机,135,new,js
From: https://www.cnblogs.com/FatTiger4399/p/17297158.html

相关文章

  • AtCoder ABC295 D - Three Days Ago
    AtCoderABC295D-ThreeDaysAgo题目描述给出一个数字串,问有多少子段满足,可以以某种方式将这个子段重排,将子段分成两个完全相同的部分。样例输入输出202303224\((1,6)(1,8)(2,7)(7,8)\)都可以满足条件分析如果要满足某一个字段可以被分为两个相同的部分,则不......
  • 2023.04.07 - 用jQuery发起JSONP请求时jsonpCallback和success的回调区别在哪?
    在使用jQuery发起跨域请求时,可以通过指定dataType为jsonp来实现JSONP跨域请求。此时,jQuery会自动生成一个回调函数,并将其作为参数发送给服务器。服务器需要将返回数据包装在回调函数中,以便于客户端解析。以下是一个简单的jQuery实现JSONP跨域请求的示例:$.ajax({......
  • JS遍历数组的几种方法
    在JavaScript中,遍历数组有多种方法,下面介绍几种经典方法。for循环用for循环遍历数组是最基础、最原始的方法。constarr=[1,2,3,4,5];for(leti=0;i<arr.length;i++){console.log(arr[i]);}forEach()forEach()是ES5中新增的方法,用来遍历数组,可......
  • 记录-VueJs中如何使用Teleport组件
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助在DOM结构相对比较复杂,层级嵌套比较深的组件内,需要根据相对应的模块业务处理一些逻辑,该逻辑属于当前组件但是从整个页面应用的视图上看,它在DOM中应该被渲染在整个vue应用外部的其他地方,不能影响组件的结构比......
  • AST基本知识以及简单的解JS混淆代码示例
    介绍AST是abstractsyntaxtree的缩写,就是抽象语法树。AST是源代码的抽象语法结构的树形表示,树上的每一个节点都表示源代码中的一种结构,这种数据结构其实可以类比为一个大的JSON对象。一段代码在执行前会经过三个步骤词法分析:分解代码为一段段的词法单元例如:constname="hua......
  • NestJs swagger接口文档
    文档:https://docs.nestjs.cn/9/recipes?id=swagger安装首先,您必须安装所需的包:npminstall--save@nestjs/swaggerswagger-ui-express如果你正在使用fastify,你必须安装fastify-swagger而不是swagger-ui-express:npminstall--save@nestjs/swaggerfastify-swagger......
  • JSON Web Token(JWT)
    JSONWebToken(JWT)什么是JWTJSONWebToken(JWT)是一种用于身份验证和授权的开放标准(RFC7519),它定义了一种紧凑、自包含的方式,用于在网络上传输信息。JWT由三部分组成,分别是头部(Header)、载荷(Payload)和签名(Signature)。头部(Header):Header部分通常由两部分信息组成:令牌的类型(这里......
  • js Array汇总
    //----------JavaScriptArray----------//Array方法:每行为一类(自己分的)//5fillfromisArraykeysvalueOf//2jointoString//3indexOflastIndexOfincludes//2findfindIndex//5everyforEachfiltermapsome//2reducereduceRight//9concat......
  • js Number汇总
    //----------JavaScriptNumber----------/*//属性Number.MAX_VALUENumber.MIN_VALUENumber.POSITIVE_INFINITYNumber.NEGATIVE_INFINITYNaN*//*//方法isFiniteisIntegerisNaNtoFixedtoString*///------Number属性------//MAX_VAL......
  • js Math汇总
    //----------JavaScriptMath----------////abs(x)//返回x的绝对值//Math.abs(x)console.log(Math.abs(8.8));//8.8console.log(Math.abs(-8.8));//8.8console.log(Math.abs(null));//0console.log(Math.abs(undefined));//NaNconsole.log(......