Three入门 【基础知识,并搭建第一个场景】

简介: Three入门 【基础知识,并搭建第一个场景】

🌟前言

哈喽小伙伴们,最近工作比较忙一直没有给大家更新,这篇文章开始会开启新的专栏 Three.js,记录一下博主学习Three.js的过程;一起来看下吧。


🌟parcel

1.介绍

Parcel 是 Web 应用打包工具,适用于经验不同的开发者。它利用多核处理提供了极快的速度,并且不需要任何配置。

2.安装

首先通过 Yarn 或者 npm 安装 Parcel :

Yarn:

yarn global add parcel-bundler

npm:

npm install -g parcel-bundler

在你正在使用的项目目录下创建一个 package.json 文件:

yarn init -y

or

npm init -y

🌟Three

官网:Three.js

1.安装

1.1 下载

npm install three --save-dev

1.2 使用

import * as THREE from "three"

2.基本构成

2.1 场景

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

2.2 相机

// 2、创建相机  透视相机
// fov:角度  aspect:宽高比  near:近端  far:远端
const camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000);
// 设置相机位置
camera.position.set(0,0,10);
// 添加到场景
scene.add(camera);

2.3 物体

// 添加物体  立方缓冲几何体
// 创建几何体
const cubeGeometry = new THREE.BoxGeometry(1,1,1,);
// 创建材质
const cubeMaterial = new THREE.MeshBasicMaterial({color:0xffff00});
// 根据几何体和材质创建物体
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial);
// 修改物体位置
// cube.position.set(5,0,0)
// cube.position.x = 3
// 将几何体添加到场景里边
scene.add(cube)

2.4 渲染器

// 初始化渲染器
const renderer = new THREE.WebGLRenderer();
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth,window.innerHeight);

2.5 监听浏览器变化

//监听屏幕大小的改变,修改渲染器的宽高和相机的比例:
window.addEventListener("resize",()=>{
    renderer.setSize(window.innerWidth,window.innerHeight)
    camera.aspect = window.innerWidth/window.innerHeight
    camera.updateProjectionMatrix()
})

2.6 使用轨道控制器(实现3D效果)

import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
// 创建轨道控制器
const controls = new OrbitControls(camera,renderer.domElement)

2.7 坐标轴辅助器

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

2.8 渲染场景

function render() {
    renderer.render(scene, camera);
    // 渲染下一帧的时候就会调用render函数
    requestAnimationFrame(render);
}
render();

2.9 整体代码

import * as THREE from "three"
// 导入轨道控制器
import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
// 目标:使用控制器查看3D物体
// 1、创建场景
const scene = new THREE.Scene();
// 2、创建相机  透视相机
// fov:角度  aspect:宽高比  near:近端  far:远端
const camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000);
// 设置相机位置
camera.position.set(0,0,10);
scene.add(camera);
// 添加物体  立方缓冲几何体
// 创建几何体
const cubeGeometry = new THREE.BoxGeometry(1,1,1,);
// 创建材质
const cubeMaterial = new THREE.MeshBasicMaterial({color:0xffff00});
// 根据几何体和材质创建物体
const cube = new THREE.Mesh(cubeGeometry,cubeMaterial);
// 将几何体添加到场景里边
scene.add(cube)
// 初始化渲染器
const renderer = new THREE.WebGLRenderer();
// 设置渲染的尺寸大小
renderer.setSize(window.innerWidth,window.innerHeight);
//监听屏幕大小的改变,修改渲染器的宽高和相机的比例:
window.addEventListener("resize",()=>{
    renderer.setSize(window.innerWidth,window.innerHeight)
    camera.aspect = window.innerWidth/window.innerHeight
    camera.updateProjectionMatrix()
})
// 将webgl渲染的canvas内容添加到body上
document.body.appendChild(renderer.domElement);
// // 使用渲染器,通过相机,将场景渲染进来
// renderer.render(scene,camera)
// 创建轨道控制器
const controls = new OrbitControls(camera,renderer.domElement)
// 添加坐标轴辅助器
const axesHelper = new THREE.AxesHelper(5);
scene.add(axesHelper);
function render() {
    renderer.render(scene, camera);
    // 渲染下一帧的时候就会调用render函数
    requestAnimationFrame(render);
}
render();

通过以上代码,就创建了一个Three的3D项目,创建了我们的第一个Three的3D场景,并添加了一个黄色的正方体

3.动画

3.1 设置物体移动

function render() {
    // 每一帧都去修改物体的 position
    cube.position.x += 0.01
    if (cube.position.x>5) {
        cube.position.x = 0
    }
    renderer.render(scene, camera);
    // 渲染下一帧的时候就会调用render函数
    requestAnimationFrame(render);
}
render();

3.2 设置物体缩放

// 缩放
cube.scale.set(3,2,1)
cube.scale.x = 5

3.3 设置物体旋转

// 旋转
cube.rotation.set(Math.PI/4,0,0)

3.4 requestAnimationFrame(请求动画帧)

function render(time) {
    // console.log(time)
    // 每一帧都去修改物体的 position
    let t = time/1000 % 5; // %5 用来设置反复动画  利用求余
    move(t)
    renderer.render(scene, camera);
    // 渲染下一帧的时候就会调用render函数
    requestAnimationFrame(render);
}
render();

render函数默认传入一个 time 参数,利用该参数,可以计算物体运动的实际时间,进而设置更精确的动画效果

3.5 Clock跟踪时间处理动画

function render(time) {
    // console.log(time)
    // 每一帧都去修改物体的 position
    let t = time/1000 % 5; // %5 用来设置反复动画  利用求余
    move(t)
    renderer.render(scene, camera);
    // 渲染下一帧的时候就会调用render函数
    requestAnimationFrame(render);
}
render();

ender函数默认传入一个 time 参数,利用该参数,可以计算物体运动的实际时间,进而设置更精确的动画效果


🌟写在最后

更多Three知识以及API请大家持续关注,尽请期待。各位小伙伴让我们 let’s be prepared at all times!


✨原创不易,还希望各位大佬支持一下!

👍 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富!


目录
相关文章
|
7月前
|
JavaScript 编译器 API
【C++ 函数和过程 进阶篇】全面掌握C++函数返回值:从入门到精通的实战指南
【C++ 函数和过程 进阶篇】全面掌握C++函数返回值:从入门到精通的实战指南
233 1
|
Kubernetes 关系型数据库 MySQL
k8s教程(基础篇)-入门及案例
k8s教程(基础篇)-入门及案例
2180 0
|
1月前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!
|
17天前
|
IDE 程序员 开发工具
Python编程入门:打造你的第一个程序
迈出编程的第一步,就像在未知的海洋中航行。本文是你启航的指南针,带你了解Python这门语言的魅力所在,并手把手教你构建第一个属于自己的程序。从安装环境到编写代码,我们将一步步走过这段旅程。准备好了吗?让我们开始吧!
|
23天前
图解一些网络基础知识点
Ethernet以太网IEEE802.3 以太网第一个广泛部署的高速局域网; 以太网数据速率快; 以太网硬件价格便宜,网络造价成本低。
26 4
|
1月前
|
存储 人工智能 数据挖掘
Python编程入门:构建你的第一个程序
【10月更文挑战第22天】编程,这个听起来高深莫测的词汇,实际上就像搭积木一样简单有趣。本文将带你走进Python的世界,用最浅显的语言和实例,让你轻松掌握编写第一个Python程序的方法。无论你是编程新手还是希望了解Python的爱好者,这篇文章都将是你的理想起点。让我们一起开始这段奇妙的编程之旅吧!
30 3
|
1月前
|
存储 机器学习/深度学习 搜索推荐
Python编程入门:从零开始构建你的第一个程序
【10月更文挑战第32天】本文旨在通过浅显易懂的方式引导编程新手进入Python的世界。我们将一起探索Python的基础语法,并通过实例学习如何构建一个简单的程序。文章将不直接展示代码,而是鼓励读者在阅读过程中自行尝试编写,以加深理解和记忆。无论你是编程初学者还是希望巩固基础知识的开发者,这篇文章都将是你的良师益友。让我们开始吧!
|
4月前
|
数据采集 存储 数据库
构建你的第一个Python爬虫:从入门到实践
【8月更文挑战第31天】在数字时代的浪潮中,数据如同新时代的石油,而网络爬虫则是开采这些数据的钻头。本文将引导初学者了解并实现一个基础的网络爬虫,使用Python语言,通过实际代码示例,展示如何收集和解析网页信息。我们将一起探索HTTP请求、HTML解析以及数据存储等核心概念,让你能够快速上手并运行你的首个爬虫项目。
|
4月前
|
存储 程序员 Python
Python编程基础:从零开始的代码之旅
【8月更文挑战第24天】这篇文章旨在为初学者提供一个友好的Python入门指南。通过简明的语言和实际的编码示例,我们将探索Python的基本概念、数据结构、控制流程以及函数的使用。无论你是编程新手还是想扩展你的技能库,这篇文章都将是你学习旅程中的一块垫脚石。让我们开始吧,一起揭开编程的神秘面纱,享受代码带来的乐趣!
31 1
|
7月前
|
NoSQL 应用服务中间件 Shell
从零开始掌握Docek的基础知识与应用技巧
从零开始掌握Docek的基础知识与应用技巧
下一篇
DataWorks