通俗u3d之直線方程

天氣:陰。

雨一直下,下在外燃观,卻滴在我心...

unity中什么時候會運用到數(shù)學(xué),無非就是當(dāng)對游戲物體進行旋轉(zhuǎn)或者是移位的時候便瑟。

通常,于很多新手而言缆毁,我們對一個游戲物體進行移位的時候是直接使用里邊的API即,transform.Translate到涂。但是脊框,這樣會有很大的局限性,為什么這么說践啄,往下看你就會知道原因...不著急!. 哈哈哈浇雹。

我這里又個假設(shè),假如你手上有這么個需求屿讽,要求你對圖片進行移位昭灵,怎么個移位法呢?就是:當(dāng)鼠標(biāo)點擊屏幕的時候,圖片移動到改點擊的位置烂完,就這樣完事了试疙?不,在加上一點就是:圖片自身的x軸向指向鼠標(biāo)點擊的位置抠蚣,有點類似(LookAt)的感覺...額,干脆,上張圖更加明了

就如上圖效斑,image的x軸向(紅色)指向了鼠標(biāo)點擊的位置,然后柱徙,再移動到鼠標(biāo)的點擊位置(組成三角形的三條邊的線段是輔助線缓屠,可以不用去管它,下邊也會講到如何去繪制)

那么护侮,問題來了敌完,要實現(xiàn)這樣的功能,我們該怎么做.實際上就倆個功能點羊初,一個是旋轉(zhuǎn)滨溉,一個是移動。先不說旋轉(zhuǎn)长赞,先說移動晦攒,畢竟,在文章一開始的時候就是由移動牽引出來的得哆。那脯颜,想想,用Translate能辦到 ? ?答案是肯定的贩据,怎么做吶栋操?我能想到的就是鼠標(biāo)點擊處的位置坐標(biāo)可以獲取到,那就同時沿著圖片的xy軸移動饱亮,移動到什么位置停止呢矾芙,條件就是:當(dāng)圖片的x坐標(biāo)和點擊處的x坐標(biāo)相等&&圖片的y坐標(biāo)和點擊處的y坐標(biāo)相等的時候或者說相差無幾的時候,必須是同時滿足近上。想想是不是這樣... 好開森剔宪,趕緊是實踐看看.

但是, ?真當(dāng)你去實踐的時候壹无,你就會發(fā)現(xiàn):這樣還是有問題的葱绒,就是當(dāng)你的鼠標(biāo)點擊處到圖片的水平距離和垂直距離不相等的時候,也就是說上圖中的黃線長度和白線的長度不相等的時候,此時格遭,就不會到達鼠標(biāo)點擊處了,因為哈街,此時的&&符號左右的條件只會有一個滿足.當(dāng)然,如果大家有什么好的想法拒迅,歡迎拍磚骚秦,狠狠的拍死我....K取!作箍!所以硬梁,對于用Translate來移動,個人表示不好控制胞得,這就是我在開頭所講到的局限性.

那我們到底又怎么移動呢荧止?對于新手而言,此時估計皺顯額頭了... 別急阶剑,答案跃巡,你很快就知道了,就在下邊了.嘻嘻..D脸睢K匦啊! 就在下邊了.

那么猪半,本文的重點也就是在這里了, 大家都知道有向量兔朦,那么向量的概念是什么呢,特別是向量如何在unity中表示的呢磨确? 或許沽甥,很多讀者在想,向量不就是一個三維的或者二維的矢量(Vector3或者Vector2),在我看來乏奥,這樣的回答只能是答對一半摆舟。在我通俗的看來,向量必須有兩個點,一個始點一個終點英融,那既然有了始末那必然就是有方向和大小盏檐。

那說到這里歇式,有的讀者可能會講:那如此說來在Unity中的一個Vector3變量就不是一個向量了驶悟? 是不是向量,答案是肯定的材失,此時痕鳍,嚴(yán)格意義上的表示:應(yīng)該是該變量減去Vector3.zero所代表的向量,比如(new Vector3(0,10,0) - Vector3.zero),想想是不是龙巨,再上一張圖笼呆,就會更加的明了了

