使用Three.js建立一個簡單的STL模型3D模型展示

更新 發佈閱讀 12 分鐘

這篇文章將教您如何使用Three.js來建立一個簡單的STL模型查看器,支援上傳STL檔案並即時顯示3D模型。本文將逐步分解完整範例程式碼,幫助您理解每個部分的功能。

成品預覽

使用者可以拖曳滑鼠來旋轉視角,並點擊頁面下方的上傳按鈕選擇STL檔案。選擇的模型會自動調整大小並置中,方便瀏覽。


HTML結構

首先,我們需要定義HTML頁面結構:

<!DOCTYPE html>
<html>
<head>
<title>STL Model Viewer</title>
<style>
body { margin: 0; overflow: hidden; }
#info {
position: absolute; top: 10px; width: 100%; text-align: center; color: white;
font-family: Arial; font-size: 18px; pointer-events: none;
}
#file-input {
position: absolute; bottom: 20px; left: 50%; transform: translateX(-50%);
z-index: 100; padding: 10px; background: white; border-radius: 5px;
}
#loading {
position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
color: white; font-family: Arial; font-size: 20px; display: none;
}
#canvas-container { width: 100%; height: 100vh; background: #1a1a1a; }
</style>
</head>
<body>
<div id="info">STL模型查看器 - 使用滑鼠來控制視角</div>
<div id="loading">載入中...</div>
<input type="file" id="file-input" accept=".stl" />
<div id="canvas-container"></div>
</body>
</html>

這段程式碼定義了:

  • 一個頁面標題與訊息欄位#info
  • 檔案上傳按鈕#file-input
  • 一個用於顯示模型的容器#canvas-container
  • 一個載入中的提示訊息#loading

Three.js載入與初始化

接下來,我們使用Three.js建立3D渲染場景、相機與控制器:

// 初始化場景、相機和渲染器
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({ antialias: true });

renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setPixelRatio(window.devicePixelRatio);
document.getElementById('canvas-container').appendChild(renderer.domElement);

這裡主要的步驟包括:

  1. 初始化 scene(場景),作為所有3D物件的容器。
  2. 建立 camera(相機),設定視野角度為75度,適合普通用途。
  3. 初始化 renderer(渲染器),並將畫布添加到 #canvas-container 中。

添加燈光與控制器

3D模型需要光照來呈現材質與細節,並透過控制器實現互動功能:

// 添加燈光
const directionalLight = new THREE.DirectionalLight(0xffffff, 1);
directionalLight.position.set(1, 1, 1);
scene.add(directionalLight);

const ambientLight = new THREE.AmbientLight(0x404040);
scene.add(ambientLight);

// 軌道控制器
const controls = new THREE.OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;
controls.dampingFactor = 0.05;

// 設定相機位置
camera.position.z = 5;

DirectionalLight 模擬來自單一方向的光源,AmbientLight 提供環境光以均勻照亮場景。OrbitControls 則允許使用者拖曳滑鼠控制視角。


載入STL檔案

實現STL檔案上傳與模型顯示是這個應用的核心部分:

const loader = new THREE.STLLoader();
let currentModel = null;

document.getElementById('file-input').addEventListener('change', function(event) {
const file = event.target.files[0];
if (file) {
const loadingEl = document.getElementById('loading');
loadingEl.style.display = 'block';

const url = URL.createObjectURL(file);
if (currentModel) {
scene.remove(currentModel);
}

loader.load(url, function(geometry) {
const material = new THREE.MeshPhongMaterial({ color: 0xcccccc, specular: 0x111111, shininess: 200 });
const mesh = new THREE.Mesh(geometry, material);

geometry.computeBoundingBox();
const box = new THREE.Box3().setFromObject(mesh);
const center = box.getCenter(new THREE.Vector3());
const size = box.getSize(new THREE.Vector3());

const maxDim = Math.max(size.x, size.y, size.z);
const scale = 5 / maxDim;
mesh.scale.setScalar(scale);
mesh.position.sub(center.multiplyScalar(scale));

scene.add(mesh);
currentModel = mesh;

loadingEl.style.display = 'none';
URL.revokeObjectURL(url);
}, function(xhr) {
const percent = (xhr.loaded / xhr.total * 100).toFixed(0);
loadingEl.textContent = `載入中... ${percent}%`;
}, function(error) {
console.error(error);
loadingEl.textContent = '載入失敗';
setTimeout(() => loadingEl.style.display = 'none', 2000);
});
}
});

動畫與視窗大小調整

為了持續渲染與適應視窗大小,我們添加動畫函式與resize監聽器:

function animate() {
requestAnimationFrame(animate);
controls.update();
renderer.render(scene, camera);
}
animate();

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

總結

