简介 

Three.js是用JavaScript编写的第三方库,用于实现3D功能,基于WebGL进行封装。

一个3D模型的建立主要由以下几个部分组成(基本版):
 *    创建场景scene--相机camera--渲染器renderer--(灯光light);
 *    创建模型(geometry+material+mesh)或导入模型gltf/glb;
 *    添加相机控件controls--动画渲染循环animate;

 *    其他动画操作,可学习gasp动画库。

一、引入threeJS

// 引入three.js---npm install three@0.157.0 -S

import * as THREE from "three";

 二、场景、相机、渲染器

1、创建3D场景对象Scene
const scene = new THREE.Scene();
2、创建透视投影相机对象
// const camera = new THREE.PerspectiveCamera();   //正投影相机是OrthographicCamera
// 定义threejs输出Canvas画布的尺寸(单位:像素px)
const width = window.innerWidth; //宽度
const height = window.innerHeight; //高度
// (fov,aspect,near,far),30:视场角度, width / height:Canvas画布, 1:近裁截面, 3000:远裁截面
const camera = new THREE.PerspectiveCamera(30, width / height, 1, 3000);
//相机在Three.js三维坐标系中的位置---根据需要设置相机位置具体值
camera.position.set(292, 223, 185);
//相机观察目标指向Threejs 3D空间中某个位置
camera.lookAt(0, 0, 0); //坐标原点---camera.lookAt(mesh.position);指向mesh对应的位置
3、创建webGL渲染器对象
//属性:antialias是否抗锯齿
const renderer = new THREE.WebGLRenderer();
//设置three.js渲染区域的尺寸(像素px)
renderer.setSize(width, height);
//WebGLRenderer执行渲染方法生成canvas画布,并把相机拍照的场景在画布上呈现
renderer.render(scene, camera);
// console.log("threeJS", THREE.Scene); //测试场景
// 获得生成的canvas画布(domElement就是生成的那张照片==canvas画布==html元素)
document.body.appendChild(renderer.domElement);
// 将Canvas画布插入到任意HTML元素中
// document.getElementById('app').appendChild(renderer.domElement);

 三、灯光及阴影

灯光:

1、PointLight:点光源,类似于灯泡,向四周发射光线的发光点。

2、SpotLight:聚光源,沿着特定方向逐渐发散,照射范围在三维空间中构成一个圆锥体。

3、DirectionalLight:平行光,沿着特定方向发射。

4、AmbientLight:环境光,没有特定方向,只是整体改变场景的光照明暗,无法投射阴影,均匀照射对物体明暗对比无法呈现。

5、HemisphereLight:半球光,可以很好地表现天空和地面颜色照射到物体上时的效果,不能投射阴影,对物体明暗对比比较明显。

以点光源举例:

const pointLight = new THREE.PointLight(0xffffff, 1.0);
pointLight.intensity = 1.0; //光照强度
// 设置光源衰减,默认2.0
pointLight.decay = 0.0; //设置光源不随距离衰减
//点光源位置
pointLight.position.set(400, 0, 0); //点光源放在x轴上
scene.add(pointLight); //点光源添加到场景中// 点光源辅助观察--创建一个虚拟的球形网 Mesh的辅助对象来可视化模拟光线
const pointLightHelper = new THREE.PointLightHelper(pointLight, 50);
scene.add(pointLightHelper);
阴影:

阴影的开启需要全方位的开启,渲染器及光源开启阴影,模型要接受阴影,模型需开启阴影,地面接收阴影。

// 首先渲染器开启阴影
renderer.shadowMap.enabled = true;
renderer.shadowMapEnabled = true;// 光源开启阴影
directionalLight.castShadow = true;
directionalLight.shadow.mapSize = new Vector2(1024, 1024);// 地板接受阴影开启
floor.receiveShadow = true;// 模型Mesh开启阴影
// 物体需要开启“引起阴影”和“接收阴影”:
gltf.scene.traverse(obj => {if(obj.isMesh) {obj.castShadow = true;obj.receiveShadow = true;}
})

四、模型

一个3d模型是由物体形状及材质组成的网格模型。

通常模型可进行自己搭建及导入模型两个途径:

1、模型搭建

① Geometry 形状

        Geometry 通过存储模型用到的点集和点间关系(哪些点构成一个三角形)来描述物体形状。

② Material 材质
        Material 其实是物体表面除了形状以外所有可视属性的集合,例如色彩、纹理、光滑度、透明度、反射率、折射率、发光度。

③ Mesh 模型

        Mesh 用三角形组成的网格来描述三维模型,随着三角形数量的增加,它的表面越来越平滑/准确。

Geometry在threejs中有提供诸如 长方体、圆柱、圆锥等基础形状,更为复杂的形状需自行构建,通常可用以下形状组成:

④ Point 点

        Point 在三维空间中的某一个点可以用一个坐标点来表示,点的集合,可以由一组顶点坐标组成。

