1. Giới thiệu chung về thang 3D và ý nghĩa của việc vẽ thang 3D mã

Trong thời đại công nghệ số, việc mô phỏng, thiết kế và trình bày các mô hình 3D không chỉ giới hạn trong lĩnh vực kiến trúc, cơ khí hay game mà còn lan rộng tới các ngành thiết kế đồ họa, quảng cáo và thậm chí là giáo dục. Một trong những yếu tố quan trọng giúp mô hình 3D trở nên sinh động, thực tế hơn là thang 3D – hay còn gọi là “bậc thang 3D”, “step 3D”. Đặc biệt, thang 3D mã (code) là cách thể hiện thang 3D bằng các đoạn mã lập trình, cho phép chúng ta tự động hoá quá trình vẽ, tùy chỉnh chi tiết và tích hợp vào các dự án phần mềm một cách linh hoạt.

1.1. Tại sao cần vẽ thang 3D mã?

  • Tự động hoá: Khi sử dụng mã nguồn để tạo thang, chúng ta có thể lặp lại quy trình một cách nhanh chóng mà không cần vẽ tay mỗi lần.
  • Tùy biến linh hoạt: Thông qua các tham số (độ cao, độ rộng, số bậc, màu sắc…), ta có thể tạo ra hàng nghìn biến thể chỉ trong vài dòng code.
  • Tích hợp dễ dàng: Các mô hình thang 3D được sinh ra bằng mã có thể nhúng trực tiếp vào các ứng dụng web, game engine, hoặc phần mềm CAD.
  • Hiệu suất: Khi số lượng thang tăng lên, việc dùng code để tạo chúng giúp giảm tải công việc của người thiết kế và giảm thiểu lỗi.

1.2. Các ngôn ngữ và công cụ phổ biến

Ngôn ngữ/Framework Đặc điểm Thư viện hỗ trợ
JavaScript (Three.js) Được dùng rộng rãi cho web 3D, dễ học THREE.BoxGeometry, THREE.Mesh
Python (Blender API, PyOpenGL) Tích hợp mạnh mẽ trong đồ họa 3D, hỗ trợ mô phỏng bpy, numpy
C# (Unity) Dành cho game và thực tế ảo Mesh, GameObject
C++ (OpenGL, DirectX) Hiệu năng cao, phù hợp cho phần mềm chuyên sâu GLM, Assimp
Processing (Java) Thân thiện với người mới, nhanh chóng tạo prototype PShape, box()

Bài viết này sẽ tập trung vào Three.js (JavaScript) vì tính phổ biến và khả năng hiển thị trực tiếp trên trình duyệt, đồng thời cung cấp ví dụ bằng Python + Blender cho người muốn làm việc trong môi trường 3D chuyên nghiệp.

2. Nguyên tắc cơ bản để vẽ thang 3D

2.1. Cấu trúc một bậc thang

Cách Vẽ Thang 3d Mã
Cách Vẽ Thang 3d Mã

Mỗi bậc thang thường gồm hai phần chính:

  1. Tấm bậc (tread) – bề mặt ngang mà người bước lên.
  2. Mặt đứng (riser) – phần dọc, tạo độ cao cho mỗi bậc.

Khi vẽ thang 3D, chúng ta có thể kết hợp tread và riser thành một khối đơn (box) hoặc tách riêng để tùy chỉnh chi tiết (ví dụ: tạo viền, gờ cạnh).

2.2. Tham số quan trọng

Tham số Ý nghĩa Đơn vị
stepCount Số bậc thang số nguyên
treadDepth Độ sâu của tấm bậc mét (hoặc cm)
treadWidth Độ rộng của tấm bậc mét
riserHeight Độ cao của mặt đứng mét
stairWidth Độ rộng tổng thể (có thể bằng treadWidth) mét
material Vật liệu, màu sắc —
position Vị trí gốc của thang vector 3D
rotation Góc quay (để tạo thang xoắn, cong) radian

2.3. Công thức tính vị trí mỗi bậc

Giả sử bậc đầu tiên có vị trí gốc (0,0,0). Với mỗi bậc i (bắt đầu từ 0), vị trí của tread và riser được tính như sau:

  • Tread:
  • X = i treadDepth (tiến về phía trước)
  • Y = i riserHeight (lên cao)
  • Z = 0 (giữ chiều rộng không đổi)

  • Riser:

  • X = (i treadDepth) - (treadDepth / 2) (nằm phía sau tread)
  • Y = i riserHeight + (riserHeight / 2)
  • Z = 0

Công thức này có thể thay đổi tùy vào hướng (ví dụ: thang lên lên phía trái, hoặc thang xoắn).

3. Vẽ thang 3D bằng Three.js (JavaScript)

Cách Vẽ Thang 3d Mã
Cách Vẽ Thang 3d Mã

3.1. Chuẩn bị môi trường

  1. Tạo file HTML và import Three.js qua CDN:
