WEBVTT

1
00:00:00.700 --> 00:00:04.755
看到一個可以旋轉、點擊、探索的島嶼網站，

2
00:00:04.975 --> 00:00:08.614
我們很容易先問：這是用什麼三維技術做的？

3
00:00:08.834 --> 00:00:13.227
但要真正做出同一類作品，需要理解三個層次。

4
00:00:14.447 --> 00:00:20.173
底層是內容與證據，中層是互動規則，最上層才是三維畫面
。

5
00:00:20.393 --> 00:00:23.843
這堂課會用一個完全虛構的城市學習島，

6
00:00:24.063 --> 00:00:27.041
帶設計師與前端工程師共同規劃。

7
00:00:28.261 --> 00:00:30.425
最後你們應該能說清楚：

8
00:00:30.645 --> 00:00:35.511
誰來使用網站、資料怎麼整理、點擊如何找到內容，

9
00:00:35.731 --> 00:00:38.402
以及怎麼做出第一個可測試的版本。

10
00:00:39.622 --> 00:00:43.974
我們研究的參考網站，從公開程式碼可以確認，

11
00:00:44.194 --> 00:00:47.903
它使用原生 JavaScript 模組、Three.

12
00:00:48.123 --> 00:00:52.567
js、透視相機、軌道控制器與點選偵測。

13
00:00:52.787 --> 00:00:55.459
建物可以由程式組合幾何形狀，

14
00:00:56.679 --> 00:00:58.804
政策資料則由 JSON 驅動。

15
00:00:59.024 --> 00:01:03.843
我們沒有確認它使用 React、Vue、後台內容管理
系統，

16
00:01:04.063 --> 00:01:06.480
或任何特定的人工智慧工具。

17
00:01:07.700 --> 00:01:10.869
這次也沒有完成原站實際渲染驗證，

18
00:01:11.089 --> 00:01:14.415
所以接下來看到的圖形都是教學示意，

19
00:01:14.635 --> 00:01:16.808
不是假裝錄到原站的操作。

20
00:01:17.028 --> 00:01:21.078
確認過的事實與我們提出的做法，要始終分開。

21
00:01:22.298 --> 00:01:26.440
第一份產出不是三維模型，而是一頁網站計畫。

22
00:01:26.660 --> 00:01:28.503
先列出使用者與任務。

23
00:01:28.723 --> 00:01:31.784
例如探索者想知道有哪些公共議題，

24
00:01:32.004 --> 00:01:35.660
研究者則想快速找到某一筆資訊與出處。

25
00:01:36.880 --> 00:01:40.890
前者適合島嶼探索，後者需要搜尋與清單；

26
00:01:41.110 --> 00:01:44.500
不要逼每個人都旋轉城市才能讀內容。

27
00:01:44.720 --> 00:01:46.284
接著決定資訊架構：

28
00:01:46.504 --> 00:01:52.648
首頁介紹、主題入口、項目摘要、完整說明、來源與更新日
期。

29
00:01:52.868 --> 00:01:57.447
每個畫面都要回答一個問題：使用者下一步能做什麼？

30
00:01:58.667 --> 00:02:02.286
驗收也不要只寫漂亮，要寫可測試的任務，

31
00:02:02.506 --> 00:02:07.952
例如第一次使用的人能否找到公共空間主題，開啟一項計畫
，

32
00:02:08.172 --> 00:02:09.479
並追溯到來源。

33
00:02:09.699 --> 00:02:12.661
成功率與花費時間，由實測決定。

34
00:02:13.881 --> 00:02:17.539
把政策內容做成互動，關鍵是資料結構。

35
00:02:17.759 --> 00:02:24.060
本課的 starter 有三個主題、六個提案、三條關
係與三份虛構來源。

36
00:02:24.280 --> 00:02:27.875
content 點 JSON 保存主題、項目、關係、

37
00:02:28.095 --> 00:02:30.927
來源、有效日期與編輯溯源；

