0

Three.js cho người mới bắt đầu — Hiểu đúng về thế giới 3D trước khi code

Mở đầu

Nếu bạn đang bắt đầu học Three.js, rất có thể bạn đã từng gặp những tình huống như:

  • Copy code từ tutorial nhưng không hiểu thật sự nó hoạt động thế nào
  • Scene render được nhưng không hiểu camera đang nhìn từ đâu
  • Không hiểu vì sao object tự nhiên biến mất
  • Không hiểu tại sao đổi position lại khiến object “bay mất”
  • Không phân biệt được:
    • Mesh
    • Geometry
    • Material
    • Group
    • Scene

Kết quả là:

“Làm theo tutorial thì được, tự build thì không.”

Đây là vấn đề gần như tất cả người mới học 3D đều gặp phải.

Và thật ra nguyên nhân không nằm ở việc bạn code kém.

Mà vì:

bạn đang học một cách suy nghĩ hoàn toàn khác với lập trình web thông thường.

Trong frontend thông thường:

  • bạn làm việc với HTML
  • CSS
  • DOM
  • layout 2D

Nhưng trong Three.js:

  • bạn đang làm việc với không gian 3 chiều
  • camera
  • góc nhìn
  • vector
  • rotation
  • transform
  • matrix

Đó là lý do:

nhiều người học Three.js cảm thấy “rất mơ hồ”.

Mình cũng từng như vậy.

Và sau khi xây dựng editor 3D thực tế với:

  • drag
  • rotate
  • scale
  • snapping
  • transform controls
  • instancing
  • selection system
  • collision
  • editor architecture

… mình nhận ra một điều cực kỳ quan trọng:

Điều khó nhất của Three.js không phải API.
Mà là tư duy không gian 3D.

Bài viết này sẽ giúp bạn hiểu:

  • Three.js thực chất là gì
  • 3D rendering hoạt động ra sao
  • những khái niệm cốt lõi nhất
  • và cách suy nghĩ đúng khi bắt đầu học 3D.

Mục tiêu của bài này không phải:

“copy code để render cube.”

Mà là:

giúp bạn hiểu nền tảng thật sự của thế giới 3D.


1. Three.js thực chất là gì?

Three.js không phải game engine

Đây là điều đầu tiên người mới thường hiểu nhầm.

Three.js KHÔNG phải:

  • Unity
  • Unreal Engine
  • Godot

Nó không phải một game engine hoàn chỉnh.

Three.js chỉ là:

thư viện JavaScript giúp render đồ họa 3D trên browser thông qua WebGL.

Hiểu đơn giản:

Công nghệ Vai trò
HTML Tạo cấu trúc
CSS Style giao diện
JavaScript Logic
Three.js Render 3D

Nó giống như:

“canvas để bạn xây dựng thế giới 3D bằng code.”


Three.js hoạt động dựa trên WebGL

Three.js thực chất là lớp abstraction phía trên WebGL.

Nếu dùng WebGL trực tiếp:

  • rất phức tạp
  • phải thao tác shader
  • buffer
  • GPU pipeline

Ví dụ để vẽ một hình tam giác bằng WebGL thuần:

  • có thể mất vài trăm dòng code.

Nhưng với Three.js:

const geometry = new THREE.BoxGeometry()
const material = new THREE.MeshBasicMaterial()

const mesh = new THREE.Mesh(
  geometry,
  material
)

scene.add(mesh)

→ bạn đã có object 3D.

Đó là lý do Three.js trở thành thư viện phổ biến nhất cho web 3D.


2. Three.js hoạt động như thế nào?

Đây là phần cực kỳ quan trọng.

Rất nhiều người học Three.js nhưng không hiểu:

chuyện gì đang xảy ra phía sau.


Một frame render hoạt động ra sao?

Hãy tưởng tượng:

Scene

= thế giới

Camera

= mắt người

Renderer

= máy quay + màn hình

Workflow sẽ là:

Scene → Camera → Renderer → Màn hình

Step-by-step

B1 — Tạo scene

const scene = new THREE.Scene()

