一、什么是3D模型?
1.1 3D模型概述
簡而言之,3D模型就是三維的、立體的模型,D是英文Dimensions的縮寫。
3D模型也可以說是用3Ds MAX建造的立體模型,包括各種建築、人物、植被、機械等等,比如一個大樓的3D模型圖。3D模型也包括玩具和電腦模型領域。
互聯網的形態一直以來都是2D模式的,但是隨着3D技術的不斷進步,在未來的時間里,將會有越來越多的互聯網應用以3D的方式呈現給用戶,包括網絡視訊、電子閱讀、網絡游戲、虛擬社區、電子商務、遠程教育等等。甚至對於旅游業,3D互聯網也能夠起到推動的作用,一些世界名勝、雕塑、古董將在互聯網上以3D的形式來讓用戶體驗,這種體驗的真實震撼程度要遠超現在的2D環境。
1.2 如何構建3D模型
二、Unity中的3D模型基礎
2.1 認識游戲對象
(1)相信大家經過前一篇博客《Unity3D游戲開發初探—1.跨平台的游戲引擎讓.NET程序員新生》初步認識Unity3D之后,對於Hierarchy中的游戲對象有了初步認識了吧。Hierarchy中顯示的是GameObject—游戲對象,每個游戲都至少有一個Camera,點擊Camera就可以在Preview(預覽視圖)中看到攝像機的視角畫面。
(2)每個GameObject都有三組屬性:Position(位置)、Rotation(旋轉、角度)與Scale(縮放大小)三組屬性。Position控制游戲對象在三維空間中的坐標,Rotation控制游戲對象顯示的角度,而Scale則控制游戲對象縮放的比例。
2.2 認識左手坐標系
Unity3D采用的是左手坐標系:沿屏幕橫向為x軸,沿屏幕縱向為y軸,垂直屏幕方向為z軸。右、上、背向觀眾的三個方向為正方向。也許這么闡述大家還是不明白,但沒關系,我們先來看看空間幾何常見的坐標系類型。
①空間直角坐標系
以空間一點O為原點,建立三條兩兩垂直的數軸;x軸(橫軸),y軸(縱軸),z軸(豎軸),這時建立了空間直角坐標系Oxyz,其中點O叫做坐標原點,三條軸統稱為坐標軸,由坐標軸確定的平面叫坐標平面。
各軸之間的順序要求符合右手法則,即以右手握住Z軸,讓右手的四指從X軸的正向以90度的直角轉向Y軸的正向,這時大拇指所指的方向就是Z軸的正向。這樣的三個坐標軸構成的坐標系稱為右手空間直角坐標系。與之相對應的是左手空間直角坐標系。
一般在數學中更常用右手空間直角坐標系,在其他學科方面因應用方便而異。三條坐標軸中的任意兩條都可以確定一個平面,稱為坐標面。它們是:由X軸及Y軸所確定的XOY平面;由Y軸及Z軸所確定的YOZ平面;由X軸及Z軸所確定的XOZ平面。
這三個相互垂直的坐標面把空間分成八個部分,每一部分稱為一個卦限。位於X,Y,Z軸的正半軸的卦限稱為第一卦限,從第一卦限開始,在XOY平面上方的卦限,按逆時針方向依次稱為第二,三,四卦限;第一,二,三,四卦限下方的卦限依次稱為第五,六,七,八卦限。
②右手坐標系
右手坐標系在中學學空間幾何的時候經常會用到。在三維坐標系中,Z軸的正軸方向是根據右手定則確定的。右手定則也決定三維空間中任一坐標軸的正旋轉方向。要標注X、Y和Z軸的正軸方向,就將右手背對着屏幕放置,拇指即指向X軸的正方向。伸出食指和中指,如下圖所示,食指指向Y軸的正方向,中指所指示的方向即是Z軸的正方向。要確定軸的正旋轉方向,如下圖所示,用右手的大拇指指向軸的正方向,彎曲手指。那么手指所指示的方向即是軸的正旋轉方向。
③左手坐標系
伸出左手,讓拇指和食指成“L”形,大拇指向右,食指向上。其余的手指指向前方。如下圖所示,這樣就建立了一個左手坐標系。拇指、食指和其余手指分別代表x,y,z軸的正方向。判斷方法:在空間直角坐標系中,讓左手拇指指向x軸的正方向,食指指向y軸的正方向,如果中指能指向z軸的正方向,則稱這個坐標系為左手直角坐標系.反之則是右手直角坐標系。
④左手坐標系與右手坐標系的比較
左手坐標系是X軸向右,Y軸向上,Z軸向前,右手坐標系的Z軸正好相反,是指向“自己”的,在計算機中通常使用的是左手坐標系,而數學中則通常使用右手坐標系。計算機里面其實很多也有用右手坐標系,這個只是根據實際應用不同,沒有說哪個比較好。
現在,相信大家至少對於左手坐標系有了一個比較形象的了解了,那么這里介紹的目的也就達到了。(貼圖好麻煩的,么么嗒)
2.3 認識Vector3
如果大家有心的話,會發現我們在第一篇博客里邊寫的代碼里引用了一個Vector3的類,那么這個類是干啥用的呢?我們現在來初步了解一下。
Vector3是Unity中定義的一個含有x、y、z三個字段的類,可以表示位置點,也可以表示一個向量。
Vector3乘以數值表示對向量的三個值乘以相應的值,假設v1,v2是兩個向量,則v1-v2表示從v2指向v1的向量,如下圖所示。擴展:后面我們在做打箱子游戲的時候,當一個小球向指定區域發射時,就是一個向量減法的典型應用。已知小球在攝像機位置(即是一個攝像頭所在的向量,假設其為v2),以及鼠標所指向的位置坐標后(即為目標地向量,假設其為v1),通過v1-v2即可得到要發射的具體方向的向量(相當於告訴小球朝哪個目標方向發射!)。
三、先學走再學飛—第二個Unity3D程序
在第一篇博客中的HelloCube程序中,我們讓Cube實現了翻轉。這次,我們讓Cube實現前后移動,讓游戲對象學會“走路”這項技能。
(1)在Hierarchy中Create一個Cube(立方體),並且加入一個Direction Light(平行光);之后,將Cube的Position屬性設置為(0,0,-4),這樣鏡頭會近一點;將Cube的Scale屬性設置為(1,1,1),這樣Cube會放大一點;
(2)在Project中新增一個C# Script,隨便取個名字,這里取名為:CubeController。雙擊該腳本,在Update方法中輸入以下代碼:

