【初体验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

相关文章

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学