Scene là nơi chứa:

  • object
  • light
  • model
  • group
  • mọi thứ trong thế giới 3D

Bạn có thể tưởng tượng:

Scene giống một “vũ trụ nhỏ”.


B2 — Tạo camera

const camera = new THREE.PerspectiveCamera(
  75,
  width / height,
  0.1,
  1000
)

Camera là:

thứ quyết định bạn nhìn scene như thế nào.

Nếu scene tồn tại nhưng camera không nhìn vào scene: → bạn sẽ không thấy gì.

Đây là lỗi cực kỳ phổ biến của beginner.


B3 — Tạo renderer

const renderer = new THREE.WebGLRenderer()

Renderer có nhiệm vụ:

  • lấy dữ liệu từ scene
  • render theo góc nhìn camera
  • vẽ lên màn hình

B4 — Render

renderer.render(scene, camera)

Đây là lệnh:

“hãy render thế giới này.”


3. Tư duy quan trọng nhất trong 3D: Coordinate System

Người mới thường nghĩ:

3D chỉ là “2D nhưng thêm chiều nữa”.

Sai hoàn toàn.

Trong 3D:

  • mọi thứ phụ thuộc vào tọa độ
  • góc nhìn
  • transform

Nếu không hiểu coordinate system: → bạn sẽ luôn bị “mù phương hướng”.


4. Trục tọa độ trong Three.js

Trong frontend bình thường:

Trục Ý nghĩa
X trái → phải
Y trên → dưới

Nhưng trong Three.js:

Trục Ý nghĩa
X trái ↔ phải
Y xuống ↕ lên
Z trước ↔ sau

Điều khiến nhiều người bị nhầm

Trong web:

  • Y tăng → đi xuống

Trong Three.js:

  • Y tăng → đi lên

Đây là thứ khiến rất nhiều beginner bị loạn.


Ví dụ trực quan

cube.position.x += 1

→ object đi sang phải.


cube.position.y += 1

→ object bay lên.


cube.position.z += 1

→ object tiến gần camera hơn.


5. Position, Rotation, Scale — bộ ba quan trọng nhất

Mọi object trong Three.js đều có:

mesh.position
mesh.rotation
mesh.scale

Đây là:

nền tảng của mọi editor 3D.


6. Position

Dùng để thay đổi vị trí object.

mesh.position.set(1, 2, 3)

Nghĩa là:

  • x = 1
  • y = 2
  • z = 3

7. Rotation

Dùng để xoay object.

mesh.rotation.y = Math.PI / 2

Điều quan trọng:

Three.js dùng radian, không dùng độ.


Vì sao dùng radian?

Ví dụ:

Độ Radian
90° Math.PI / 2
180° Math.PI
360° Math.PI * 2

Người mới thường bug ở đây rất nhiều.


8. Scale

Scale dùng để thay đổi kích thước.

mesh.scale.set(2, 2, 2)

→ object lớn gấp đôi.


9. Mesh là gì?

Đây là khái niệm cực kỳ quan trọng.

Rất nhiều beginner dùng Mesh nhưng không hiểu nó là gì.


Mesh = Geometry + Material

Mesh = Geometry + Material

Geometry là gì?

Geometry = hình dạng.

Ví dụ:

new THREE.BoxGeometry()

→ hình hộp.


new THREE.SphereGeometry()

→ hình cầu.


new THREE.PlaneGeometry()

→ mặt phẳng.


Material là gì?

Material = cách object hiển thị.

Ví dụ:

  • màu sắc
  • texture
  • độ bóng
  • ánh sáng
  • transparency

Ví dụ hoàn chỉnh

const geometry = new THREE.BoxGeometry()

const material = new THREE.MeshStandardMaterial({
  color: '#ff0000'
})

const cube = new THREE.Mesh(
  geometry,
  material
)

10. Vì sao object không hiện?

Đây là câu hỏi beginner gặp nhiều nhất.


Nguyên nhân 1 — Camera không nhìn thấy object

Ví dụ:

camera.position.z = 5

Nếu object nằm phía sau camera: → không thấy gì.


