(AR)獲取攝像頭的畫(huà)面并將其設(shè)置為模型貼圖之無(wú)敵陀螺大回環(huán)之實(shí)現(xiàn)篇

在說(shuō)之前,先來(lái)說(shuō)說(shuō)涂涂樂(lè)痕钢,涂涂樂(lè)的原理也類(lèi)似于獲取攝像頭的畫(huà)面图柏,并且通過(guò)shader設(shè)置捕捉的畫(huà)面的某一部分為模型的貼圖來(lái)實(shí)現(xiàn)的。

首先是shader部分:

Shader "Custom/CameraTargetPatch" {

Properties {

_MainTex("Texture", 2D) = "white" { }

}

SubShader{

Pass{

Cull Back

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#include "UnityCG.cginc"

sampler2D _MainTex;

float4x4 _MATRIX_MVP;

float _yScale;

float _xScale;

struct v2f {

float4? pos : SV_POSITION;

float2? uv : TEXCOORD0;

};

v2f vert(appdata_base v){

v2f o;

float4 uvTmp;

// calculate new uv in camera image

uvTmp = mul(_MATRIX_MVP, float4(v.texcoord.x-0.5f,v.texcoord.y-0.5f,0,1));

uvTmp.x = uvTmp.x/uvTmp.w;

uvTmp.y = uvTmp.y/uvTmp.w;

uvTmp.z = uvTmp.z/uvTmp.w;

// some swap for different coordinate system

uvTmp.x = (uvTmp.x + 1.0f)/2.0f;

uvTmp.y = (uvTmp.y + 1.0f)/2.0f;

o.uv = uvTmp.xy;

//The position of the vertex should not be frozen, so use

//the standard UNITY_MATRIX_MVP matrix for that.

o.pos = mul(UNITY_MATRIX_MVP, v.vertex);

return o;

}

half4 frag(v2f i) : COLOR{

half4 texcol = tex2D(_MainTex, i.uv);

return texcol;

}

ENDCG

}

}

}

然后是代碼部分:

// 設(shè)置模型貼圖

public void SetTexture()? ? {? ? ? ??

// 在ARCamera下新建TextureCamera來(lái)捕捉畫(huà)面任连,參數(shù)要和arcamera保持一直? ? ? ??

cameraObj = new GameObject("TextureCamera");? ? ? ??

cameraObj.transform.SetParent(NewFarmSceneControl.Instance.arCameraTran);? ? ? ??

cameraObj.transform.localPosition = Vector3.zero;? ? ? ??

cameraObj.transform.localRotation = Quaternion.identity;? ? ? ?

?cameraObj.transform.localScale = Vector3.one;? ? ? ??

Camera renderCamera = cameraObj.AddComponent();? ? ? ?

?renderCamera.fieldOfView = NewFarmSceneControl.Instance.ARCamera.fieldOfView;? ? ? ??

renderCamera.clearFlags = CameraClearFlags.SolidColor;? ? ? ??

renderCamera.farClipPlane = 2000.0f;? ? ? ??

renderCamera.nearClipPlane = 0.05f;? ? ? ??

//只開(kāi)啟ARBackground層(這里是為了讓該攝像頭只獲取ARCamra下的Background所拍到的畫(huà)面)? ? ? ??

renderCamera.cullingMask = LayerMask.GetMask("ARBackground");? ? ? ?

?RenderTexture renderTexture = new RenderTexture(Screen.width / 2, Screen.height / 2, 0);? ? ? ?

?renderCamera.targetTexture = renderTexture;? ? ? ??

GetComponentInChildren().material.mainTexture = renderTexture;? ? ? ??

hasSet = true;? ? ? ?

?P = GL.GetGPUProjectionMatrix(renderCamera.projectionMatrix, false);? ? ? ?

?V = renderCamera.worldToCameraMatrix;? ? ? ??

GetComponentInChildren().material.SetFloat("_xScale", 1.0f);? ? ? ??

GetComponentInChildren().material.SetFloat("_yScale", 1.0f);? ? ? ??

if (boxPosTran == null)? ? ? ? {? ? ? ? ? ? boxPosTran = transform.FindChild("BoxPos");? ? ? ? }? ? ? ?

?// 獲取模型的本地到世界的矩陣變換? ? ? ?

?M = boxPosTran.localToWorldMatrix;? ? ? ?

?MVP = P * V * M;? ? ? ??

// 設(shè)置MVP矩陣? ? ? ?

?GetComponentInChildren().material.SetMatrix("_MATRIX_MVP", MVP);

}

上面方法中有個(gè)hasSet布爾值蚤吹,這里設(shè)置為true的目的是為了在Update函數(shù)中實(shí)時(shí)獲取攝像頭的畫(huà)面,保證每幀都渲染相同的貼圖,否則會(huì)出現(xiàn)獲取到貼圖后裁着,攝像頭晃動(dòng)時(shí)模型的貼圖發(fā)生變化繁涂。

所以當(dāng)hasSet為true時(shí),在Update中也需要重新再設(shè)置MVP矩陣

void Update () {? ? ? ??

if (hasSet)? ? ? ? {? ? ? ? ? ?

?P = GL.GetGPUProjectionMatrix(NewFarmSceneControl.Instance.ARCamera.projectionMatrix, false);? ? ? ? ??

?V = NewFarmSceneControl.Instance.ARCamera.worldToCameraMatrix;? ? ? ? ? ?

?GetComponentInChildren().material.SetFloat("_xScale", 1.0f);? ? ? ? ? ??

GetComponentInChildren().material.SetFloat("_yScale", 1.0f);? ? ? ? ? ?

?M = boxPosTran.localToWorldMatrix;? ? ? ? ? ??

MVP = P * V * M;? ? ? ? ? ?

?GetComponentInChildren().material.SetMatrix("_MATRIX_MVP", MVP);

}

}

最終效果如下圖所示


效果展示

哇哈哈二驰,是不是很酷炫扔罪!

喜歡的話(huà)請(qǐng)點(diǎn)個(gè)贊哦~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市诸蚕,隨后出現(xiàn)的幾起案子步势,更是在濱河造成了極大的恐慌,老刑警劉巖背犯,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坏瘩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡漠魏,警方通過(guò)查閱死者的電腦和手機(jī)倔矾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)柱锹,“玉大人哪自,你說(shuō)我怎么就攤上這事〗” “怎么了壤巷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瞧毙。 經(jīng)常有香客問(wèn)我胧华,道長(zhǎng),這世上最難降的妖魔是什么宙彪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任矩动,我火速辦了婚禮,結(jié)果婚禮上释漆,老公的妹妹穿的比我還像新娘悲没。我一直安慰自己,他們只是感情好男图,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布示姿。 她就那樣靜靜地躺著,像睡著了一般逊笆。 火紅的嫁衣襯著肌膚如雪峻凫。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天览露,我揣著相機(jī)與錄音荧琼,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛命锄,可吹牛的內(nèi)容都是我干的堰乔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼脐恩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼镐侯!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起驶冒,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤苟翻,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后骗污,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體崇猫,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年需忿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诅炉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屋厘,死狀恐怖涕烧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情汗洒,我是刑警寧澤议纯,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站溢谤,受9級(jí)特大地震影響瞻凤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜溯香,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望浓恶。 院中可真熱鬧玫坛,春花似錦、人聲如沸包晰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)伐憾。三九已至勉痴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間树肃,已是汗流浹背蒸矛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雏掠。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓斩祭,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親乡话。 傳聞我的和親對(duì)象是個(gè)殘疾皇子摧玫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容