38
00:02:32.147 --> 00:02:35.079
layout 點 JSON 另外保存座標與顏色。

39
00:02:35.299 --> 00:02:38.332
標題可以修改，識別碼不能任意改。

40
00:02:38.552 --> 00:02:42.611
畫面建築只是一種視覺表示，不等於真實建築。

41
00:02:42.831 --> 00:02:46.875
來源用 ID 引用，不要四處複製同一段文字。

42
00:02:48.095 --> 00:02:53.673
像步行導覽線這筆資料，可以同時產生清單、卡片和建物。

43
00:02:53.893 --> 00:02:59.445
座標不寫進政策事實，未來更換場景時，內容就不用重做。

44
00:02:59.665 --> 00:03:01.669
注意畫面只是欄位節錄，

45
00:03:01.889 --> 00:03:04.596
完整可執行資料請看 starter。

46
00:03:05.816 --> 00:03:10.332
當你畫出一條線，甚至讓人流或光點沿著線移動，

47
00:03:10.552 --> 00:03:14.173
使用者可能以為這是經過證實的影響關係。

48
00:03:14.393 --> 00:03:18.729
因此，關係也必須是資料，不能只是美術效果。

49
00:03:18.949 --> 00:03:24.325
資料要說明起點、終點、關係類型、證據等級與出處。

50
00:03:24.545 --> 00:03:27.336
參考網站的資料包含證據等級，

51
00:03:28.556 --> 00:03:33.232
並把標示為未確認、不動畫的關係排除在動畫之外。

52
00:03:33.452 --> 00:03:37.066
我們的示範用 evidenceStatus 欄位實作
這個原則：

53
00:03:37.286 --> 00:03:39.836
兩條 supported 關係可以畫線，

54
00:03:40.056 --> 00:03:43.980
一條 pending 關係不畫線，但保留文字說明。

55
00:03:44.200 --> 00:03:46.350
所有來源都是虛構教材。

56
00:03:47.570 --> 00:03:48.826
沒有資料支持，

57
00:03:49.046 --> 00:03:53.438
就不要把流動速度、流量或成功率演成真實統計。

58
00:03:53.658 --> 00:03:57.424
示意動畫要標示為示意，模擬要交代假設。

59
00:03:57.644 --> 00:04:02.570
即使兩個項目同時發生，也不代表其中一個造成另一個。

60
00:04:02.790 --> 00:04:08.051
來源卡必須能指出文件、日期，以及支持的是哪一句主張。

61
00:04:09.271 --> 00:04:12.994
開始做三維時，先不要追求完整城市。

62
00:04:13.214 --> 00:04:16.453
先做一個島、一種建物、一張卡片。

63
00:04:16.673 --> 00:04:20.372
Three.js 負責場景、相機與渲染器；

64
00:04:20.592 --> 00:04:22.913
控制器處理旋轉和縮放；

65
00:04:24.133 --> 00:04:28.873
幾何工廠把方塊、圓柱與屋頂組成可重用的模型。

66
00:04:29.093 --> 00:04:33.562
資料只要指定模型類型與位置，就能建立場景物件。

67
00:04:33.782 --> 00:04:37.784
像樹木、窗戶或路燈這種大量重複物件，

68
00:04:38.004 --> 00:04:39.882
可以考慮實例化繪製，

69
00:04:40.102 --> 00:04:43.405
但不能以為用了實例化就不用測試效能。

70
00:04:44.625 --> 00:04:47.970
裝飾、內容物件與互動標記要分層，

71
00:04:48.190 --> 00:04:50.593
避免使用者點到不重要的葉子。

72
00:04:50.813 --> 00:04:54.204
水面和天空的著色器可以最後再加。

73
00:04:54.424 --> 00:04:58.734
先確保內容可讀、操作正確，再追求氛圍。

74
00:04:59.954 --> 00:05:02.602
點擊不是直接把模型變成文章。