1 using UnityEngine; 2 using System.Collections; 3 4 public class CubeController : MonoBehaviour { 5 6 // Use this for initialization 7 void Start () { 8 9 } 10 11 // Update is called once per frame 12 void Update () { 13 if(Input.GetKey(KeyCode.UpArrow)) 14 { 15 transform.Translate(Vector3.forward*0.2f); 16 } 17 18 if(Input.GetKey(KeyCode.DownArrow)) 19 { 20 transform.Translate(Vector3.back*0.2f); 21 } 22 }
(3)點擊預覽按鈕:按鍵盤Up鍵,Cube會朝前移動;按Down鍵,Cube會往后移動;
四、案例深入:地球圍繞太陽轉
有了以上的基本的3D理論基礎之后,我們再來做一個Unity3D小案例:地球圍繞太陽轉。所謂地球圍繞太陽轉,指的是指地球繞太陽做周期性轉動。(如果你要問為什么地球圍繞太陽轉,請問哥白尼先生和牛頓童鞋)
(1)首先Create以下游戲對象:兩個Sphere,一個Direction Light;並將其中一個Sphere命名為Earth,另一個Sphere命名為Sun;設置Sun的Scale為(3,3,3),讓太陽這個大球體顯得大一點;而將Earth的Position設置為(5,0,0),讓Earth顯示在太陽的右邊;
(2)為了讓太陽更像太陽一點,我們在Project中Create一個Material(材質,所謂材質就是修飾游戲對象的),命名為SunMaterial,這里主要是為太陽增加一個顏色。
選中SunMaterial,雙擊Main Color,彈出顏色選擇器,在顏色選擇器中選則一個深黃色的區域。
(3)為了讓地球更像地球一點,這里我們為地球增加一個背景圖片—地球貼圖。(可以從網上搜索一下,也可以從本文底部給出的URL下載)下載完成之后,將地球貼圖拖動到項目中,最后將貼圖拖動到Earth對象上。最后效果如下圖所示。
(4)新增一個C# Script,命名為EarthControl。雙擊該腳本文件,在編輯器中寫入以下代碼。這里要注意,常用的游戲對象一般設置為全局變量,並且在Start方法中進行初始化(這里是通過GameObject的Find靜態方法獲取,你可以理解為JavaScript的Dom操作GetElementById("Earth"))。游戲對象的transform組件用於控制物體的位置,旋轉和縮放。

1 using UnityEngine; 2 using System.Collections; 3 4 public class EarthControl : MonoBehaviour 5 { 6 // 定義游戲對象 7 public GameObject earth; 8 public GameObject sun; 9 10 // Use this for initialization 11 void Start() 12 { 13 // 啟動時獲取游戲對象 14 earth = GameObject.Find("Earth"); 15 sun = GameObject.Find("Sun"); 16 } 17 18 // Update is called once per frame 19 void Update() 20 { 21 // 使地球對象圍繞着太陽旋轉 22 earth.transform.RotateAround(sun.transform.position, Vector3.up, 0.3f); 23 } 24 }
PS:使用RotateAround()方法,讓地球始終圍繞着太陽在Y軸方向旋轉。參數1表示圍繞旋轉參照點的位置(太陽的位置),參數2表示圍繞旋轉的角度,Vector3.up就是表示Y軸旋轉,參數3表示一次旋轉的速度(long類型,越大則越快)。
(5)腳本寫好之后,將該腳本拖動到Earth上進行綁定。最后,點擊預覽按鈕,即可看到地球圍繞太陽轉的效果了。
五、小結
本篇主要介紹了游戲開發中的一些3D模型基礎,涉及到一點中學的空間幾何知識,復習一下對后續學習會有好處。后面會探索一下物理引擎和GUI,但也只是初步的。最后,仍然感謝一下參考文獻的作者,站在你們的肩膀上我能看的更遠,謝謝!
參考文獻與資料
(2)泡泡堂,《左手坐標系和右手坐標系》:http://www.cnblogs.com/mythou/p/3327046.html
附件