Nguyên nhân 2 — Không có ánh sáng

Nếu dùng:

MeshStandardMaterial

mà không có light: → scene sẽ đen.

Ví dụ:

const light = new THREE.DirectionalLight()
scene.add(light)

Nguyên nhân 3 — Object nằm ngoài frustum

Camera chỉ render trong khoảng:

near → far

Ví dụ:

0.11000

Nếu object nằm ngoài: → object biến mất.


11. Render loop — trái tim của Three.js

Trong web bình thường:

  • code chạy 1 lần.

Nhưng trong game/3D:

  • scene phải render liên tục.

Animation loop

function animate() {
  requestAnimationFrame(animate)

  renderer.render(scene, camera)
}

animate()

Đây gọi là:

render loop hoặc game loop.


Vì sao cần render liên tục?

Bởi vì:

  • camera thay đổi
  • object di chuyển
  • animation thay đổi
  • physics thay đổi

Nếu không render liên tục: → scene sẽ “đóng băng”.


12. OrbitControls — thứ khiến ai cũng thích Three.js

Nếu từng dùng:

  • Blender
  • Unity
  • Sketchfab

thì bạn đã quen với kiểu:

  • xoay camera
  • zoom
  • pan

Three.js có sẵn điều này:

const controls = new OrbitControls(
  camera,
  renderer.domElement
)

OrbitControls giúp:

  • rotate camera
  • zoom
  • pan
  • inspect scene

Nó khiến scene:

“có cảm giác thật hơn rất nhiều.”


13. Group và hierarchy

Trong editor 3D:

  • object thường có cha/con.

Ví dụ:

  • xe hơi
    • bánh xe
    • cửa xe
    • kính

Nếu move xe: → toàn bộ child move theo.


Group

const group = new THREE.Group()

Dùng để gom object.


Hierarchy rất quan trọng

Đây là nền tảng của:

  • editor
  • game object
  • transform system

14. Điều người mới nên học trước tiên

Đừng học:

  • shader
  • postprocessing
  • physics
  • optimization

quá sớm.

Đây là sai lầm rất phổ biến.


Roadmap đúng cho beginner

Giai đoạn 1 — Hiểu nền tảng

Học:

  • Scene
  • Camera
  • Renderer
  • Mesh
  • Geometry
  • Material
  • Position
  • Rotation
  • Scale

Giai đoạn 2 — Interaction

Học:

  • Raycasting
  • Selection
  • OrbitControls
  • Events

Giai đoạn 3 — Real project

Học:

  • GLTF
  • Instancing
  • Optimization
  • Editor architecture

15. Dự án đầu tiên nên là gì?

Sai lầm lớn nhất:

“Build MMORPG.”

Hãy bắt đầu bằng project nhỏ nhưng thực tế.


Nên làm

  • room editor
  • furniture editor
  • map editor
  • product configurator

Không nên làm khi mới học

  • MMO
  • multiplayer realtime
  • physics-heavy game
  • metaverse clone

16. Điều quan trọng nhất khi học Three.js

Three.js không khó vì syntax.

API thật ra khá đơn giản.

Điều khó là:

tư duy không gian 3D.

Khi bạn bắt đầu hiểu:

  • world space
  • local space
  • hierarchy
  • transform
  • matrix
  • coordinate conversion

… bạn sẽ tiến bộ rất nhanh.


17. Điều mình ước biết sớm hơn

Khi mới học Three.js, mình nghĩ:

“học API là đủ.”

Nhưng sau khi build editor thật:

  • drag system
  • rotate snapping
  • collision
  • transform hierarchy
  • instancing
  • selection system

… mình nhận ra:

3D engineering thực chất là bài toán tư duy.

Và đó là thứ khiến Three.js:

  • khó
  • nhưng cũng cực kỳ thú vị.

Kết bài

Trong bài tiếp theo, chúng ta sẽ bắt đầu xây dựng:

  • selection system
  • drag object
  • rotate
  • scale
  • snapping
  • transform controls

và từng bước biến một scene đơn giản thành:

một 3D editor thực tế giống Blender mini trên web.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.