【ThreeJS Basics 1-3】Hello ThreeJS,实现第一个场景

文章目录


环境

我的环境是 node version 22


创建一个项目

首先,新建一个空的文件夹,然后 npm init -y , 此时会快速生成好默认的 package.json

安装依赖

在新建的项目下用 npm 安装依赖

  • npm install vite
  • npm install three

基础 Web 页面

在项目下新建 index.html

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>First Three.js Project</title>
</head>
<body>
    <canvas class="webgl"></canvas>
    <script type="module" src="./script.js"></script>
</body>
</html>

概念解释

想要使用 ThreeJS 实现一些场景,以下的对象是必要的

  • A scene that will contain objects
  • Some objects
  • A camera
  • A renderer

大概的思路是

  1. 新建场景
  2. 新建一个立方体,把他加入场景
  3. 新建一个照相机,加入场景
  4. 创建渲染器,配置渲染尺寸,说明渲染那个场景,以及用那个摄像头渲染

以下就是在脚本中如何定义并使用这四种对象

编写代码

新建 script.js

js 复制代码
import * as THREE from 'three'

// Canvas
const canvas = document.querySelector('canvas.webgl')

// Scene
const scene = new THREE.Scene()

/**
 * Object
 */
const geometry = new THREE.BoxGeometry(1, 1, 1)
const material = new THREE.MeshBasicMaterial({ color: 0xff0000 })
const mesh = new THREE.Mesh(geometry, material)
scene.add(mesh)

/**
 * Sizes
 */
const sizes = {
    width: 800,
    height: 600
}

/**
 * Camera
 */
const camera = new THREE.PerspectiveCamera(75, sizes.width / sizes.height)
camera.position.z = 3
scene.add(camera)

/**
 * Renderer
 */
const renderer = new THREE.WebGLRenderer({
    canvas: canvas
})
renderer.setSize(sizes.width, sizes.height)
renderer.render(scene, camera)

运行项目

通过 npm run dev 跑起来看一看

也许你会觉得它并不像个空间上的物体,这是因为,我们的照相机跟物体是水平的

所有的元素,添加到场景时候,位置坐标都是 ( 0,0,0 )

我们修改一下材质 wireframe

js 复制代码
const material = new THREE.MeshBasicMaterial({ color: 0xff0000, wireframe: true })

你就会得到如下的画面

相关推荐
默_笙10 小时前
🚦 请三个 AI 考官给 RAG 打分:量化评估实战(下)
前端·javascript
阿坨11 小时前
灵感闪存卡:一款 Tampermonkey用户脚本
javascript·tampermonkey
朝朝辞暮i12 小时前
C++ 第 25 课:getter / setter + this
java·javascript·c++
蜗牛互联网13 小时前
Python接入Gemini 3.8 Flash实现票据视觉抽取与规则校验
java·javascript·网络·人工智能·python
xieter14 小时前
【技术精选】深入浅出现代前端渲染与性能优化实践指南 (2026-10-04)
前端·javascript
xieter14 小时前
【硬核实战】TypeScript Compiler API: Preserving Child Node Narrowing in Reusable Type Guards 🔧 (2026-10-03)
前端·javascript
xieter14 小时前
【硬核实战】React 19 useFormStatus Returning False? I Built a SubmitButton That Fixes It (2026-10-03)
前端·javascript
paopaokaka_luck16 小时前
非遗文物数字化小程序(AI非遗问答、ONNX图像识别、协同过滤推荐、ECharts数据分析、非遗知识浏览与互动、文创商城订单闭环、文化活动报名签到、社区交流)
javascript·spring boot·mysql·数据分析·echarts·mybatis
Highcharts.js16 小时前
图表开发实战总结| 7 条“黄金法则”与“性能铁律”
前端·javascript·vue.js·编辑器·时序数据库·highcharts
Helix25016 小时前
Electron、WebView 框架与 HTA 对比:桌面应用选型、安全性与现代替代方案
前端·javascript·electron·webview·vbscript·hta·本地html应用