⑤ Line 线

        Line 既可以直接定义线条材质,也可以通过定义两个坐标点,来构造一条线。

⑥ Curve 曲线

        Curve 平滑的路径或形状,可用来创建诸如圆弧、椭圆等形状。

//创建一个长方体几何对象Geometry
const geometry = new THREE.BoxGeometry(100, 100, 100);
//创建一个材质对象Material---MeshBasicMaterial不受光照影响,MeshLambertMaterial受光照影响
const material = new THREE.MeshBasicMaterial({collor: 0xff0000, //0xff0000设置材质颜色为红色transparent: true, //开启透明opacity: 0.5, //设置透明度
});
// 两个参数分别为几何体geometry、材质material
const mesh = new THREE.Mesh(geometry, material); //网格模型对象Mesh
//设置网格模型在三维空间中的位置坐标,默认是坐标原点
mesh.position.set(0, 10, 0);
// 将网格模型添加到三维场景
scene.add(mesh);/点、线、曲线创建举例
const point1 = new THREE.Vector3(4,8,9);
const line = new THREE.Line( geometry, material, THREE.LinePieces );
const curve= new THREE.EllipseCurve(0, 0, 100, 50);	//椭圆中心坐标以及x和y方向半径
2、模型导入

通常是使用gltf或glb格式的模型文件,可参考3D模型库:https://sketchfab.com。