02


由圖02所示,那么旨别,我們?nèi)绾螌⒂螒蛭矬w移動至鼠標(biāo)點擊處呢诗赌? 那么這就要涉及到另外一個概念了,即向量的減法秸弛,其實铭若,有的讀者可能已經(jīng)想到洪碳,向量減法的概念和減去原點不是一樣的?沒錯叼屠,是一樣的瞳腌,(b - a) 代表的是 由a的末端指向b的末端的向量,就如圖所示.那么具體在unity中的表現(xiàn)是怎么吶?很淺顯了镜雨,b向量:鼠標(biāo)點擊點的position -(減去)Vector3.zero = 鼠標(biāo)點擊點本身的position嫂侍;同理a向量就是游戲物體本身的position。而本例中既然是移動一直圖片荚坞,那么圖片就是游戲物體我用image代表挑宠,鼠標(biāo)點擊點就用targetPos表示,所以這里的(b - a)就是targetPos - image.transform.position颓影。想一想痹栖,是不是這樣。瞭空!ok揪阿,到這里,離成功我們又進了一步咆畏,我們暫且用dir來表示這個表達式南捂,意思為方向,后邊會用到旧找,讀者得用心記住.

ok溺健,我們繼續(xù),不知道有沒有讀者在觀察(圖02)的時候有沒有發(fā)覺跟我們中學(xué)學(xué)的哪個知識點有點相似....誒钮蛛,我似乎聽到有聲音說直線鞭缭。直線,對的魏颓,不過不夠完整岭辣,準(zhǔn)確的說應(yīng)該是直線方程,延長dir兩段直到和xy軸各有一個交點甸饱,如圖03

03


y = kx + n;直線方程表達式沦童,看到這的讀者是否感到很熟悉,很親切叹话,有沒有瞬間懷念起你的中學(xué)生涯偷遗,是不是美美噠。M蘸氏豌!oh,No热凹,我自己都走遠了泵喘,還是趕緊扯回來的要緊瞭吃,不然,未完待續(xù)四個字就出現(xiàn)在這里了....

我們接著涣旨,直線方程雖然是直線方程歪架,但是我前邊有說到只是有點相似。為什么我這么講呢霹陡,這么說吧和蚪,我們在初中學(xué)習(xí)的時候:k斜率,n是常量烹棉,知道兩個點(y2 - y1 / x2- x1)就可以算出k攒霹,k也就是一個數(shù)值,比如我們可以寫成 y = 2x + 3浆洗,此時的k催束,n都是一個數(shù)值,這是我們中學(xué)時候所學(xué)習(xí)到的伏社。而k抠刺,n可以看成是一維的,而我們現(xiàn)在的計算的是image的position摘昌,而position是三維的速妖,當(dāng)然z一直為0,所以我們對于UI物體可以看成是二維的聪黎。 這到底的是什么意思罕容,有什么關(guān)系吶?通俗的說:我們此時按道理是要求出斜率k = (image.transform.position.y - targetPos.y) / (image.transform.position.x - targetPos.x)稿饰,然后锦秒,再乘上一個變量x,再加上一個常量n喉镰,用表達式表示就是:image.transform.position = k * timer + n旅择;而n就是當(dāng)timer為0的時候即:image.transform.position券犁。所以,image.transform.position = k * timer + image.transform.position;(timer是個變量用來充當(dāng)x固逗。我們且稱該表達式為:表達式1)贞岭。而此時你會發(fā)覺position是三維的,k*timer是一個float類型的,所以踢涌,這么寫就會報語法錯誤。想想是不是,慢慢想偿凭,不著急,我們什么都缺派歌,但就是不缺時間...M淠摇L瞪凇!嘻嘻xi..

