three.js环境及使用教程

开发环境

bash 复制代码
npm i three@0.156.1
npm i @types/three@0.156.0

入门代码

index.html

xml 复制代码
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title>Document</title>
		<!-- <link rel="stylesheet" href="demo.css" /> -->
		<style>
			body {
				margin: 0;
			}
		</style>
		<!-- 核心依赖 -->
		<script
			async
			src="https://unpkg.com/es-module-shims@1.8.3/dist/es-module-shims.js"
		></script>
		<script type="importmap">
			{
				"imports": {
					"three": "../../node_modules/three/build/three.module.js"
				}
			}
		</script>
	</head>
	<body>
		<script type="module" src="demo.js"></script>
	</body>
</html>

demo.js

js 复制代码
import * as THREE from "three";

//! 场景
const scene = new THREE.Scene();

//! 透视相机(垂直视野角度,长宽比,近端面,远端面)
const camera = new THREE.PerspectiveCamera(
	75,
	window.innerWidth / window.innerHeight,
	0.1,
	1000
);
camera.position.z = 5;

//! 渲染器
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
window.onresize = function () {
	renderer.setSize(window.innerWidth, window.innerHeight);
	//
	camera.setViewOffset(
		window.innerWidth,
		window.innerHeight,
		0,
		0,
		window.innerWidth,
		window.innerHeight
	);
};

//! 线
{
	// 定义材质
	const material = new THREE.LineBasicMaterial({ color: 0x00ff00 });
	// 创建几何体
	const points = [];
	points.push(new THREE.Vector3(-3, 0, 0));
	points.push(new THREE.Vector3(0, 3, 0));
	points.push(new THREE.Vector3(3, 0, 0));
	points.push(new THREE.Vector3(0, -3, 0));
	points.push(new THREE.Vector3(-3, 0, 0));
	const geometry = new THREE.BufferGeometry().setFromPoints(points);
	// 创建 Line
	const line = new THREE.Line(geometry, material);
	// 添加到场景
	scene.add(line);
}

//! 立方体
{
	// 定义材质
	const material = new THREE.MeshBasicMaterial({ color: 0x0ffff0 });
	// 几何对象
	const geometry = new THREE.BoxGeometry(1, 1, 1);
	// 创建 Cube
	const cube = new THREE.Mesh(geometry, material);
	// 添加到场景
	scene.add(cube);
	// 动画效果
	function animate() {
		// 向浏览器发起一个执行某函数的请求(一般默认保持60FPS的频率)
		requestAnimationFrame(animate);
		// 旋转 Cube
		cube.rotation.x += 0.01;
		cube.rotation.y += 0.01;
		// 旋转 Camera
		camera.rotation.z += 0.01;
		// 刷新相机
		renderer.render(scene, camera);
	}
	animate();
}

摄像机(Camer)

TODO

材质(Mesh)

TODO

图层(Layers)

TODO

基本几何图形

TODO

加载3D模型

TODO

相关推荐
暗中讨饭的卫313 小时前
ArcGIS图形缓冲:点要素缓冲出长方形问题干货总结
arcgis
一只小灿灿13 小时前
C++ 各类特殊符号、运算符
开发语言·c++
寒水馨13 小时前
macOS下载、安装electron-v43.2.0(附安装包electron-v43.2.0-darwin-arm64.zip)
javascript·macos·electron·node.js·跨平台·桌面应用开发·开源框架
Fu_Lin_13 小时前
《Qt嵌入式从零基础到精通》前言与阅读指南
开发语言·qt
名字还没想好☜13 小时前
Go 的 select 实战:超时、非阻塞收发与优雅退出的三个套路
开发语言·数据库·golang·go·并发
geovindu13 小时前
java: Backtracking Algorithm
java·开发语言·windows·后端·算法·回溯算法
光影少年13 小时前
RN 路由栈管理、页面销毁、返回拦截
javascript·react native·react.js
_lucas13 小时前
做了一个glsl在线调试工具
前端·javascript·three.js
To_OC1 天前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
Scott9999HH1 天前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python