//创建GLTFLoader实例
const loader = new GLTFLoader();
//加载gltf、glb模型
loader.load("bydSA3/scene.gltf", (gltf) => {//模型加载成功后的回调函数scene.add(gltf.scene); //将模型添加到场景中},(xhr) => {//加载过程中的回调函数console.log((xhr.loaded / xhr.total)*100+"% loaded");},(error) => {//加载出错的回调函数console.error("An error happened", error);}
);

五、相机控件

相机控件可实现鼠标的左键旋转,滑动键缩放,右键平移

也可利用相机控件实现模型自转:

//定义旋转缩放平移相机控件
const controls = new OrbitControls(camera, renderer.domElement);
controls.autoRotate = false;
//在animate方法中更新OrbitControls
controls.update();controls.autoRotate = true; //模型自转

六、动画渲染

动画渲染需要对场景进行绘制的循环,而其他很多操作都是使用动画库tween.js,gasp库等

// 动画循环
const animate = () => {//对场景进行绘制的循环requestAnimationFrame(animate);……renderer.render(scene, camera);
};
animate();

动画库使用举例:

import TweenLite from "gsap";
// 参数:动画目标、动作时间、起始状态(已省略)、终点状态
TweenLite.to(component1.position, 1.5, {y: 1.5,ease: Power4.easeOut,
});

X、资源教程

1、Three.js中文网教程:http://www.webgl3d.cn/

2、Three.js教j程(api文档):https://threejs.org/docs/

3、web GL中文网:http://www.hewebgl.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85209.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85209.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/85209.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统--权限

大家好,上一次我们学习了关于Linux中的基础指令,那么我们今天来继续学习Linux的新的内容:权限。那么话不多说,我们开始今天的学习: 目录 Linux权限 1. Linux权限的概念 2. Linux权限管理 3. ⽂件权限值的表⽰⽅法…

论文笔记 <交通灯> <多智能体>DERLight双重经验回放灯机制

今天看的论文是这篇 主要提出了传统优先级经验回放(PER)在复杂交通场景中效率低下,使用二叉树存储样本,导致大规模样本时计算复杂度高。而且不丢弃样本,造成存储空间浪费。 双重经验池: 为了解决以上问题…

Chromium 136 编译指南 macOS篇:环境准备与系统配置(一)

1. 引言 在浏览器技术的星空中,Chromium 犹如一颗最亮的明星,照亮了整个互联网的发展轨迹。作为推动现代 Web 技术革命的核心引擎,Chromium 不仅是 Google Chrome 的技术基石,更是 Microsoft Edge、Opera、以及众多定制浏览器的共…

linux机器间无密码如何传输文件

1. scp传输时的问题 $ scp deepseek_r1_distill_qwen1.5b_content_audit_fp16_20250613_2_Q4_K_M.gguf xxx192.168.xxx:/home/xxx/pretrained_model/output The authenticity of host 192.168.xxx (192.168.xxx) cant be established. ED25519 key fingerprint is SHA256:deOs…

PySpark 使用pyarrow指定版本

背景说明 在 PySpark 3.1.3 环境中,当需要使用与集群环境不同版本的 PyArrow (如 1.0.0 版本)时,可以通过以下方法实现,而无需更改集群环境配置 完整操作说明 去pyarrowPyPI下载对应版本的whl文件后缀whl直接改成zip解压后有两个文件夹&am…

安卓APP投屏调试工具使用教程

安卓APP投屏调试工具使用教程 一、准备工作(一)下载ADB工具(二)配置ADB的环境变量(三)检查是否成功安装(四)adb核心命令说明 二、无线调试流程(一)环境要求&a…

huggingface网站里的模型和数据集

直接下载肯定是不太行,平时访问都不容易,更别提下载东西了,但是我们可以通过国内镜像进行快速下载。 镜像网址: hf-mirror地址:HF-Mirror 进入网站之后,在搜索框里搜索你想下载的内容,接下来…

Node.js 路由请求方式大全解:深度剖析与工程实践

文章目录 🌐 Node.js 路由请求方式大全解:深度剖析与工程实践一、📜 HTTP 请求方法全景图🏆 核心方法深度对比HTTP 请求方法概念对比表🛠️ 特殊方法应用场景 二、🎨 各方法深度解析1. GET - 数据查看器&am…

JS-实现一个链式调用工具库

要求: 支持链式调用,如:_chain(data).map().filter().value()实现map、filter、等常用方法支持惰性求值(延迟执行、直到用到value()时才真正计算)。 链式调用的实现原理的关键点是:函数执行完以后&#x…

【人工智能数学基础】实变函数与泛函分析

数学分析、解析几何、高等代数、实变函数、常微分方程、近世代数、微分几何、复变函数、点集拓扑、概率论、数理统计、数理逻辑、偏微分方程、泛函分析、动力系统、数学物理方程、数论导引、群与代数表示、微分流形、代数拓扑、代数几何、金融数学、多元统计分析、应用随机过程…

css3 背景色渐变

在 CSS 中,使用渐变色需要用到 gradient 属性,而 gradient 属性分为 线性渐变 linear-gradient 与 径向渐变 radial-gradient。今天主要是说一下 linear-gradient 线性渐变属性。 例如:background: linear-gradient(90deg, #e7f1fc, #f5f9fb…

将图片合成为视频(基于 OpenCV)

本文将介绍如何使用 Python 和 OpenCV 将一组图像文件合成为一个视频文件。你将学会: 使用 os 模块遍历文件夹中的图像 使用 cv2.VideoWriter 写入视频 设置分辨率与帧率参数 对图像尺寸进行统一处理 简单的视频生成应用开发 1. 所需模块与安装 本章需要以下 …

HanLP 使用教程:从安装到实战应用

HanLP 使用教程:从安装到实战应用 HanLP 是由hankcs开发的一款高效、多功能的中文自然语言处理(NLP)工具包,支持分词、词性标注、命名实体识别(NER)、依存句法分析、关键词提取、文本摘要等任务。本教程将…

MySQL 分组函数全面详解与最佳实践

MySQL 分组函数全面详解与最佳实践 MySQL 分组函数(聚合函数)的核心知识、注意事项和高级应用技巧: 📊 分组函数核心列表 函数描述示例COUNT()计算行数COUNT(*)SUM()计算数值总和SUM(salary)AVG()计算平均值AVG(score)MAX()获取…

华为OD 最小循环子数组

1. 题意 给定一个由若干整数组成的数组 nums,请检查数组是否是由某个子数组重复循环拼接而成,请输出这个最小的子数组。 2. 题解 利用 k m p kmp kmp中的 n e x t next next数组性质,我们可以求出 n u m s nums nums中的最长公共 前缀后缀…

FreeCAD创作参数化凹形和水波纹式雨水箅子

这种非常流行的美观的雨水篦子是都市的宠爱,大家要多多去用。 用FC来创建参数化后,设计人员可以随意修改参数,满足自身的要求,调整各部件的位置,达到满意的布局,非常快捷。 水波纹雨水篦子 凹形雨水篦子

如何用一台服务器用dify私有部署通用的大模型应用?

dify是什么?如何用一台服务器用dify私有部署通用的大模型应用? Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)和LLMOps的理念,使开发者可以快速搭建生产级的生成式 AI 应用…

海洋捕食算法优化BP神经网络

引言BP神经网络因梯度下降法的固有缺陷,常出现训练震荡和早熟收敛。海洋捕食算法(MPA)受海洋生物觅食行为启发,其分阶段搜索策略(高速游动→自适应步长→局部开发)能有效平衡全局探索与局部开发。本文通过MPA优化BP初始权值及学习率,构建混合优化模型。 方法论2.1 MPA算…

C++/OpenCV 图像预处理与 PaddleOCR 结合进行高效字符识别

C/OpenCV 图像预处理与 PaddleOCR 结合进行高效字符识别 在许多实际应用场景中,直接从原始图片中提取文字的准确率可能不尽人意。图像中的噪声、光照不均、角度倾斜等问题都会严重干扰 OCR (Optical Character Recognition) 引擎的识别效果。本文将详细介绍如何利用…

线程的学习

1. 线程 1. 线程是一个进程内部的控制序列 2. 线程在进程内部运行,本质是在进程地址空间内运行 3. 进程:承担分配系统资源的基本实体 线程:CPU调度的基本单位 4. 线程在进程地址空间内运行 进程访问的大部分资源都是通过地址空间访问的 …