<!DOCTYPE html>
<html lang="vi">
<head> <meta charset="UTF-8"> <title>Vẽ Thang 3D Mã - Three.js</title> <style>body{margin:0;overflow:hidden}</style>
</head>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r152/three.min.js"></script>
<script src="stair.js"></script>
</body>
</html>
  1. Tạo file stair.js – nơi chứa toàn bộ logic vẽ.

3.2. Khởi tạo Scene, Camera, Renderer

// stair.js
const scene = new THREE.Scene();
scene.background = new THREE.Color(0xf0f0f0); const camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.1, 1000
);
camera.position.set(5, 5, 10);
camera.lookAt(0, 0, 0); const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement); // Đèn
const ambient = new THREE.AmbientLight(0xffffff, 0.6);
scene.add(ambient);
const dirLight = new THREE.DirectionalLight(0xffffff, 0.8);
dirLight.position.set(5, 10, 7);
scene.add(dirLight);

3.3. Hàm tạo bậc thang

function createStairStep(treadDepth, treadWidth, riserHeight, material) { // Tạo geometry cho tread (bề mặt ngang) const treadGeom = new THREE.BoxGeometry(treadDepth, 0.2, treadWidth); const tread = new THREE.Mesh(treadGeom, material); // Tạo geometry cho riser (mặt đứng) const riserGeom = new THREE.BoxGeometry(0.2, riserHeight, treadWidth); const riser = new THREE.Mesh(riserGeom, material); riser.position.set(-treadDepth / 2 + 0.1, riserHeight / 2, 0); // Nhóm lại thành một Object3D const step = new THREE.Object3D(); step.add(tread); step.add(riser); return step;
}

3.4. Hàm tạo toàn bộ thang

function buildStaircase({ stepCount = 10, treadDepth = 1, treadWidth = 2, riserHeight = 0.3, material = new THREE.MeshStandardMaterial({ color: 0x8b4513 })
} = {}) { const staircase = new THREE.Object3D(); for (let i = 0; i < stepCount; i++) { const step = createStairStep(treadDepth, treadWidth, riserHeight, material); step.position.set(i treadDepth, i riserHeight, 0); staircase.add(step); } return staircase;
} // Thêm thang vào scene
const myStair = buildStaircase({ stepCount: 12, treadDepth: 0.9, treadWidth: 3, riserHeight: 0.25, material: new THREE.MeshStandardMaterial({ color: 0x555555 })
});
scene.add(myStair);

3.5. Vòng lặp render và điều chỉnh kích thước

function animate() { requestAnimationFrame(animate); renderer.render(scene, camera);
}
animate(); window.addEventListener('resize', () => { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight);
});

3.6. Tùy biến nâng cao

Cách Vẽ Thang 3d Mã
Cách Vẽ Thang 3d Mã
  • Thang xoắn (spiral stair): Thay đổi vị trí step.position bằng công thức vòng tròn:
    javascript const radius = 2; const angle = i (Math.PI / 6); // 30 độ mỗi bậc step.position.set( Math.cos(angle) radius, i riserHeight, Math.sin(angle) radius ); step.rotation.y = -angle;
  • Thêm rail (tay vịn): Dùng THREE.CylinderGeometry hoặc THREE.TubeGeometry để tạo ống hoặc ống cong.
  • Đổ bóng (shadow): Bật renderer.shadowMap.enabled = true và bật castShadow/receiveShadow cho các mesh.

4. Vẽ thang 3D bằng Python + Blender (scripting)

4.1. Tại sao dùng Blender?

Blender là phần mềm mã nguồn mở, mạnh mẽ trong mô hình hoá, render và animation. Với API Python (bpy), chúng ta có thể tự động hoá việc tạo thang, xuất file .obj hoặc .fbx để dùng trong các engine khác.

4.2. Chuẩn bị môi trường

  1. Cài đặt Blender (phiên bản 3.6+).
  2. Mở Scripting Workspace và tạo một Text Block mới, đặt tên stair_generator.py.

4.3. Script cơ bản

import bpy
import math def clear_scene(): bpy.ops.object.select_all(action='SELECT') bpy.ops.object.delete(use_global=False) def create_step(tread_depth, tread_width, riser_height, material): # Tread bpy.ops.mesh.primitive_cube_add(size=1) tread = bpy.context.active_object tread.scale = (tread_depth/2, 0.1, tread_width/2) # Riser bpy.ops.mesh.primitive_cube_add(size=1) riser = bpy.context.active_object riser.scale = (0.1, riser_height/2, tread_width/2) riser.location = (-tread_depth/2 + 0.05, riser_height/2, 0) # Gộp lại bpy.ops.object.select_all(action='DESELECT') tread.select_set(True) riser.select_set(True) bpy.context.view_layer.objects.active = tread bpy.ops.object.join() step = bpy.context.active_object step.data.materials.append(material) return step def build_staircase(step_count=10, tread_depth=1.0, tread_width=2.0, riser_height=0.3, material=None): staircase = bpy.data.collections.new("Staircase") bpy.context.scene.collection.children.link(staircase) for i in range(step_count): step = create_step(tread_depth, tread_width, riser_height, material) step.location = (i tread_depth, i riser_height, 0) staircase.objects.link(step) bpy.context.scene.collection.objects.unlink(step) # ------------------- MAIN -------------------
clear_scene() # Tạo vật liệu
mat = bpy.data.materials.new(name="StairMaterial")
mat.diffuse_color = (0.6, 0.4, 0.2, 1) # nâu build_staircase( step_count=15, tread_depth=0.9, tread_width=3.0, riser_height=0.25, material=mat
) # Thiết lập camera
cam = bpy.data.objects'Camera'
cam.location = (5, -8, 6)
cam.rotation_euler = (math.radians(60), 0, math.radians(45)) # Đèn
light = bpy.data.objects'Light'
light.location = (4, -4, 6)

