本發(fā)明涉及一種基于unity3d的拖動(dòng)相機(jī)在場景中位移的方法。
背景技術(shù):
游戲中相機(jī)的視角是個(gè)錐形視角,從截面來看,就是一個(gè)等腰三角形。而相機(jī)就處于中間頂點(diǎn)的位置,相機(jī)的fov(fieldofview,攝像機(jī)的視角)就是頂點(diǎn)的內(nèi)角。游戲中經(jīng)常會需要用到在電腦上拖動(dòng)鼠標(biāo)、在移動(dòng)設(shè)備上滑動(dòng)手指等操作來完成場景移動(dòng),從而瀏覽其他區(qū)域的操作,但是相機(jī)與場景之間存在距離,在場景跟隨手指拖動(dòng)的過程,存在或多或少的誤差,無法達(dá)到場景完全跟隨手指拖動(dòng),拖動(dòng)過程中如果沒有進(jìn)行平滑插值,整個(gè)操作就也會非常生硬。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明要解決的技術(shù)問題,在于提供一種基于unity3d的拖動(dòng)相機(jī)在場景中位移的方法,實(shí)現(xiàn)場景的平滑移動(dòng),提升用戶體驗(yàn)。
本發(fā)明是這樣實(shí)現(xiàn)的:一種基于unity3d的拖動(dòng)相機(jī)在場景中位移的方法,包括如下步驟:
步驟1、判斷是否是正交相機(jī),若是,則跳轉(zhuǎn)至步驟4,否則,進(jìn)入步驟2;
步驟2、獲取相機(jī)到視野中心點(diǎn)的直線距離d和相機(jī)視角fov;
步驟3、根據(jù)所述直線距離d和相機(jī)視角fov計(jì)算出水平位移量x和垂直位移量y:x=d×2×tan(fov÷2),y=x÷畫面寬高比,其中,所述畫面寬高比為unity3d引擎自帶的屏幕寬高比,跳轉(zhuǎn)至步驟5;
步驟4、根據(jù)相機(jī)尺寸size計(jì)算出水平位移量x和垂直位移量y:x=2×size×畫面寬高比,y=2×size;其中,所述畫面寬高比為unity3d引擎自帶的屏幕寬高比,所述相機(jī)尺寸size為正交相機(jī)的視野寬度的一半;
步驟5、根據(jù)相機(jī)旋轉(zhuǎn)角度α對水平位移量x和垂直位移量y進(jìn)行修正,得到修正后的水平位移量x1和修正后的垂直位移量y1作為目標(biāo)值,通過插值方式以一定速度跟隨目標(biāo)值位移,達(dá)到平滑移動(dòng)效果。
進(jìn)一步的,所述步驟2中“獲取相機(jī)到視野中心點(diǎn)的直線距離d”具體為:判斷視野內(nèi)的地面是否為固定的平地,若是,則從相機(jī)往視野中央發(fā)射一條射線,得到射線與地面的碰撞點(diǎn),計(jì)算出相機(jī)到碰撞點(diǎn)的距離作為直線距離d,否則,取相機(jī)到視野中心的距離作為直線距離d。
進(jìn)一步的,所述步驟5中“根據(jù)相機(jī)旋轉(zhuǎn)角度α對水平位移量x和垂直位移量y進(jìn)行修正”具體為:
x1=-x×(水平實(shí)際操作量×cosα+垂直實(shí)際操作量×sinα);
y1=y(tǒng)×(水平實(shí)際操作量×sinα-垂直實(shí)際操作量×sinα);
其中,相機(jī)旋轉(zhuǎn)角度α為相機(jī)繞z軸旋轉(zhuǎn)的角度,即平行于地面的旋轉(zhuǎn)角度,所述z軸為垂直于場景地面的坐標(biāo)軸,所述水平實(shí)際操作量和垂直實(shí)際操作量分別為單位時(shí)間內(nèi)手指在屏幕上的水平移動(dòng)向量和垂直移動(dòng)向量。
進(jìn)一步的,所述步驟5中的速度為當(dāng)前時(shí)間減去開始插值時(shí)間,之后再除以插值需要的時(shí)間得到的,所述插值需要的時(shí)間由用戶自定義。
本發(fā)明具有如下優(yōu)點(diǎn):先精確計(jì)算出實(shí)際的位移,再利用插值方式實(shí)現(xiàn)拖動(dòng)的平滑位移,大大降低誤差范圍,改善拖動(dòng)的模擬效果,提升用戶體驗(yàn);插值速度可以根據(jù)用戶需要靈活調(diào)整;另外,本發(fā)明適用于正交相機(jī)與非正交相機(jī)兩種模式,應(yīng)用范圍廣。
附圖說明
下面參照附圖結(jié)合實(shí)施例對本發(fā)明作進(jìn)一步的說明。
圖1為本發(fā)明一種基于unity3d的拖動(dòng)相機(jī)在場景中位移的方法執(zhí)行流程圖。
具體實(shí)施方式
如圖1所示,一種基于unity3d的拖動(dòng)相機(jī)在場景中位移的方法,包括如下步驟:
步驟1、判斷是否是正交相機(jī),若是,則跳轉(zhuǎn)至步驟4,否則,進(jìn)入步驟2;
步驟2、獲取相機(jī)到視野中心點(diǎn)的直線距離d和相機(jī)視角fov;
步驟3、根據(jù)所述直線距離d和相機(jī)視角fov計(jì)算出水平位移量x和垂直位移量y:x=d×2×tan(fov÷2),y=x÷畫面寬高比,其中,所述畫面寬高比為unity3d引擎自帶的屏幕寬高比,跳轉(zhuǎn)至步驟5;
步驟4、根據(jù)相機(jī)尺寸size計(jì)算出水平位移量x和垂直位移量y:x=2×size×畫面寬高比,y=2×size;其中,所述畫面寬高比為unity3d引擎自帶的屏幕寬高比,所述相機(jī)尺寸size為正交相機(jī)的視野寬度的一半;
步驟5、根據(jù)相機(jī)旋轉(zhuǎn)角度α對水平位移量x和垂直位移量y進(jìn)行修正,得到修正后的水平位移量x1和修正后的垂直位移量y1作為目標(biāo)值,通過插值方式以一定速度跟隨目標(biāo)值位移,達(dá)到平滑移動(dòng)效果。
本發(fā)明中,所述步驟2中“獲取相機(jī)到視野中心點(diǎn)的直線距離d”具體為:判斷視野內(nèi)的地面是否為固定的平地,若是,則從相機(jī)往視野中央發(fā)射一條射線,得到射線與地面的碰撞點(diǎn),計(jì)算出相機(jī)到碰撞點(diǎn)的距離作為直線距離d,否則,取相機(jī)到視野中心的距離作為直線距離d。
本發(fā)明中,所述步驟5中“根據(jù)相機(jī)旋轉(zhuǎn)角度α對水平位移量x和垂直位移量y進(jìn)行修正”具體為:
x1=-x×(水平實(shí)際操作量×cosα+垂直實(shí)際操作量×sinα);
y1=y(tǒng)×(水平實(shí)際操作量×sinα-垂直實(shí)際操作量×sinα);
其中,相機(jī)旋轉(zhuǎn)角度α為相機(jī)繞z軸旋轉(zhuǎn)的角度,即平行于地面的旋轉(zhuǎn)角度,所述z軸為垂直于場景地面的坐標(biāo)軸,所述水平實(shí)際操作量和垂直實(shí)際操作量分別為單位時(shí)間內(nèi)手指在屏幕上的水平移動(dòng)向量和垂直移動(dòng)向量。
本發(fā)明中,所述步驟5中的速度為當(dāng)前時(shí)間減去開始插值時(shí)間,之后再除以插值需要的時(shí)間得到的(一般為0~1的值),所述插值需要的時(shí)間由用戶自定義(例如1s),例如插值方式可采用mathf.lerp(初始值,目標(biāo)值,(0-1)插值位置)實(shí)現(xiàn)。
本發(fā)明通過精確計(jì)算出實(shí)際的位移,再利用插值方式實(shí)現(xiàn)拖動(dòng)的平滑位移,提升用戶體驗(yàn);插值速度可以根據(jù)用戶需要靈活調(diào)整;同時(shí)適用于正交相機(jī)與非正交相機(jī)兩種模式。
雖然以上描述了本發(fā)明的具體實(shí)施方式,但是熟悉本技術(shù)領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,我們所描述的具體的實(shí)施例只是說明性的,而不是用于對本發(fā)明的范圍的限定,熟悉本領(lǐng)域的技術(shù)人員在依照本發(fā)明的精神所作的等效的修飾以及變化,都應(yīng)當(dāng)涵蓋在本發(fā)明的權(quán)利要求所保護(hù)的范圍內(nèi)。