75
00:05:02.822 --> 00:05:06.438
通常是先把指標位置轉成場景中的射線，

76
00:05:06.658 --> 00:05:09.339
由 Raycaster 找到交會的物件。

77
00:05:09.559 --> 00:05:13.628
物件保存項目 ID，再利用 ID 查詢資料，

78
00:05:14.848 --> 00:05:19.976
更新選取狀態，最後讓卡片和場景同時反映這個狀態。

79
00:05:20.196 --> 00:05:25.448
這個流程的重點，是資料、狀態與畫面各自負責一件事。

80
00:05:25.668 --> 00:05:27.701
如果模型有多層子物件，

81
00:05:27.921 --> 00:05:31.260
要確保命中的子物件能找到所屬項目，

82
00:05:31.480 --> 00:05:34.427
不能假設每個三角形都有 ID。

83
00:05:35.647 --> 00:05:38.716
搜尋清單也呼叫同一個選取函式。

84
00:05:38.936 --> 00:05:42.729
這樣即使使用者不用滑鼠、不看三維畫面，

85
00:05:42.949 --> 00:05:45.116
仍然可以開啟相同內容。

86
00:05:45.336 --> 00:05:50.497
關閉卡片、清除選取與返回上一個結果，也要明確設計。

87
00:05:51.717 --> 00:05:54.719
實作時先安裝 Node 二十二版以上，

88
00:05:54.939 --> 00:05:56.566
進入 starter 目錄，

89
00:05:56.786 --> 00:06:00.578
依序執行 npm ci 加上 ignore scri

90
00:06:00.798 --> 00:06:05.619
pts 選項、npm test、npm run ch
eck，

91
00:06:05.839 --> 00:06:07.608
最後 npm start。

92
00:06:07.828 --> 00:06:12.025
開啟伺服器啟動時設定的本機 HTTP 網址，

93
00:06:12.245 --> 00:06:16.065
預設是四一七三連接埠，不能直接雙擊檔案。

94
00:06:17.285 --> 00:06:20.889
教材鎖定 Three.js 零點一八六點一，

95
00:06:21.109 --> 00:06:23.523
與原站觀察的一六零版不同。

96
00:06:23.743 --> 00:06:26.830
這不是 React 專案，也沒有 build 步驟。

97
00:06:27.050 --> 00:06:28.941
第一步修改 content 與 layout，

98
00:06:29.161 --> 00:06:30.255
跑資料驗證。

99
00:06:30.475 --> 00:06:35.668
第二步在 app 與 model 做清單、搜尋、日期
和共同狀態。

100
00:06:36.888 --> 00:06:41.085
第三步在 scene 建三島六棟，接上點擊與高亮。

101
00:06:41.305 --> 00:06:44.124
第四步加入兩條有來源的關係線，

102
00:06:44.344 --> 00:06:46.894
以及一條不畫線的待確認說明。

103
00:06:47.114 --> 00:06:50.103
先跑通內容閉環，再增加美術。

104
00:06:50.323 --> 00:06:54.253
工作副本已通過十項測試、四份語法檢查；

105
00:06:54.473 --> 00:07:01.160
本次也用實際瀏覽器核對三維點選、拖曳、搜尋、日期與鍵
盤操作。

106
00:07:01.380 --> 00:07:04.122
真實觸控與完整效能仍待驗收。

107
00:07:05.342 --> 00:07:09.042
三維網站最常見的問題，不是模型不夠細，

108
00:07:09.262 --> 00:07:13.439
而是手機操作困難、文字太小、載入太久。

109
00:07:13.659 --> 00:07:17.239
設計時就要保留二維清單與文字詳情，

110
00:07:17.459 --> 00:07:20.564
支援鍵盤焦點、可理解的按鈕名稱，

111
00:07:20.784 --> 00:07:23.056
以及減少動態效果的偏好。

112
00:07:23.276 --> 00:07:25.741
重要狀態不能只用顏色表示。

113
00:07:25.961 --> 00:07:30.376
行動裝置可以降低像素比、減少陰影與裝飾密度，

114
00:07:31.596 --> 00:07:33.234
並依實際測試調整。

115
00:07:33.454 --> 00:07:37.421
不要為了漂亮開場讓使用者長時間無法閱讀。

116
00:07:37.641 --> 00:07:42.993
效能測量至少包含首次可操作的時間、互動時的幀時間，

117
00:07:43.213 --> 00:07:46.186
以及重複開關內容後的記憶體變化。

118
00:07:46.406 --> 00:07:49.169
測試案例包括搜尋典藏剩一筆，

119
00:07:49.389 --> 00:07:52.913
日期二零二四年十二月三十一日剩兩筆，

120
00:07:53.133 --> 00:07:54.913
二零二三年底剩零筆。

121
00:07:56.133 --> 00:08:00.016
日期只是有效區間篩選，不是歷史狀態回放。

122
00:08:00.236 --> 00:08:03.770
三維載入失敗時，內容清單仍應可用。

123
00:08:03.990 --> 00:08:09.933
請再用真實瀏覽器驗收三百七十五像素寬度、兩倍縮放、鍵

124
00:08:10.153 --> 00:08:12.736
盤、觸控與停用 WebGL。

125
00:08:12.956 --> 00:08:16.659
CSS2D 標籤有百分之百縮放限制，

126
00:08:16.879 --> 00:08:18.975
文字清單仍是可靠替代。

127
00:08:19.195 --> 00:08:23.375
不能把射線數學測試，當成真實點擊已經驗證。

128
00:08:24.595 --> 00:08:27.622
最後，網站不是發布一次就結束。

129
00:08:27.842 --> 00:08:29.405
建立內容欄位規範，

130
00:08:29.625 --> 00:08:35.165
讓編輯知道摘要長度、狀態定義、來源要求與誰負責審核。

131
00:08:35.385 --> 00:08:36.532
正式發布前，

132
00:08:37.752 --> 00:08:43.374
自動檢查重複 ID、找不到的引用、非法狀態與缺少的日
期。

133
00:08:43.594 --> 00:08:48.818
人工審核則確認文字是否準確、來源是否真的支持主張，

134
00:08:49.038 --> 00:08:51.262
以及圖像有沒有造成誤導。

135
00:08:51.482 --> 00:08:54.257
初期可以使用版本控制中的 JSON，

136
00:08:54.477 --> 00:08:56.440
不一定需要先做後台；

137
00:08:57.660 --> 00:09:02.157
資料量和編輯人數增加後，再評估內容管理系統。

138
00:09:02.377 --> 00:09:07.009
每次發布都保留可追溯版本，讓修正與回復有依據。

139
00:09:07.229 --> 00:09:11.385
政策文字、資料連結和場景表現要一起驗收，

140
00:09:11.605 --> 00:09:14.300
不能只看畫面有沒有正常打開。

141
00:09:15.520 --> 00:09:20.166
接下來請設計師與前端一起完成五份小型交付物：

142
00:09:20.386 --> 00:09:27.351
一頁網站計畫、一份資料字典、一張點擊到內容的流程圖、
一個三島原型，

143
00:09:27.571 --> 00:09:29.638
以及可測試的驗收清單。

144
00:09:30.858 --> 00:09:36.052
練習時，故意加入一個缺少來源的項目與一條未確認關係，

145
00:09:36.272 --> 00:09:41.207
看看系統能否正確提醒，而不是照樣演出可信的效果。

146
00:09:42.427 --> 00:09:46.648
真正值得學習的，不只是把政策變成漂亮的城市，

147
00:09:46.868 --> 00:09:51.151
而是讓每個視覺元素都能回到清楚的資料與證據。

148
00:09:51.371 --> 00:09:55.297
先把內容和互動做對，再把世界做得精彩。