4.4. Thang xoắn trong Blender

Cách Vẽ Thang 3d Mã
Cách Vẽ Thang 3d Mã
def build_spiral_stair(step_count=20, radius=2.0, angle_step=math.radians(30), tread_depth=0.8, tread_width=2.5, riser_height=0.25, material=None): for i in range(step_count): step = create_step(tread_depth, tread_width, riser_height, material) theta = i angle_step x = math.cos(theta) radius y = i riser_height z = math.sin(theta) radius step.location = (x, y, z) step.rotation_euler = (0, 0, -theta) # Gắn vào collection bpy.context.scene.collection.objects.link(step)

Gọi hàm:

build_spiral_stair(step_count=25, radius=2.5, angle_step=math.radians(20))

4.5. Xuất mô hình

bpy.ops.export_scene.obj(filepath="//staircase.obj", use_selection=False)

File .obj có thể được nhập vào Unity, Unreal, hoặc các phần mềm CAD khác.

5. Các lưu ý và best practices khi vẽ thang 3D mã

  1. Độ chính xác của đơn vị: Đảm bảo đồng nhất giữa các tham số (mét, cm). Khi xuất sang engine khác, tỷ lệ có thể bị biến đổi.
  2. Tối ưu hoá số lượng đa giác: Đối với game, giảm số faces bằng cách dùng BoxGeometry thay vì tạo từng tấm riêng biệt.
  3. Sử dụng Instancing: Trong Three.js, InstancedMesh cho phép render hàng nghìn bậc với chi phí GPU thấp.
  4. Material reuse: Tạo một material duy nhất và chia sẻ cho tất cả các bậc để giảm tải render.
  5. Shadow & Ambient Occlusion: Thêm bản đồ bóng và AO để tăng tính thực tế, đặc biệt khi thang có nhiều bậc.
  6. Kiểm tra va chạm: Nếu thang dùng trong game, cần thêm collider (Three.js: Box3 hoặc physics engine) để người chơi không xuyên qua.
  7. Thêm metadata: Gán userData cho mỗi bậc (ví dụ: số thứ tự, độ cao) để dễ dàng truy xuất trong gameplay hoặc animation.

6. Ứng dụng thực tế của thang 3D mã

Ứng dụng Mô tả Công nghệ sử dụng
Kiến trúc trực tuyến Tạo mô hình tòa nhà có thang bộ, cho khách hàng xem qua web Three.js + WebGL
Game platformer Thang là phần quan trọng của level design, người chơi nhảy lên xuống Unity (C#) hoặc Unreal (Blueprint)
VR Training Mô phỏng môi trường công trường, đào tạo an toàn khi sử dụng thang Unity + XR Interaction Toolkit
Giáo dục Giải thích nguyên lý hình học, tính toán độ dốc, chiều cao Python + Blender (scripting)
Sản xuất Tự động tạo bản vẽ CNC cho các bộ thang kim loại C++ + OpenCASCADE

7. Kết luận

Việc vẽ thang 3D mã không chỉ giúp tiết kiệm thời gian mà còn mở ra khả năng tùy biến vô hạn cho các dự án thiết kế và phát triển phần mềm. Bằng cách nắm vững các nguyên tắc cơ bản – từ cấu trúc bậc thang, các tham số quan trọng, tới công thức tính vị trí – chúng ta có thể áp dụng linh hoạt trên mọi nền tảng: Three.js cho web, Blender + Python cho mô hình chuyên nghiệp, hoặc Unity/C# cho game.

Hãy bắt đầu thực hành ngay hôm nay: thử thay đổi độ rộng, số bậc, hay tạo thang xoắn đầy nghệ thuật. Khi đã thành thạo, bạn sẽ thấy rằng thang 3D không còn là một chi tiết phụ mà trở thành công cụ mạnh mẽ để truyền tải ý tưởng và tạo ra những trải nghiệm 3D độc đáo.

Chúc bạn thành công trong hành trình sáng tạo thang 3D bằng mã!

Rate this post
Mục nhập này đã được đăng trong Blog. Đánh dấu trang permalink.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *