Unity3D遊戲開發初探—2.初步瞭解3D模型基礎

1、什麼是3D模型?

 1.1 3D模型概述

  簡而言之,3D模型就是三維的立體的模型,D是英文Dimensions的縮寫。html

  3D模型也能夠說是用3Ds MAX建造的立體模型,包括各類建築、人物、植被、機械等等,好比一個大樓的3D模型圖。3D模型也包括玩具和電腦模型領域。程序員

  互聯網的形態一直以來都是2D模式的,可是隨着3D技術的不斷進步,在將來的時間裏,將會有愈來愈多的互聯網應用以3D的方式呈現給用戶,包括網絡視訊、電子閱讀、網絡遊戲、虛擬社區、電子商務、遠程教育等等。甚至對於旅遊業,3D互聯網也可以起到推進的做用,一些世界名勝、雕塑、古董將在互聯網上以3D的形式來讓用戶體驗,這種體驗的真實震撼程度要遠超如今的2D環境。web

 1.2 如何構建3D模型

3D模型的構建主要有三種:
  ① 人工軟件構建3D模型:此種方式要求操做人員要具備豐富的專業知識,熟練使用建模軟件,並且操做複雜,週期較長,同時最終構件的3D模型真實感不強;
  ② 三維掃描儀構建3D模型:此種方式須要價格昂貴的三維掃描儀等硬件設備。而且,三維掃描儀現今只能得到物體的位置信息,對於物體表面的紋理特徵多數仍然須要輔助大量的手工工做才能完成。整個過程成本高,週期長;
  ③ 基於圖像構建3D模型:此種方式只須要提供一組物體不一樣角度的序列照片在計算機輔助下便可自動生成物體的3D模型。操做簡單,自動化程度高,成本低,真實感強。

2、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軸。右、上、背向觀衆的三個方向爲正方向。也許這麼闡述你們仍是不明白,但不要緊,咱們先來看看空間幾何常見的座標系類型。ide

  ①空間直角座標系學習

  以空間一點O爲原點,創建三條兩兩垂直的數軸;x軸(橫軸),y軸(縱軸),z軸(豎軸),這時創建了空間直角座標系Oxyz,其中點O叫作座標原點,三條軸統稱爲座標軸,由座標軸肯定的平面叫座標平面this

  各軸之間的順序要求符合右手法則,即以右手握住Z軸,讓右手的四指從X軸的正向以90度的直角轉向Y軸的正向,這時大拇指所指的方向就是Z軸的正向。這樣的三個座標軸構成的座標系稱爲右手空間直角座標系。與之相對應的是左手空間直角座標系。url

  通常在數學中更經常使用右手空間直角座標系,在其餘學科方面因應用方便而異。三條座標軸中的任意兩條均可以肯定一個平面,稱爲座標面。它們是:由X軸及Y軸所肯定的XOY平面;由Y軸及Z軸所肯定的YOZ平面;由X軸及Z軸所肯定的XOZ平面。spa

  這三個相互垂直的座標面把空間分紅八個部分,每一部分稱爲一個卦限。位於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便可獲得要發射的具體方向的向量(至關於告訴小球朝哪一個目標方向發射!)。

3、先學走再學飛—第二個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     }
View Code

  (3)點擊預覽按鈕:按鍵盤Up鍵,Cube會朝前移動;按Down鍵,Cube會日後移動;

  

4、案例深刻:地球圍繞太陽轉

  有了以上的基本的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 }
View Code

PS:使用RotateAround()方法,讓地球始終圍繞着太陽在Y軸方向旋轉。參數1表示圍繞旋轉參照點的位置(太陽的位置),參數2表示圍繞旋轉的角度,Vector3.up就是表示Y軸旋轉,參數3表示一次旋轉的速度(long類型,越大則越快)。

  (5)腳本寫好以後,將該腳本拖動到Earth上進行綁定。最後,點擊預覽按鈕,便可看到地球圍繞太陽轉的效果了。

  

5、小結

  本篇主要介紹了遊戲開發中的一些3D模型基礎,涉及到一點中學的空間幾何知識,複習一下對後續學習會有好處。後面會探索一下物理引擎和GUI,但也只是初步的。最後,仍然感謝一下參考文獻的做者,站在大家的肩膀上我能看的更遠,謝謝!

參考文獻與資料

  (1)3D模型百度百科:http://baike.baidu.com/link?url=dFgpG-8l3EFNqybYgkRSe-0fWd3oye2jcKYqMYHV8mfXRYlIJYM0-nsNkeKJMq0Rtgzc5IR6ZDbNl0SrZYxSNK

  (2)泡泡堂,《左手座標系和右手座標系》:http://www.cnblogs.com/mythou/p/3327046.html

(5)傳智播客Unity3D公開課: http://net.itcast.cn/subject/Unity3D/index.html

附件

  (1)地球貼圖: http://pan.baidu.com/s/1c069Vvq

 

相關文章
相關標籤/搜索