iT邦幫忙

2026 iThome 鐵人賽

DAY 6
0

今天不再只是讓立方體旋轉,而是開始控制它在 3D 空間中的位置、旋轉與大小。
這些概念之後都會直接用在太陽系。

一、今天完成目標

今天我們會學習
認識 X、Y、Z 三個座標軸
使用 position 移動 3D 物件
使用 rotation 旋轉 3D 物件
使用 scale 改變 3D 物件大小比例
實際製作一個在 3D 空間中移動、旋轉的立方體

二、完整程式碼

index.html

<!DOCTYPE html>
<html lang="zh-TW">

<head>

    <meta charset="UTF-8">

    <meta
        name="viewport"
        content="width=device-width, initial-scale=1.0"
    >

    <title>從 Web 到宇宙</title>

    <link rel="stylesheet" href="css/style.css">

</head>

<body>

    <div class="container">

        <h1>從 Web 到宇宙</h1>

        <p>DAY 6|3D 座標</p>

        <div id="scene"></div>

    </div>

    <script
        type="module"
        src="js/main.js"
    ></script>

</body>

</html>

css/style.css

body {
    margin: 0;
    min-height: 100vh;

    display: flex;
    justify-content: center;
    align-items: center;

    background: #050816;
    color: white;

    font-family: Arial, sans-serif;
    text-align: center;
}

.container {
    padding: 40px;
}

h1 {
    font-size: 42px;
    margin-bottom: 10px;
}

p {
    color: #aaaaaa;
    font-size: 18px;
}

#scene {
    margin-top: 20px;
}

js/main.js

// 載入 Three.js
import * as THREE from
    "https://cdn.jsdelivr.net/npm/three@0.180.0/build/three.module.js";


// ======================
// 1. 建立 Scene
// ======================

const scene = new THREE.Scene();


// ======================
// 2. 建立 Camera
// ======================

const camera = new THREE.PerspectiveCamera(
    75,
    800 / 500,
    0.1,
    1000
);

camera.position.z = 6;


// ======================
// 3. 建立 Renderer
// ======================

const renderer = new THREE.WebGLRenderer();

renderer.setSize(
    800,
    500
);

document
    .getElementById("scene")
    .appendChild(renderer.domElement);


// ======================
// 4. 建立立方體
// ======================

const geometry = new THREE.BoxGeometry(
    2,
    2,
    2
);


// 建立材質
const material = new THREE.MeshBasicMaterial({
    color: 0x0088ff
});


// 建立 Mesh
const cube = new THREE.Mesh(
    geometry,
    material
);


// 加入 Scene
scene.add(cube);


// ======================
// 5. 設定位置
// ======================

cube.position.set(
    1,
    0,
    0
);


// ======================
// 6. 設定大小
// ======================

cube.scale.set(
    1,
    1,
    1
);


// ======================
// 7. 動畫
// ======================

function animate() {

    requestAnimationFrame(animate);


    // X 軸旋轉
    cube.rotation.x += 0.01;


    // Y 軸旋轉
    cube.rotation.y += 0.01;


    // Y 軸上下移動
    cube.position.y =
        Math.sin(Date.now() * 0.002);


    // 渲染畫面
    renderer.render(
        scene,
        camera
    );
}


// 開始動畫
animate();

三、程式碼簡單說明

  1. position:控制物件位置

今天第一次使用:

cube.position.set(
    1,
    0,
    0
);

代表:

X = 1
Y = 0
Z = 0

也就是讓立方體往 X 軸方向移動。
如果改成:

cube.position.set(
    -2,
    0,
    0
);

立方體就會往左邊移動。

  1. position.y:控制上下移動

今天我們讓立方體上下浮動:

cube.position.y =
    Math.sin(Date.now() * 0.002);

小解析:為什麼選用 Math.sin()?
Date.now() 會回傳不斷增加的時間戳記毫秒數。而 Math.sin() 正弦函數的輸出值永遠只會在 -1 到 1 之間呈光滑波浪狀起伏。這樣就能不靠複雜的邏輯,輕鬆寫出自然、流暢的平滑浮動效果!之後製作行星軌道與週期變化時也會用到類似的數學觀念。

  1. rotation:控制旋轉

我們在 DAY 5 已經看過:

cube.rotation.x += 0.01;
cube.rotation.y += 0.01;

今天把它正式整理起來。

rotation.x → 繞 X 軸旋轉
rotation.y → 繞 Y 軸旋轉
rotation.z → 繞 Z 軸旋轉

例如:

cube.rotation.z += 0.01;

就可以讓立方體繞 Z 軸旋轉。

  1. scale:控制大小

今天加入:

cube.scale.set(
    1,
    1,
    1
);

這代表目前比例是:

X = 1
Y = 1
Z = 1

如果改成:

cube.scale.set(
    2,
    2,
    2
);

整個立方體就會變成原本的 2 倍。

四、今天可以自己修改看看

讓立方體變大

cube.scale.set(
    2,
    2,
    2
);

讓立方體往右邊

cube.position.set(
    3,
    0,
    0
);

讓立方體往上

cube.position.set(
    0,
    2,
    0
);

讓立方體往後

cube.position.set(
    0,
    0,
    -2
);

改變旋轉速度

原本:

cube.rotation.y += 0.01;

改成:

cube.rotation.y += 0.05;

就會轉得更快。

五、今天小結

今天我們正式認識 Three.js 的 3D 座標。
最重要的是:

X → 左右
Y → 上下
Z → 前後

以及三個常用屬性:

position → 位置
rotation → 旋轉
scale → 大小

目前我們已經學習建立 3D 世界和可以控制 3D 物件
這會是之後製作太陽系非常重要的基礎。

Day 7 預告

「Geometry、Material、Mesh:打造真正的 3D 物件」

下一天會講解之前說的 Mesh(網格) = Geometry(幾何體) + Material(材質):
並開始認識 Three.js 裡不同的幾何形狀。


上一篇
Day 5 - Three.js:正式建立第一個 3D 世界
系列文
從 Web 到宇宙:Three.js × WebGL 互動式太陽系與光影實作6
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言