那怎么辦呢匾嘱?我估計著有的讀者可能已經(jīng)想到說都是k惹的禍斤斧。沒錯,就是斜率惹的禍霎烙,額撬讽,不對,確切的說應(yīng)該是我們計算斜率的方法惹的禍悬垃,如果游昼,此時的k是三維的該有多好呀,是不是3⑷洹烘豌!。所以看彼,這也就是我上邊為什么用"相似"這個詞.廊佩,k和n在這里這里應(yīng)該是一個三維的量,而不是一維的量靖榕。讀者看到這里罐寨,有沒有豁然開朗,柳暗花明的趕腳P蚓亍鸯绿!哇咔咔....

雖然,或許有些柳暗花明簸淀,但是我們又該怎么做吶瓶蝴?怎么求k呢?別急租幕,答案就快揭曉了舷手,讀者也可以自行想想。

ok劲绪,在這之前男窟,還得明白一個概念,就是直線上的向量贾富,那么什么是直線上的向量呢歉眷?它指的是向量的起點與終點都在直線上.這里,我們將游戲物體和鼠標(biāo)點擊處分別當(dāng)做p1和p2兩個點颤枪,則我們可以知道圖04中可以表示的信息


04

根據(jù)向量的坐標(biāo)運算汗捡,一目了然可以看到直線上的向量和斜率k的關(guān)系(當(dāng)然,什么是直線上的向量畏纲?什么是平行向量扇住?什么是直線的方向向量春缕?不知道的讀者可以百度一下,就會明白了)艘蹋,而我們知道:直線的方向向量和法向量體現(xiàn)了直線的方向锄贼,同時也刻畫出了直線與橫軸X軸的傾斜程度(即斜率),這是教材上給的定義女阀。所以宅荤,我們就可以將p1p2當(dāng)做直線的斜率,所以强品,我們此時的斜率k1應(yīng)該這樣來計算:k1 = new Vector3(targetPos.x - image.transform.position.x) * (1,k)膘侮,即 k1 = new Vector3(1, (targetPos.y - image.transform.position.y) / (targetPos.x - image.transform.position.x), 0) * (targetPos.x - image.transform.position.x)。所以的榛,我們可以重寫表達式1為:image.transform.position = k1 * timer + image.transform.position;

當(dāng)然琼了,我們也沒有必要像表達式1這樣寫的那么,唔唔...夫晌,那么啰嗦...

為什么說它這么啰嗦呢雕薪?聰明的讀者可能已經(jīng)想到:如果我們不想使用斜率,既然我們可以將直線的方向向量當(dāng)做直線的斜率晓淀,那么我們?yōu)槭裁床挥弥本€的方向向量來計算呢所袁?perfect...沒錯,就是這樣凶掰,圖04中不是給出來一個表達式燥爷,然后化簡為3個式子,而我們k1用的是第3個式子懦窘,那我們用第一個式子不就看起來舒服多了前翎,所以,我們此時的斜率k1也可以這么來寫:k1 = new Vector3(targetPos.x - image.transform.position.x, targetPos.y - image.transform.position.y,0)畅涂。那港华,這樣寫了,是否有些許的眼熟午衰,跟我們上邊的什么很像立宜?

還記得我們的dir表達式?上邊我還叫讀者用心記住臊岸,現(xiàn)在是它的表現(xiàn)時間了....

我們的dir = targetPos - image.transform.position;跟我們的k1是不是一模一樣橙数,就像一個媽生下來的一樣(本質(zhì)上都有一個媽,實際上外觀給人看著不一樣),那扇单,有的讀者可能會說k1的z為0商模,糾結(jié)這個問題的讀者,估計你沒有好好的看這篇文章蜘澜,為什么這么說呢施流?因為,你k1的z是可以寫成targetPos.z - image.transform.position.z鄙信;而對于UI物體z都是為0的瞪醋,所以為了方便寫就直接寫成0了。

