3D開發(fā)中涉及到的技術(shù)
-
OpenGL
OpenGL 是用于渲染 2D 、3D 矢量圖形的跨語(yǔ)言捣炬、跨平臺(tái)的應(yīng)用程序編程接口(API)而钞。這個(gè)接口由近350個(gè)不同的函數(shù)調(diào)用組成,用來(lái)繪制從簡(jiǎn)單的圖形比特到復(fù)雜的三維景象扶叉。而另一種程序接口系統(tǒng)是僅用于 Microsoft Windows 上的Direct3D。OpenGL 常用于 CAD 帕膜、虛擬現(xiàn)實(shí)枣氧、科學(xué)可視化程序和電子游戲開發(fā)。
-
WebGL
WebGL(全寫 Web Graphics Library )是一種 3D 繪圖協(xié)議垮刹,這種繪圖技術(shù)標(biāo)準(zhǔn)允許把 JavaScript 和 OpenGL ES 2.0 結(jié)合在一起达吞,通過(guò)增加 OpenGL ES 2.0 的一個(gè) JavaScript 綁定,WebGL可以為 HTML5 Canvas 提供硬件 3D 加速渲染危纫,這樣 Web 開發(fā)人員就可以借助系統(tǒng)顯卡來(lái)在瀏覽器里更流暢地展示 3D 場(chǎng)景和模型了宗挥,還能創(chuàng)建復(fù)雜的導(dǎo)航和數(shù)據(jù)視覺(jué)化。顯然种蝶, WebGL 技術(shù)標(biāo)準(zhǔn)免去了開發(fā)網(wǎng)頁(yè)專用渲染插件的麻煩,可被用于創(chuàng)建具有復(fù)雜 3D 結(jié)構(gòu)的網(wǎng)站頁(yè)面瞒大,甚至可以用來(lái)設(shè)計(jì) 3D 網(wǎng)頁(yè)游戲等等螃征。
WebGL 通過(guò) HTML5 的 Canvas 來(lái)和 DOM 打交道。因此也和 OpenGL ES 2.0 一樣透敌,使用 GLSL 作為 Shading Language (一種 C-Like 頂點(diǎn)計(jì)算和著色的語(yǔ)言盯滚,緩存編譯到 GPU,由 GPU 來(lái)執(zhí)行)酗电,由于目前canvas的性能在移動(dòng)端設(shè)備上表現(xiàn)還不理想魄藕,因此性能上會(huì)有不少損耗
OpenGL 和 WebGL 主要是底層圖形接口,一般只負(fù)責(zé)繪制圖形撵术,如果需要實(shí)現(xiàn)一些場(chǎng)景渲染背率,交互,光照,物理檢測(cè)等功能寝姿,就需要基于計(jì)算機(jī)圖形學(xué)實(shí)現(xiàn)大量的代碼交排,因此就出現(xiàn)了很多基于 OpenGL 和 WebGL 實(shí)現(xiàn)的一些 3D 游戲引擎
什么是游戲引擎
游戲引擎是指一些已編寫好的可編輯電腦游戲系統(tǒng)或者一些交互式實(shí)時(shí)圖像應(yīng)用程序的核心組件。這些系統(tǒng)為游戲設(shè)計(jì)者提供各種編寫游戲所需的各種工具饵筑,其目的在于讓游戲設(shè)計(jì)者能容易和快速地做出游戲程式而不用由零開始埃篓。大部分都支持多種操作平臺(tái),如Linux根资、Mac OS X架专、微軟Windows。游戲引擎包含以下系統(tǒng):渲染引擎(即“渲染器”玄帕,含二維圖像引擎和三維圖像引擎)胶征、物理引擎、碰撞檢測(cè)系統(tǒng)桨仿、音效睛低、腳本引擎、電腦動(dòng)畫服傍、人工智能钱雷、網(wǎng)絡(luò)引擎以及場(chǎng)景管理。
目前市場(chǎng)最主流的兩大游戲引擎 Unity 和 Unreal 對(duì)比
Unity Engine
Unity 于2005 年第一次作為一種商業(yè)產(chǎn)品開始銷售吹零。當(dāng)時(shí)罩抗,它與我們大多數(shù)人并沒(méi)有什么特別的關(guān)系……因?yàn)槟鞘钱?dāng)時(shí)的Mac獨(dú)有的產(chǎn)品。但在2007年灿椅,Unity 被帶到了 Windows 平臺(tái)套蒂,并真正開始發(fā)展起來(lái)。第二年茫蛹,蘋果應(yīng)用商店 (Apple App Store) 和隨之而來(lái)的手機(jī)游戲《 淘金熱 》( goldrush ) 問(wèn)世操刀。
Unity 一開始的定位就是:讓游戲開發(fā)更易于上手,并向更廣泛的受眾開放婴洼。毋庸置疑他們是成功的骨坑。隨后,他們還推出了一個(gè)非常成功的廣告平臺(tái) (Unity Ads)柬采,打造了一個(gè)面向 Unity 欢唾,iOS 和 Android 開發(fā)人員的獲利平臺(tái)。
從那以后粉捻,Unity 繼續(xù)添加了許多新功能礁遣,更重要的是,Unity 幾乎可以面向你聽過(guò)的任意一個(gè)平臺(tái)發(fā)布游戲肩刃。最近幾年祟霍,Unity更多地聚焦于提升引擎的性能和渲染技術(shù)杏头,這使 Unity 成為一個(gè)真正的 3A 引擎。DOTS 和可腳本化渲染管道之類的功能極大地提高了視覺(jué)質(zhì)量浅碾。
Unreal
Unreal是UNREAL ENGINE(虛幻引擎)的簡(jiǎn)寫大州,由Epic開發(fā),是世界知名授權(quán)最廣的游戲引擎之一垂谢。
虛幻技術(shù)研究中心在上海成立厦画,該中心由GA國(guó)際游戲教育與虛幻引擎開發(fā)商EPIC的中國(guó)子公司EPIC GAMES CHINA聯(lián)合設(shè)立。
“Unreal Engine 3”3D引擎采用了最新的即時(shí)光跡追蹤滥朱、HDR光照技術(shù)根暑、虛擬位移…等新技術(shù),而且能夠每秒鐘實(shí)時(shí)運(yùn)算兩億個(gè)多邊形運(yùn)算徙邻,效能是“Unreal Engine”的100倍排嫌,而通過(guò)NVIDIA的GeForce 6800顯示卡與“Unreal Engine 3”3D引擎的搭配,可以實(shí)時(shí)運(yùn)算出電影CG等級(jí)的畫面缰犁,效能非常非炒镜兀恐怖。
Unity 和 Unreal 對(duì)比
開發(fā)語(yǔ)言對(duì)比
Unity
在Unity中帅容,曾經(jīng)有幾種支持的腳本語(yǔ)言颇象,C#,Boo(類似Python)并徘,UnityScript(類似 JavaScript/ECMAScript )遣钳。最近幾年 Boo 和 UnityScript 支持都不怎么用了,剩下 C# 作為開發(fā)主要語(yǔ)言。從好的方面來(lái)看,自從 Mono 免費(fèi)以來(lái)玉罐,Unity 現(xiàn)在有了 C# 的當(dāng)前實(shí)現(xiàn),而不是落后于語(yǔ)言開發(fā)近十年倦淀。Unity 目前正在向 DOTS 或面向數(shù)據(jù)的技術(shù)堆棧遷移,這是 C#简肴、ECS 或 Entity Component System 的高性能子集與并行計(jì)算的結(jié)合晃听,側(cè)重于 Jobs 系統(tǒng),有望實(shí)現(xiàn) C++ 級(jí)別的性能砰识。Unity 中的 Build 時(shí)間非常快佣渴。
Unreal
Unreal有兩種主要的編程語(yǔ)言:C++ 和 Blueprints 辫狼。C++ 有一個(gè)完整的垃圾收集系統(tǒng),現(xiàn)在有一個(gè)由 Live++ 支持的實(shí)時(shí)重裝系統(tǒng)辛润,這使得 C++ 很像一種腳本語(yǔ)言膨处。Blueprints 是一個(gè)基于圖形的可視化編程系統(tǒng),它可能是最好的可視化編程選項(xiàng)。它還能夠編譯成 C++ 代碼真椿,從而降低使用它的性能成本鹃答。Unreal 的 build 時(shí)間不算太好
相比Unity使用 c# 進(jìn)行開發(fā),Unreal的 c++ 在開發(fā)方面的上手難度更大,尤其內(nèi)存處理上突硝,稍有不慎就會(huì)引發(fā)大量問(wèn)題测摔,Unreal 在圖形展示上對(duì)比 Unity 效果更好,視覺(jué)更突出解恰,但是同時(shí)對(duì)硬件的要求也更高锋八,對(duì)于移動(dòng)端的性能消耗更大
引擎費(fèi)用
Unity
Unity的授權(quán)是按照席位給的。10個(gè)人的團(tuán)隊(duì)的話护盈,需要購(gòu)買10個(gè)席位挟纱,然后把10個(gè)席位賦予10個(gè)賬號(hào)。所以腐宋,沒(méi)有錯(cuò)紊服,按照你說(shuō)的情況,你需要支付大約14萬(wàn)每年胸竞。一個(gè)團(tuán)隊(duì)所有人都應(yīng)該使用相同的授權(quán)欺嗤,不能有的使用免費(fèi),有的使用Plus撤师,有的使用Pro剂府。免費(fèi)版的使用條件是過(guò)去12個(gè)月的資金或收入小于10萬(wàn)美元。如果是剃盾,就可以使用免費(fèi)版了腺占。另外,如果團(tuán)隊(duì)過(guò)去12個(gè)月的資金或收入小于20萬(wàn)美元痒谴,是允許使用Plus版的衰伯。另外,一般上團(tuán)隊(duì)并不是每個(gè)人都需要使用Unity积蔚,只要按照需要使用的人數(shù)購(gòu)買就可以了意鲸。
Unreal
如果我們開發(fā)的這款游戲總收益低于100萬(wàn)美元,那么Unreal是免費(fèi)使用的尽爆;但是如果我們的游戲收益超過(guò)這個(gè)數(shù)額怎顾,那么將被收取游戲總收益的5%
小結(jié)
綜合對(duì)比下來(lái),Unity 更適合小團(tuán)隊(duì)開發(fā)漱贱,上手快槐雾,對(duì)移動(dòng)端的開發(fā)支持也更多,考慮接下來(lái)的項(xiàng)目規(guī)模幅狮,以及團(tuán)隊(duì)人數(shù)募强,目前針對(duì) Unity 3D 進(jìn)行學(xué)習(xí)株灸,開發(fā)
Unity 3D 開發(fā)
Unity 開發(fā)工具安裝
Unity 版本
在Unity 5.X版本以后,取消了以數(shù)字命名的版本規(guī)則擎值,而采用年份來(lái)表示慌烧。此外,Unity公司宣布了Unity全新的版本發(fā)布計(jì)劃鸠儿,包括技術(shù)前瞻版本(簡(jiǎn)稱:Unity TECH版)和Unity LTS穩(wěn)定支持版本(簡(jiǎn)稱:Unity LTS版)屹蚊。其中,UnityTECH版每年都會(huì)有3個(gè)大版本更新捆交,例如Unity 2017.1.X淑翼、Unity 2017.2.X和Unity 2017.3.X。而Unity LTS版則從Unity TECH版的最后一個(gè)版本開始品追,持續(xù)支持兩年的時(shí)間玄括,例如Unity 2017.4.X。所以實(shí)際開發(fā)項(xiàng)目時(shí)肉瓦,最好使用LTS版遭京。目前最新版本為2021.1.16f1 LTS Release 2017.4.5f1,結(jié)尾以f1表示泞莉,可以在如下鏈接中下載到:https://unity3d.com/cn/unity/qa/lts-releases哪雕。
Unity Editor 系統(tǒng)要求
Unity Editor 安裝
Unity 官方提供了一個(gè)專門的工具用于下載安裝 Unity 的相關(guān)開發(fā)工具,Unity Hub
Unity Hub 是一個(gè)獨(dú)立應(yīng)用程序鲫趁,可簡(jiǎn)化查找斯嚎、下載和管理 Unity 項(xiàng)目和安裝內(nèi)容的方式。此外挨厚,還可以手動(dòng)將已安裝在計(jì)算機(jī)上的 Editor 版本添加到 Hub堡僻。
可將 Hub 用于以下目的:
管理 Unity 帳戶和 Editor 許可證。
創(chuàng)建項(xiàng)目疫剃,將默認(rèn)版本的 Unity Editor 與項(xiàng)目關(guān)聯(lián)钉疫,并管理安裝的多個(gè) Editor 版本。
從 Project 視圖中啟動(dòng)不同版本的 Unity巢价。
在不啟動(dòng) Editor 的情況下管理和選擇項(xiàng)目構(gòu)建目標(biāo)牲阁。
-
同時(shí)運(yùn)行兩個(gè) Unity 版本。
請(qǐng)注意壤躲,為了防止本地沖突和其他奇怪場(chǎng)景城菊,應(yīng)該一次只在一個(gè) Editor 實(shí)例中打開一個(gè)項(xiàng)目。
將組件添加到目前已安裝的 Editor 中碉克。 通過(guò) Unity Hub 下載 Editor 版本時(shí)役电,可以在初始安裝期間或以后的日期查找和添加其他組件(如特定的平臺(tái)支持、Visual Studio棉胀、脫機(jī)文檔和標(biāo)準(zhǔn)資源)法瑟。
使用項(xiàng)目模板來(lái)快速啟動(dòng)常見項(xiàng)目類型的創(chuàng)建過(guò)程。在創(chuàng)建新項(xiàng)目時(shí)唁奢,Unity 的項(xiàng)目模板提供了常用設(shè)置的默認(rèn)值霎挟。項(xiàng)目模板可批量預(yù)設(shè)目標(biāo)游戲類型或視覺(jué)保真度級(jí)別的設(shè)置。
下載地址: https://unity3d.com/get-unity/download?_ga=2.161556027.684064872.1631491406-1616045776.1627375263
下載安裝成功之后打開 Unity Hub
選中安裝麻掸,點(diǎn)擊新建酥夭,就可以根據(jù)自己的需求安裝 Unity Editor 開發(fā)工具了
安裝完成之后,選中項(xiàng)目脊奋,新建熬北,就可以根據(jù)需求創(chuàng)建需要的 3D 項(xiàng)目了
Unity Editor 界面簡(jiǎn)介
如圖所示,是新建的 Unity 3D 項(xiàng)目界面诚隙,項(xiàng)目中的幾個(gè)主要窗口如下:
Project 窗口
Project 窗口顯示與項(xiàng)目相關(guān)的所有文件讶隐,該窗口是在應(yīng)用程序中導(dǎo)航和查找資源以及其他項(xiàng)目文件的主要方法。默認(rèn)情況下久又,啟動(dòng)一個(gè)新項(xiàng)目時(shí)巫延,此窗口將打開。然而地消,如果找不到該窗口或者該窗口已關(guān)閉炉峰,可以通過(guò) Window > General > Project 或者使用鍵盤命令 Ctrl + 9__(macOS 上為 Command + 9__)將其打開
Sence 窗口
Scene 視圖是正在創(chuàng)建的世界的交互式視圖。Scene 視圖可用于選擇和定位景物脉执、角色疼阔、攝像機(jī)、光源和所有其他類型的游戲?qū)ο蟆?/p>
當(dāng)您創(chuàng)建一個(gè)新項(xiàng)目并首次打開時(shí)半夷,Unity 會(huì)打開一個(gè)僅包含一個(gè)攝像機(jī)和一個(gè)光源的示例場(chǎng)景婆廊。
Game 窗口
從應(yīng)用程序中的攝像機(jī)渲染 Game 視圖。該視圖代表最終發(fā)布的應(yīng)用程序玻熙。需要使用一個(gè)或多個(gè)攝像機(jī)來(lái)控制玩家在使用應(yīng)用程序時(shí)看到的內(nèi)容否彩,游戲運(yùn)行的內(nèi)容會(huì)在game 窗口展示
Hierarchy 窗口
Hierarchy 窗口顯示場(chǎng)景中的每個(gè)游戲?qū)ο?/a>,如模型嗦随、攝像機(jī)或預(yù)制件列荔。可以使用 Hierarchy 窗口對(duì)場(chǎng)景中使用的游戲?qū)ο筮M(jìn)行排序和分組枚尼。在 Scene 視圖中添加或移除游戲?qū)ο髸r(shí)贴浙,也會(huì)從 Hierarchy 窗口添加或移除它們。
Hierarchy 窗口還可以包含其他場(chǎng)景署恍,每個(gè)場(chǎng)景都包含自己的游戲?qū)ο?/p>
創(chuàng)建的 3D 項(xiàng)目默認(rèn)會(huì)帶一個(gè) Camera 攝像機(jī)對(duì)象 以及 Light 光照對(duì)象
Inspector 窗口
使用 Inspector 窗口可對(duì) Unity 編輯器中幾乎所有內(nèi)容(包括游戲?qū)ο笃槔!nity 組件、資源盯质、材質(zhì))查看和編輯屬性和設(shè)置袁串,以及查看和編輯編輯器內(nèi)的設(shè)置和首選項(xiàng)概而。
Console 窗口
Console 窗口顯示 Unity 生成的錯(cuò)誤、警告和其他消息囱修。
使用 Debug
類也可以在控制臺(tái)中顯示自己的消息赎瑰。
寫入控制臺(tái)窗口的所有內(nèi)容(由 Unity 或您自己的代碼)也會(huì)寫入到日志文件。
Unity 常用項(xiàng)目工程結(jié)構(gòu)及文件簡(jiǎn)介
在 Project 窗口中破镰,我們一般會(huì)創(chuàng)建如下目錄
Assets
這是 Unity 3D 的主項(xiàng)目目錄餐曼,Unity 的所有項(xiàng)目文件都存放在這個(gè)目錄下
Editor
Editor 是編輯器類存放文件夾, Unity 提供了大量的 Api 來(lái)幫助開發(fā)人員自定義開發(fā)編輯器,可以在現(xiàn)有開發(fā)工具基礎(chǔ)上自定義大量的編輯器功能鲜漩,實(shí)現(xiàn)自定義工具欄源譬,窗口,編輯器按鈕等復(fù)雜功能
如圖代碼所示孕似,我們自定義一個(gè) 菜單欄 menu踩娘,在 Editor 目錄下創(chuàng)建一個(gè) TestMenu.cs 文件, 只需在代碼中配置注解
MenuItem("MyTools/Tool21", false,1)]
完成代碼后 Ctrl + S 保存鳞青,此時(shí)編譯完成后霸饲,Unity Editor 的菜單欄就會(huì)多出我們自定義的 菜單,點(diǎn)擊會(huì)執(zhí)行我們添加注解的方法的內(nèi)容
ExternalLibraries
大型完善的外部庫(kù)文件存放目錄臂拓,如NGUI等擁有完善的目錄結(jié)構(gòu)和大量代碼的插件厚脉,就存放在此目錄。有些人喜歡把NGUI目錄直接存放在plugins目錄下其實(shí)是不太好的胶惰,因?yàn)閜lugins文件夾也是要參與編譯的傻工。
GameAssets
游戲美術(shù)資源存目錄
Models
模型文件夾,如圖孵滞,一般存放的是一些由美術(shù)人員通過(guò) maya 中捆,3d max, blender等 3d 建模工具制作的物體原始模型坊饶。
Materials
材質(zhì)球目錄泄伪,要在 Unity 中繪制某物,您必須提供描述其形狀的信息以及描述其表面外觀的信息匿级。
這些信息使用網(wǎng)格描述其形狀蟋滴,如圖
使用 texture 紋理描述其圖形表面外觀
組合起來(lái)就形成了材質(zhì)球
Textures
貼圖文件目錄
通常情況下,對(duì)象的網(wǎng)格幾何形狀僅給出粗略的近似形狀痘绎,而大多數(shù)精細(xì)的細(xì)節(jié)由紋理提供津函。紋理就是應(yīng)用于網(wǎng)格表面上的標(biāo)準(zhǔn)位圖圖像。您可以看作紋理圖像好像是打印在橡膠板上孤页,然后將橡膠板拉伸并固定在網(wǎng)格上的適當(dāng)位置尔苦。紋理的定位是通過(guò)用于創(chuàng)建網(wǎng)格的 3D 建模軟件完成的。
如圖,我們給圓柱體添加了樹皮紋理
Animations
用來(lái)存放動(dòng)畫文件
Unity 有一個(gè)豐富而復(fù)雜的動(dòng)畫系統(tǒng)(有時(shí)稱為“Mecanim”)允坚。該系統(tǒng)具有以下功能:
- 為 Unity 的所有元素(包括對(duì)象魂那、角色和屬性)提供簡(jiǎn)單工作流程和動(dòng)畫設(shè)置。
- 支持導(dǎo)入的動(dòng)畫剪輯以及 Unity 內(nèi)創(chuàng)建的動(dòng)畫
- 人形動(dòng)畫重定向 - 能夠?qū)?dòng)畫從一個(gè)角色模型應(yīng)用到另一角色模型屋讶。
- 對(duì)齊動(dòng)畫剪輯的簡(jiǎn)化工作流程冰寻。
- 方便預(yù)覽動(dòng)畫剪輯以及它們之間的過(guò)渡和交互。因此皿渗,動(dòng)畫師與工程師之間的工作更加獨(dú)立,使動(dòng)畫師能夠在掛入游戲代碼之前為動(dòng)畫構(gòu)建原型并進(jìn)行預(yù)覽轻腺。
- 提供可視化編程工具來(lái)管理動(dòng)畫之間的復(fù)雜交互乐疆。
- 以不同邏輯對(duì)不同身體部位進(jìn)行動(dòng)畫化。
- 分層和遮罩功能
Prefabs
預(yù)制體目錄
Unity 的預(yù)制件系統(tǒng)允許創(chuàng)建贬养、配置和存儲(chǔ)游戲?qū)ο蠹捌渌薪M件挤土、屬性值和子游戲?qū)ο笞鳛榭芍赜觅Y源。
通俗點(diǎn)講就是 Unity 配置好屬性的一些模型模板误算,比如山體仰美,植物,人物儿礼,等等咖杂,prefab 文件可以直接拖拽到場(chǎng)景中進(jìn)行使用
Sounds
聲音文件,用來(lái)存放 Audio 等音頻文件
UI
存放一些UI文件蚊夫,如Atlas等诉字, Altas 類似 css 里的 css sprite ,將多張圖片合并到一張圖上知纷,由于單張圖片會(huì)觸發(fā)一次 cpu drawcall 指令壤圃,圖片過(guò)多會(huì)多次觸發(fā),導(dǎo)致性能問(wèn)題琅轧,合并多張圖片到單張圖集后伍绳,只會(huì)觸發(fā)一次 drawcall 指令
Plugins
dll和一些純代碼插件,用來(lái)擴(kuò)展 Unity Editor
Resources
所有需要通過(guò)Resource.Load加載的資源都存放于此
Scenes
游戲場(chǎng)景的存放目錄
Scripts
游戲腳本文件存放位置
StreamingAssets
在Unity工程中乍桂, 放在StreamingAssets文件夾中的任何資源都將被原樣復(fù)制到目標(biāo)設(shè)備上的一個(gè)特定文件夾中冲杀。在任何平臺(tái)中總可以統(tǒng)一使用Application.streamingAssetsPath 屬性來(lái)獲得這一文件夾路徑。
Unity 中常用功能及相關(guān)概念簡(jiǎn)介
Unity 三維數(shù)學(xué)
由于 Unity 3D 是在三維空間中模蜡,因此我們需要對(duì)一些三維數(shù)學(xué)知識(shí)有一定的了解漠趁,其中最重要的概念之一就是向量
向量概念
- 向量的數(shù)學(xué)定義
向量就是一個(gè)數(shù)字列表,對(duì)于程序員來(lái)說(shuō)一個(gè)向量就是一個(gè)數(shù)組忍疾。
向量的維度就是向量包含的“數(shù)”的數(shù)目闯传,向量可以有任意正數(shù)維,標(biāo)量可以被認(rèn)為是一維向量卤妒。
書寫向量時(shí)甥绿,用方括號(hào)將一列數(shù)括起來(lái)字币,如[1,2,3] 水平書寫的向量叫行向量 垂直書寫的向量叫做列向量
- 向量的幾何意義
幾何意義上說(shuō),向量是有大小和方向的有向線段共缕。向量的大小就是向量的長(zhǎng)度(模)向量有非負(fù)的長(zhǎng)度洗出。
向量的方向描述了空間中向量的指向。
向量的形式:向量定義的兩大要素——大小和方向图谷,有時(shí)候需要引用向量的頭和尾翩活,下圖所示,箭頭是向量的末端便贵,箭尾是向量的開始
向量加減
兩個(gè)向量的維數(shù)相同菠镇,那么它們能相加,或者相減承璃。結(jié)果向量的維數(shù)與原向量相同利耍。向量加減法的記發(fā)和標(biāo)量加減法的記法相同。例如:[x,y,z] + [a,b,c] = [x+a,y+b,z+c]
減法解釋為加負(fù)向量盔粹,a-b=a+(-b) 例如: [x,y,z] – [a,b,c] = [x-a,y-b,c-z]
向量不能與標(biāo)量或維數(shù)不同的向量相加減隘梨。
和標(biāo)量加法一樣,向量加法滿足交換律舷嗡,但向量減法不滿足交換律轴猎,永遠(yuǎn)有a+b = b+a,但a-b=-(b-a),僅當(dāng)a=b時(shí),a-b = b-a
幾何解釋:向量a和向量b相加的幾何解釋為:平移向量咬崔,使向量a的頭連接向量b的尾税稼,接著從a的尾向b的頭畫一個(gè)向量。這就是向量加法的“三角形法則”垮斯。
應(yīng)用場(chǎng)景: 用于三維空間中郎仆,兩個(gè)物體之間的距離計(jì)算
向量點(diǎn)乘
向量點(diǎn)乘,又稱"點(diǎn)積","數(shù)量積”,"內(nèi)積"
從幾何角度看兜蠕,點(diǎn)乘是兩個(gè)向量的長(zhǎng)度和它們的夾角余弦值的積扰肌。
從名稱和定義上來(lái)看,點(diǎn)乘的結(jié)果是標(biāo)量熊杨。
點(diǎn)乘的名稱也源自于點(diǎn)乘的運(yùn)算符號(hào)曙旭。
通過(guò)上面的公式,我們還可以得到如下公式晶府。
我們通過(guò)點(diǎn)積公式可以看出來(lái)a桂躏,b都是標(biāo)量,都是正數(shù)川陆,余弦值會(huì)根據(jù)角度有正負(fù)變化剂习。
當(dāng)(0-90)°的時(shí)候,余弦值是正數(shù),整個(gè)點(diǎn)乘公式都是正的鳞绕。
當(dāng)90°的時(shí)候失仁,余弦值為0,整個(gè)公式為0们何。
當(dāng)(90-180)°的時(shí)候萄焦,余弦值是負(fù)數(shù),整個(gè)公式為負(fù)的冤竹。
應(yīng)用場(chǎng)景:通過(guò)上面的描述拂封,我們可以知道,通過(guò)點(diǎn)積運(yùn)算贴见,我們可以計(jì)算出兩個(gè)物體間的余弦值烘苹,通過(guò)這個(gè)余弦值來(lái)判斷物體的前后位置
向量叉乘
又稱叉積、向量積
首先叉乘的結(jié)果是向量不是標(biāo)量片部。
叉乘的名稱也來(lái)源于符號(hào)
叉乘的公式定義稍微復(fù)雜一點(diǎn)。
叉乘最后的結(jié)果是一個(gè)向量霜定,大小可以根據(jù)公式算出档悠,但是方向要根據(jù)右手法則確定。
應(yīng)用場(chǎng)景:向量的叉乘主要用于計(jì)算三維空間中一個(gè)物體相對(duì)于另一個(gè)物體的方向
歐拉角與四元數(shù)
歐拉角與四元數(shù)都是 Unity 中用來(lái)表示三維空間坐標(biāo)的
四元數(shù) ( Quaternion ) :
四元數(shù)可用于表示游戲?qū)ο蟮姆较蚧蛐D(zhuǎn)望浩。此表示方式在內(nèi)部由四個(gè)數(shù)字組成(在 Unity 中稱為 x辖所、y、z 和 w)磨德,但是這些數(shù)字不代表角度或軸缘回,您通常不需要直接訪問(wèn)它們。除非特別想深入研究四元數(shù)的數(shù)學(xué)原理典挑,否則只需要知道四元數(shù)代表 3D 空間中的旋轉(zhuǎn)即可酥宴,通常不需要知道或修改 x、y 和 z 屬性您觉。
與矢量可以表示位置或方向(從原點(diǎn)測(cè)量方向)的方式相同拙寡,四元數(shù)可以表示方向或旋轉(zhuǎn):從旋轉(zhuǎn)“原點(diǎn)”或“Identity”測(cè)量旋轉(zhuǎn)。由于旋轉(zhuǎn)的這種測(cè)量方式(從一個(gè)方向到另一個(gè)方向)琳水,因此四元數(shù)不能表示超過(guò) 180 度的旋轉(zhuǎn)肆糕。
- 優(yōu)點(diǎn):四元數(shù)旋轉(zhuǎn)不受萬(wàn)向鎖的影響。
- 局限性:?jiǎn)蝹€(gè)四元數(shù)不能表示任何方向超過(guò) 180 度的旋轉(zhuǎn)在孝。
- 局限性:四元數(shù)的數(shù)字表示在直觀上難以理解诚啃。
歐拉角 ( EulerAngles ) :
歐拉角由按順序應(yīng)用的 X、Y 和 Z 三個(gè)角度值來(lái)表示私沮。要將歐拉旋轉(zhuǎn)應(yīng)用于特定游戲?qū)ο笫际辏瑒t依次應(yīng)用每個(gè)旋轉(zhuǎn)值,作為圍繞其對(duì)應(yīng)軸的旋轉(zhuǎn)。
- 優(yōu)點(diǎn):歐拉角具有直觀的“可讀”格式极阅,由三個(gè)角度組成胃碾。
- 優(yōu)點(diǎn):歐拉角可表示通過(guò)大于 180 度轉(zhuǎn)向從一個(gè)方向到另一個(gè)方向的旋轉(zhuǎn)
- 局限性:歐拉角受到萬(wàn)向鎖 (Gimbal Lock) 的影響。當(dāng)依次施加三個(gè)旋轉(zhuǎn)時(shí)筋搏,第一個(gè)或第二個(gè)旋轉(zhuǎn)可能導(dǎo)致第三個(gè)軸的方向與先前兩個(gè)軸之一相同仆百。這意味著已失去“自由度”,因?yàn)椴荒車@唯一軸應(yīng)用第三個(gè)旋轉(zhuǎn)值奔脐。
貼圖
UV 貼圖
法線貼圖
法線貼圖 (Normal Map) 是一種凹凸貼圖 (Bump Map)。它們是一種特殊的紋理髓迎,可讓您將表面細(xì)節(jié)(如凹凸峦朗、凹槽和劃痕)添加到模型,從而捕捉光線排龄,就像由真實(shí)幾何體表示一樣波势。
例如,您可能希望顯示一個(gè)表面橄维,在表面上有凹槽和螺釘或鉚釘尺铣,比如飛機(jī)機(jī)身。為實(shí)現(xiàn)此目的争舞,一種方法是將這些細(xì)節(jié)建模為幾何體凛忿,如下所示。
如圖竞川,藍(lán)色的部分為法線貼圖店溢,物體貼上這個(gè)貼圖后就會(huì)形成左邊凹凸紋理的效果
更多參考: https://docs.unity3d.com/cn/current/Manual/StandardShaderMaterialParameterNormalMap.html
高度貼圖
高度貼圖(也稱為視差貼圖)是與法線貼圖類似的概念,但是這種技術(shù)更復(fù)雜委乌,因此性能成本也更高床牧。高度貼圖往往與法線貼圖結(jié)合使用,通常情況下福澡,當(dāng)紋理貼圖負(fù)責(zé)渲染表面的大型凸起時(shí)叠赦,高度貼圖用于為表面提供額外的定義。
雖然法線貼圖可修改紋理表面上的光照革砸,但視差高度貼圖更進(jìn)一步并實(shí)際上可移動(dòng)可見表面紋理的區(qū)域除秀,從而實(shí)現(xiàn)一種表面級(jí)遮擋效果。這意味著算利,對(duì)于明顯的凸起册踩,它們的近側(cè)(面向攝像機(jī))將膨脹和擴(kuò)大,而它們的遠(yuǎn)側(cè)(背離攝像機(jī))將減小并且看起來(lái)被遮擋效拭。
這種效果盡管可以產(chǎn)生非常令人信服的 3D 幾何體表示暂吉,但仍然受限于對(duì)象網(wǎng)格的平面多邊形的表面胖秒。也就是說(shuō),雖然表面凸起看起來(lái)會(huì)突出和相互遮擋慕的,但模型的“輪廓”絕不會(huì)被修改阎肝,因?yàn)樽罱K效果將繪制到模型的表面上,不會(huì)修改實(shí)際的幾何體肮街。
高度貼圖應(yīng)為灰度圖像风题,其中以白色區(qū)域表示紋理的高區(qū)域,以黑色表示低區(qū)域嫉父。以下是典型的反照率貼圖和要匹配的高度貼圖沛硅。
上圖從左到右為: 1.分配了反照率貼圖但未分配法線貼圖和高度貼圖的巖石墻壁材質(zhì)绕辖。 2.分配了法線貼圖摇肌。表面上的光照經(jīng)過(guò)修改,但巖石不會(huì)相互遮擋仪际。 3.分配了法線貼圖和高度貼圖的最終效果围小。巖石看起來(lái)從表面突出,較近的巖石似乎遮擋了它們后面的巖石树碱。
遮擋貼圖
遮擋貼圖用于提供關(guān)于模型哪些區(qū)域應(yīng)接受高或低間接光照的信息吩抓。間接光照來(lái)自環(huán)境光照和反射,因此模型的深度凹陷部分(例如裂縫或折疊位置)實(shí)際上不會(huì)接收到太多的間接光照赴恨。
遮擋紋理貼圖通常由 3D 應(yīng)用程序使用建模器或第三方軟件直接從 3D 模型進(jìn)行計(jì)算。
遮擋貼圖是灰度圖像伴栓,其中以白色表示應(yīng)接受完全間接光照的區(qū)域伦连,以黑色表示沒(méi)有間接光照。有時(shí)钳垮,對(duì)于簡(jiǎn)單的表面而言惑淳,這就像灰度高度貼圖一樣簡(jiǎn)單。
在其他情況下饺窿,生成正確的遮擋紋理稍微復(fù)雜一些歧焦。例如,如果場(chǎng)景中的角色穿著罩袍肚医,則罩袍的內(nèi)邊緣應(yīng)設(shè)置為非常低的間接光照绢馍,或者完全沒(méi)有光照。在這些情況下肠套,遮擋貼圖通常將由美術(shù)師制作舰涌,使用 3D 應(yīng)用程序基于模型自動(dòng)生成遮擋貼圖。
<figcaption style="display: block; margin: 0px 0px 10px; font-size: 0.875em; color: rgb(153, 160, 167);">此遮擋貼圖指明了角色袖子上暴露或隱藏在環(huán)境光照下的區(qū)域朱躺。它用于下圖所示的模型。</figcaption>
PBR 材質(zhì)
PBR 指的是"Physically Based Rendering"。也就是基于物理正確的方式來(lái)計(jì)算燈光與材質(zhì)轿钠,實(shí)際上這個(gè)概念很早以前就有巢钓,并且很多已知的算圖引擎如 Vray、MR疗垛、甚至近幾年的Octane症汹、Redshift 都是 PhysicallyBased Rendering。在 Keyshot 中贷腕,高級(jí)材質(zhì)也是 PBR 屬性的材質(zhì)背镇。
使用了 PBR 材質(zhì)貼圖的物體, 渲染出來(lái)的效果更接近現(xiàn)實(shí)世界
Unity 常用功能簡(jiǎn)介
Timeline
Timeline 是 Unity2017 開始新增的一個(gè)用于方便組織場(chǎng)景動(dòng)畫的工具泽裳,可用來(lái)制作劇情動(dòng)畫瞒斩、技能演出等,實(shí)現(xiàn)一些過(guò)場(chǎng)動(dòng)畫之類的效果
Timeline的簡(jiǎn)單使用方法
Cinemachine
Cinemachine 也是 Unity2017 新增的一個(gè)功能涮总,可以配合 Timeline 來(lái)實(shí)現(xiàn)一些影視運(yùn)鏡的效果胸囱,也可以輕松完成一些人物視角功能的實(shí)現(xiàn)
Unity Cinemachine 初識(shí)
Recorder
Unity Recorder是一個(gè)編輯器中的錄制工具(僅能用于編輯器中),可以在運(yùn)行模式下將Unity場(chǎng)景及動(dòng)畫瀑梗、Timeline錄制成動(dòng)畫或視頻烹笔。
相對(duì)于直接錄屏有這么幾點(diǎn)好處:
- 可以自定義輸出分辨率,不再受限于屏幕的分辨率抛丽。
- 可以同時(shí)錄制多個(gè)機(jī)位(多個(gè)Camera鏡頭的輸出)谤职。
- 支持輸出多種類型的輸出(視頻、序列幀亿鲜、GIF允蜈,包括360全景圖和全景視頻)。
- 視頻圖片的壓縮很好蒿柳。
- 可以和Timeline一起用饶套。
Navigation
Navigation(導(dǎo)航)是用于實(shí)現(xiàn)動(dòng)態(tài)物體自動(dòng)尋路的一種技術(shù),它將游戲場(chǎng)景中復(fù)雜的結(jié)構(gòu)關(guān)系簡(jiǎn)化為帶有一定信息的網(wǎng)格其馏,并在這些網(wǎng)格的基礎(chǔ)上通過(guò)一系列相應(yīng)的計(jì)算來(lái)實(shí)現(xiàn)自動(dòng)尋路凤跑。
Unity Navigation(導(dǎo)航系統(tǒng))的使用和常用屬性
剛體 ( Rigidbody )
Unity 3D 中的 Rigidbody(剛體)可以為游戲?qū)ο筚x予物理屬性,使游戲?qū)ο笤谖锢硐到y(tǒng)的控制下接受推力與扭力叛复,從而實(shí)現(xiàn)現(xiàn)實(shí)世界中的運(yùn)動(dòng)效果仔引。
在游戲制作過(guò)程中扔仓,只有為游戲?qū)ο筇砑恿藙傮w組件,才能使其受到重力影響咖耘。
剛體是物理引擎中最基本的組件翘簇。在物理學(xué)中,剛體是一個(gè)理想模型儿倒。
通常把在外力作用下版保,物體的形狀和大小(尺寸)保持不變夫否,而且內(nèi)部各部分相對(duì)位置保持恒定(沒(méi)有形變)的理想物理模型稱為剛體彻犁。
在一個(gè)物理引擎中,剛體是非常重要的組件凰慈,通過(guò)剛體組件可以給物體添加一些常見的物理屬性汞幢,如質(zhì)量、摩擦力微谓、碰撞參數(shù)等森篷。
通過(guò)這些屬性可以模擬該物體在 3D 世界內(nèi)的一切虛擬行為,當(dāng)物體添加了剛體組件后豺型,它將感應(yīng)物理引擎中的一切物理效果仲智。
Unity 3D 提供了多個(gè)實(shí)現(xiàn)接口,開發(fā)者可以通過(guò)更改這些參數(shù)來(lái)控制物體的各種物理狀態(tài)姻氨。
剛體在各種物理狀態(tài)影響下運(yùn)動(dòng)钓辆,剛體的屬性包含 Mass(質(zhì)量)、Drag(阻力)肴焊、Angular Drag(角阻力)岩馍、Use Gravity(是否使用重力)、Is Kinematic(是否受物理影響)抖韩、Collision Detection(碰撞檢測(cè))等。