完成以上所有步驟後,您將擁有一個簡單卻功能齊全的STL模型查看器。這個範例結構清晰且易於擴展,可以加入更多功能,例如材質選擇、模型保存等。希望這篇文章對您學習Three.js開發3D應用有所幫助!

留言
avatar-img
程式輕鬆玩
81會員
201內容數
這裡將以輕鬆風格,深入探討程式設計的基礎和高級概念。從程式語言到演算法,我們將以易懂的方式解釋每個主題,讓你輕鬆掌握。無論你是初學者或有經驗者,都能在這裡找到適合你的內容。無論你的目標是成為專業開發者還是擴展知識,我們都會陪伴你一同成長!
程式輕鬆玩的其他內容
2025/04/20
本週科技圈掀起多項重磅消息:OpenAI於4月14日釋出GPT‑4.1系列模型,進一步強化編碼與長文理解能力 Reuters;Chipolo推出POP藍牙追蹤器,同時支援Apple與Google尋找網路 The Verge;南韓新創RLWRLD完成1,480萬美元募資,將打造專屬機器人基礎模型
Thumbnail
2025/04/20
本週科技圈掀起多項重磅消息:OpenAI於4月14日釋出GPT‑4.1系列模型,進一步強化編碼與長文理解能力 Reuters;Chipolo推出POP藍牙追蹤器,同時支援Apple與Google尋找網路 The Verge;南韓新創RLWRLD完成1,480萬美元募資,將打造專屬機器人基礎模型
Thumbnail
2025/04/20
本週遊戲動態涵蓋經典 25 週年重返 PC 平台、回合制策略新作重燃星戰熱潮、Remedy 荒誕合擊新作搶先曝光、Game Pass 下架名單震撼登場,以及 Steam 獨立新秀推薦不容錯過 PC GamerWindows Central。
Thumbnail
2025/04/20
本週遊戲動態涵蓋經典 25 週年重返 PC 平台、回合制策略新作重燃星戰熱潮、Remedy 荒誕合擊新作搶先曝光、Game Pass 下架名單震撼登場,以及 Steam 獨立新秀推薦不容錯過 PC GamerWindows Central。
Thumbnail
2025/04/08
近來因為川普政府啟動全新一輪對等關稅政策,全球貿易風暴席捲而來,而台灣面臨的衝擊更是不容小覷。美方以台灣過去對美出口關稅達64%為依據,採取「對等關稅」原則回敬徵收32%關稅,這一舉措不僅使得國際市場恐慌連連,台股也出現劇烈下跌,吸引了各界關注。
Thumbnail
2025/04/08
近來因為川普政府啟動全新一輪對等關稅政策,全球貿易風暴席捲而來,而台灣面臨的衝擊更是不容小覷。美方以台灣過去對美出口關稅達64%為依據,採取「對等關稅」原則回敬徵收32%關稅,這一舉措不僅使得國際市場恐慌連連,台股也出現劇烈下跌,吸引了各界關注。
Thumbnail
看更多
你可能也想看
Thumbnail
創作不只是個人戰,在 vocus ,也可以是一場集體冒險、組隊升級。最具代表性的創作者社群「vocus 野格團」,現在有了更強大的新夥伴加入!除了大家熟悉的「官方主題沙龍」,這次我們徵召了 8 位領域各異的「個人主題專家」,將再度嘗試創作的各種可能,和格友們激發出更多未知的火花。
Thumbnail
創作不只是個人戰,在 vocus ,也可以是一場集體冒險、組隊升級。最具代表性的創作者社群「vocus 野格團」,現在有了更強大的新夥伴加入!除了大家熟悉的「官方主題沙龍」,這次我們徵召了 8 位領域各異的「個人主題專家」,將再度嘗試創作的各種可能,和格友們激發出更多未知的火花。
Thumbnail
vocus 最具指標性的創作者社群──「野格團」, 2026 年春季,這支充滿專業、熱情的團隊再次擴編,迎來了 8 位實力堅強的「個人主題專家」新成員 💫💫💫 從投資理財、自我成長、閱讀書評到電影戲劇,他們各自帶著獨特的「創作超能力」準備在格友大廳與大家見面。
Thumbnail
vocus 最具指標性的創作者社群──「野格團」, 2026 年春季,這支充滿專業、熱情的團隊再次擴編,迎來了 8 位實力堅強的「個人主題專家」新成員 💫💫💫 從投資理財、自我成長、閱讀書評到電影戲劇,他們各自帶著獨特的「創作超能力」準備在格友大廳與大家見面。
Thumbnail
這篇文章將教您如何使用Three.js來建立一個簡單的STL模型查看器,支援上傳STL檔案並即時顯示3D模型。本文將逐步分解完整範例程式碼,幫助您理解每個部分的功能。
Thumbnail
這篇文章將教您如何使用Three.js來建立一個簡單的STL模型查看器,支援上傳STL檔案並即時顯示3D模型。本文將逐步分解完整範例程式碼,幫助您理解每個部分的功能。
Thumbnail
簡介 本篇教學將帶您使用 Node.js 和 JavaScript 實現一個簡易相簿功能,具備圖片上傳、顯示以及查看原圖的功能。我們將利用 Express 框架以及 multer 中介軟體處理文件上傳,並使用 EJS 作為模板引擎來呈現網頁內容。 實現目標 相簿首頁:顯示所有已上傳的圖片。
Thumbnail
簡介 本篇教學將帶您使用 Node.js 和 JavaScript 實現一個簡易相簿功能,具備圖片上傳、顯示以及查看原圖的功能。我們將利用 Express 框架以及 multer 中介軟體處理文件上傳,並使用 EJS 作為模板引擎來呈現網頁內容。 實現目標 相簿首頁:顯示所有已上傳的圖片。
Thumbnail
介紹C++ 語法 資料型態,架構說明 程式語言為人類與電腦溝通的工具 程式設計流程: 定義問題 -> 問題分析 -> 撰寫演算法 ->程式撰寫 -> 程式執行及維護
Thumbnail
介紹C++ 語法 資料型態,架構說明 程式語言為人類與電腦溝通的工具 程式設計流程: 定義問題 -> 問題分析 -> 撰寫演算法 ->程式撰寫 -> 程式執行及維護
Thumbnail
這集介紹Next Image Module模組和CSS3如何定位在Next.js Framework
Thumbnail
這集介紹Next Image Module模組和CSS3如何定位在Next.js Framework
Thumbnail
介紹編譯器使用以及HTML5 | CSS 初學者學習HTML5和CSS3不知道從哪裡開始,這次Jay帶你來做個NFT卡片,一次完整教學案例來理解HTML5和CSS3
Thumbnail
介紹編譯器使用以及HTML5 | CSS 初學者學習HTML5和CSS3不知道從哪裡開始,這次Jay帶你來做個NFT卡片,一次完整教學案例來理解HTML5和CSS3
Thumbnail
Draco 是開源的3D 圖形壓縮, 前些陣子在處理的專案,需要用到放置3D模型, 問題來了,上百個幾千幾萬K大大小小的gltf模型,一次載入超級慢的, 公司配備電腦等級還不錯, 本機load的快,也需要大概1分鐘內時間, 當然跟現場的網路也有關係,但是減少loading還是有必要的, 拜訪goog
Thumbnail
Draco 是開源的3D 圖形壓縮, 前些陣子在處理的專案,需要用到放置3D模型, 問題來了,上百個幾千幾萬K大大小小的gltf模型,一次載入超級慢的, 公司配備電腦等級還不錯, 本機load的快,也需要大概1分鐘內時間, 當然跟現場的網路也有關係,但是減少loading還是有必要的, 拜訪goog
Thumbnail
Step1: 下載拼圖程式 下面是拼圖網址: BlackChain_ASC/ASC_Picture.zip at main · chase5ws/BlackChain_ASC (github.com) Step2: 在vs code裡面打開程式 Step3: 執行拼圖程式 選取右上角的終端機,新增終
Thumbnail
Step1: 下載拼圖程式 下面是拼圖網址: BlackChain_ASC/ASC_Picture.zip at main · chase5ws/BlackChain_ASC (github.com) Step2: 在vs code裡面打開程式 Step3: 執行拼圖程式 選取右上角的終端機,新增終
Thumbnail
JavaScript 能做許多事,尤其透過瀏覽器的 API 或套件,我們得以悠游於巨量資料中,將資料轉換為與使用者溝通的介面,以下就來分享 15 個實用的 Vanilla JS 程式碼...
Thumbnail
JavaScript 能做許多事,尤其透過瀏覽器的 API 或套件,我們得以悠游於巨量資料中,將資料轉換為與使用者溝通的介面,以下就來分享 15 個實用的 Vanilla JS 程式碼...
Thumbnail
有了這個插件,任何人都可以在不了解 JavaScript 的情況下,輕鬆製作點擊和觸碰遊戲。
Thumbnail
有了這個插件,任何人都可以在不了解 JavaScript 的情況下,輕鬆製作點擊和觸碰遊戲。
Thumbnail
可以在圖標上添加對此圖標的設定說明,使用滑鼠或觸碰單擊後顯示窗口,再次點擊會關閉窗口。
Thumbnail
可以在圖標上添加對此圖標的設定說明,使用滑鼠或觸碰單擊後顯示窗口,再次點擊會關閉窗口。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News