【初体验threejs】【学习】【笔记】hello,正方体!

2024-06-14 10:20

本文主要是介绍【初体验threejs】【学习】【笔记】hello,正方体!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

为了满足工作需求,我已着手学习Three.js,并决定详细记录这一学习过程。在此旅程中,如果出现理解偏差或有其他更佳的学习方法,请大家不吝赐教,在评论区给予指正或分享您的宝贵建议,我将不胜感激。

搭建一个threejs项目

  1. 创建文件夹hello-cube
mkdir hello-cube
cd ./hello-cube
  1. 在根目录下创建src文件夹并在该文件夹内创建main.js(空文件)
mkdir src
  1. 初始化项目
npm init -y
  1. 使用npm install安装three库和构建工具webpack,webpack相关插件
npm install @types/three three
npm install html-webpack-plugin webpack webpack-cli webpack-dev-server -D
  1. 在根目录中创建index.html文件如下
<!DOCTYPE html>
<html><head><title>hello,正方体!</title><meta name="viewport" content="width=device-width, initial-scale=1" /><meta charset="UTF-8" /></head><style>#scene-container {width: 100vw;height: 100vh;}</style><body><div id="scene-container"></div></body>
</html>
  1. 在根目录创建webpack.config.js文件如下
const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {mode: "development",entry: "./src/main.js",output: {filename: "main.js",path: path.resolve(__dirname, "dist"),clean: true,},devServer: {static: "./dist",},plugins: [new HtmlWebpackPlugin({template: path.resolve(__dirname, "index.html"),}),],
};
  1. 在package.json中scripts添加指令
"scripts": {"start": "webpack serve --open",
}

小结
至此项目已搭建完成,大家可以安装自己的方式搭建。如果是安装本文搭建现在可以终端执行npm run start启动看看。只要webpack能构建成功就可以了。

场景、相机和渲染器

  1. 场景(scene)
    场景是我们能看到的一切的载体。
    场景空间是一个 3D 笛卡尔坐标系。场景的中心是点(0,0,0),也称为坐标系的原点。每当我们创建一个新对象并将其添加到我们的场景中时,它将被放置在原点,并且每当我们移动它时,是在这个坐标系中移动它。
import { Scene } from 'three';
const scene = new Scene;
  1. 相机(camera)
    查看场景
    对我们来说,最重要的投影类型是透视投影,它旨在匹配我们的眼睛看待世界的方式。要使用透视投影查看场景,我们使用 PerspectiveCamera。
import { PerspectiveCamera } from 'three';
const fov = 35; //视野: 相机的视野有多宽,以度为单位。
const aspect = container.clientWidth / container.clientHeight; //纵横比: 场景的宽度与高度的比率。
const near = 0.1; // 近剪裁平面:任何比这更靠近相机的东西都是不可见的。
const far = 100; // 远剪裁平面:任何比这更远离相机的东西都是不可见的。
const camera = new PerspectiveCamera(fov, aspect, near, far);

这四个参数一起用于创建一个有边界的空间区域,称之为视锥体。

我们传递给构造函数的四个参数PerspectiveCamera分别创建了截锥体的一个方面:

  1. 视野定义了平截头体扩展的角度。小视场会产生窄截锥体,而宽视场会产生宽截锥体。
  2. 纵横比将平截头体与场景容器元素相匹配。当我们将其设置为容器的宽度除以其高度时,我们确保可以将类似矩形的平截头体完美的扩展到容器中。如果我们弄错了这个值,场景看起来会伸展和模糊。
  3. 近剪切平面定义了平截头体的小端(最接近相机的点)。
  4. 远剪裁平面定义了平截头体的大端(距相机最远)。
    渲染器不会绘制场景中不在平截头体内的任何对象。如果一个物体部分在平截头体体内部,部分在平截头体外部,则外部的部分将被切掉(剪掉)。
  1. 渲染器(renderer)
    渲染
    渲染器,通过相机观察并将看到的东西非常快的绘制到一个canvas中去。 我们把这个过程叫做渲染,得到的图片就是一个渲染效果图。使用 WebGLRenderer —— 它使用 WebGL2来渲染我们的场景 (如果可用),如果不可用则回退到WebGL V1。
import { WebGLRenderer } from 'three';
const renderer = new WebGLRenderer();

小结
场景、相机和渲染器一起为我们提供了 three.js 应用程序的基本脚手架。

网格 Mesh

网格是 3D 计算机图形学中最常见的可见对象,用于显示各种 3D 对象——猫、狗、人类、树木、建筑物、花卉和山脉都可以使用网格来表示。

import { Mesh } from 'three';
const mesh = new Mesh(geometry, material);

Mesh构造函数有两个参数:几何和材质。在创建网格之前,我们需要创建这两个。

几何体

几何体定义了网格的形状。
需要一个立方缓冲几何体,将使用 BoxGeometry。

import { BoxGeometry } from 'three';
const geometry = new BoxGeometry(2, 2, 2);
材料

几何体定义了形状,材质定义了网格表面的外观
使用 MeshBasicMaterial ,这是可用的最简单的材质,更重要的是,不需在场景中添加任何灯光

import { MeshBasicMaterial } from 'three';
const material = new MeshBasicMaterial();

开始编写

  1. 初始设置
    从three引入相关的类,并获取容器。
    在main.js添加内容如下:
import {BoxGeometry, // 立方缓冲几何体Color, // 颜色Mesh, // 网格MeshBasicMaterial, // 基础网格材质Scene, // 场景PerspectiveCamera, // 透视相机WebGLRenderer, // WebGL Render 用WebGL渲染出你精心制作的场景。
} from "three";
const container = document.querySelector("#scene-container");
  1. 创建场景
    main.js: 创建场景并将背景设置为天蓝色
const scene = new Scene();
scene.background = new Color("skyblue");
  1. 创建相机
    main.js: 创建相机并设置相机位置
// 创建相机
const fov = 35; // 视野: 相机的视野有多宽,以度为单位。
const aspect = container.clientWidth / container.clientHeight; // 纵横比: 场景的宽度与高度的比率。
const near = 0.1; // 近剪裁平面:任何比这更靠近相机的东西都是不可见的。
const far = 100; // 远剪裁平面:任何比这更远离相机的东西都是不可见的。
const camera = new PerspectiveCamera(fov, aspect, near, far);
camera.position.set(0, 0, 10); // 设置相机位置
  1. 创建可见对象
    main.js:创建几何体
// 创建几何体
const geometry = new BoxGeometry(2, 2, 2);

main.js:创建材质

// 创建材质
const material = new MeshBasicMaterial();

此材质还会忽略场景中的任何灯光,并根据材质的颜色和其他设置为网格着色(阴影)。

如果使用除MeshBasicMaterial之外的几乎任何其他材质类型,将无法看到任何东西,因为场景完全处于黑暗中。就像在现实世界中一样,我们通常需要光线才能看到场景中的事物。MeshBasicMaterial是该规则的一个例外。

main.js:创建网格

// 创建网格
const cube = new Mesh(geometry, material);

main.js: 将网格添加到场景中

// 将网格添加到场景中
scene.add(cube);
  1. 创建渲染器
    main.js: 创建渲染器,设置渲染器大小,设置设备像素大小,将canvas元素添加到我们的页面
// 创建渲染器
const renderer = new WebGLRenderer();
// 设置渲染器大小
renderer.setSize(container.clientWidth, container.clientHeight);
// 设置设备像素大小 这是防止 HiDPI 显示器模糊所必需的 (也称为视网膜显示器)。
renderer.setPixelRatio(window.devicePixelRatio);
// 将canvas元素添加到我们的页面
container.appendChild(renderer.domElement);
  1. 渲染场景
    main.js: 渲染场景
// 渲染场景
renderer.render(scene, camera);

总结

至此已经全部完成。你好,正方体!如果出现理解偏差或有其他更佳的学习方法,请大家不吝赐教,在评论区给予指正或分享您的宝贵建议,我将不胜感激。

主要文献

three.js官网
《discoverthreejs》

这篇关于【初体验threejs】【学习】【笔记】hello,正方体!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1060130

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

17.用300行代码手写初体验Spring V1.0版本

1.1.课程目标 1、了解看源码最有效的方式,先猜测后验证,不要一开始就去调试代码。 2、浓缩就是精华,用 300行最简洁的代码 提炼Spring的基本设计思想。 3、掌握Spring框架的基本脉络。 1.2.内容定位 1、 具有1年以上的SpringMVC使用经验。 2、 希望深入了解Spring源码的人群,对 Spring有一个整体的宏观感受。 3、 全程手写实现SpringM

工作流Activiti初体验—流程撤回【二】

已经玩工作流了,打算还是研究一下撤回的功能。但是流程图里面并不带撤回的组件,所以需要自己动态改造一下,还是延续上一个流程继续试验撤回功能。《工作流Activiti初体验【一】》 完整流程图 我们研究一下分发任务撤回到发起任务,其他环节的撤回类似 撤回的原理大概如下: 将分发任务后面的方向清空,把发起任务拼接到原来的判断网关,然后结束分发任务,这样流程就到发起任务了 此时的流程如上图,