所以装诡,我們就可以將方向dir當(dāng)成直線的斜率银受。而我們稱dir為方向,其實嚴(yán)格意義上應(yīng)該稱為方向向量鸦采。所以宾巍,我們的表達式1也可以寫成:image.transform.position = dir * timer + image.transform.position;而其中的timer是一個自變量渔伯,那顶霞,自增的方式會有很多,我這里給出兩種:第一種:可以讓timer每秒自增1或者是自增多少锣吼;第二種:簡單粗暴选浑,直接用上下幀的時間間隔量來從當(dāng)timer。估計玄叠,對于很多初始這個的朋友古徒,看的是云里霧里的。沒關(guān)系读恃,我下邊會給出代碼隧膘,看了代碼你一定會明白,噢寺惫,原來是這個玩意疹吃。


代碼區(qū):

var dir = targetPos - image.transform.position;

image.transform.position = (dir) * Time.deltaTime * speed * 10f + image.transform.position;

其中dir也可用k1來充當(dāng),感興趣的讀者可以自行帶入試試看.這里的timer = Time.deltaTime * speed * 10f; 也就是我所說的timer的第二種自增方式肌蜻,其中speed是一個float類型的量互墓,調(diào)節(jié)speed就可以來調(diào)節(jié)實際的速度

當(dāng)然,第一種自增方式可以這么來寫:

var dir = targetPos - image.transform.position;

_timer += Time.deltaTime;

image.transform.position = (dir) *_timer * speed * 10f + image.transform.position;?

ok蒋搜,到這里篡撵,就圓滿完成一個游戲物體的移動,也就是這是移動的核心豆挽。當(dāng)然育谬,也有其他的方式移動,比如使用插值來移動帮哈。有興趣的讀者可以去嘗試一下膛檀,這里不過多的闡述。下邊貼出源碼:


源碼


相信都能看得懂,還是比較簡單的咖刃,就不過的闡述了泳炉。當(dāng)然,開篇還講到旋轉(zhuǎn)和畫線嚎杨,原本是打算一起講完的花鹅,但是,現(xiàn)在看來還是分篇講比較好枫浙,這篇文章已經(jīng)字數(shù)太多了...所以刨肃,所以,歡迎交流箩帚,歡迎拍磚真友,喜歡被你們這么狠狠的拍死!=襞痢盔然!咱們下期見.....哇哈哈

本文鏈接:http://www.reibang.com/p/b8308eebff48

轉(zhuǎn)載請注明出處...謝謝!;啦巍轻纪!


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市叠纷,隨后出現(xiàn)的幾起案子刻帚,更是在濱河造成了極大的恐慌,老刑警劉巖涩嚣,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崇众,死亡現(xiàn)場離奇詭異,居然都是意外死亡航厚,警方通過查閱死者的電腦和手機顷歌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幔睬,“玉大人眯漩,你說我怎么就攤上這事÷槎ィ” “怎么了赦抖?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辅肾。 經(jīng)常有香客問我队萤,道長,這世上最難降的妖魔是什么矫钓? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任要尔,我火速辦了婚禮舍杜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赵辕。我一直安慰自己既绩,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布匆帚。 她就那樣靜靜地躺著熬词,像睡著了一般旁钧。 火紅的嫁衣襯著肌膚如雪吸重。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天歪今,我揣著相機與錄音嚎幸,去河邊找鬼。 笑死寄猩,一個胖子當(dāng)著我的面吹牛嫉晶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播田篇,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼替废,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了泊柬?” 一聲冷哼從身側(cè)響起椎镣,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎兽赁,沒想到半個月后状答,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡刀崖,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年惊科,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亮钦。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡馆截,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蜂莉,到底是詐尸還是另有隱情蜡娶,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布巡语,位于F島的核電站翎蹈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏男公。R本人自食惡果不足惜荤堪,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一合陵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧澄阳,春花似錦拥知、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肮塞,卻和暖如春襟齿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背枕赵。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工猜欺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拷窜。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓开皿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親篮昧。 傳聞我的和親對象是個殘疾皇子赋荆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

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