通過求交點的方式顯示其他玩家所在的方位,並在螢幕邊緣顯示方位指示器
1、已知兩個點,求直線方程的a,b值:
a*x1+b=y1
a*x2+b=y2
a*x2+y1-a*x1=y2
a,b的值:
a=(y2-y1)/(x2-x1)
b=y1-(y2-y1)/(x2-x1)*x1
需要注意兩個點x座標相等的情況。
如果兩個點x座標相等,則該直線與y軸平行。
如果兩個點y座標相等,則該直線與x軸平行。
如果兩個點x,y座標都相等,則不是線,是同一個點。
2、已知兩條直線,求交點:
a1*x+b1=y
a2*x+b2=y
a1*x+b1=a2*x+b2
交點座標:
x=(b2-b1)/(a1-a2)
y=(b2-b1)/(a1-a2)*a1+b1
需要注意a1和a2相等的情況。
如果a1和a2相等,b1和b2不相等,則兩條直線平行,無交點。
如果a1和a2相等,b1和b2相等,則兩條直線是同一條線,無交點。
如果a1和a2不相等,b1和b2相等,則兩條直線不平行,有交點,相交於y軸b1點或b2點。
如果a1和a2不相等,b1和b2不相等,則兩條直線不平行,有交點。
3、已知兩條線段的端點,求這兩條線段的交點:
通過(1)求得端點所在的直線的方程;
通過(2)求得這兩條直線的交點。
這裡需要判斷下交點是落線上段內,還是線段外(虛交點)。
如果交點x座標小於線段1的左側端點的x座標,或者交點y座標大於線段1的右側端點的y座標,則該交點落線上段1外,即線段的延長線上,是個虛交點。反之,是線段1的正常交點。
以上知識可應用場景:
場景1 –遊戲裡,求玩家1相對於玩家2所在的方位,如果是在螢幕外,則在螢幕邊緣顯示玩家1的方位指示圖示。
解決思路:
首先,玩家2是一定在螢幕內的,這裡需要判斷玩家1是不是在螢幕內。
如果是在螢幕內,則無需後面的處理。
如果是在螢幕外,讓我們繼續下面的處理。
把玩家1和玩家2的世界座標轉換成螢幕座標系裡的座標,分別記作s1和s2。
(注意:這裡有個容易鑽進去的誤區,就是很容易想到去計算方向向量,即s1-s2。計算完之後又會自然而然的想著用這個向量去處理上面的問題,最後會發現,自己已經進入了一個深坑裡,深深的把自己的思維給圈住了,即使偶爾換個方向思考,比如求交點的方式,還是容易被這個向量給迷惑,總想著去用這個向量去解決,儘管這個向量沒啥卵用。 )
這時,只需要求得線段s1-s2與螢幕的四個邊框線段的交點即可,交點也必須同時落在相交的兩個線段內。
在Unity中,螢幕座標系的原點是在左上角,向右是x軸正方向,向下是y軸正方向。
所以s1和s2的座標也是相對於左上角的位置。
螢幕的四個邊框線段分別是:
(注意:只需要確保端點座標位於線段上即可,無需關注線段的方向,別又被分心了 )
左邊框線段:(0,0)-(0,螢幕高度)
下邊框線段:(0,螢幕高度)-(螢幕寬度,螢幕高度)
右邊框線段:(螢幕寬度,0)-(螢幕寬度,螢幕高度)
上邊框線段:(0,0)-(螢幕寬度,0)
有了4個邊框線段,通過上面的知識,即可求得線段s1-s2與4個邊框的交點。因為玩家2在螢幕內,所以玩家2的螢幕座標s2也一定是在4個邊框的內部,線段s1-s2必定與某一個邊框有且只有一個交點(一定不會有虛交點)。求得的交點座標也是相對於左上角原點的座標。
獲得交點後,我們需要在螢幕的該交點位置顯示玩家1所在的方位的指示器UI。
假設在Unity中,我們使用Canvas+Image來顯示,此時我們需要把Image放到交點位置。
這個地方也很關鍵,需要注意,不能直接把交點的座標賦值給Image的transform的position。
要仔細檢視Image的錨點設定,通過使用Image的RectTransform元件的anchoredPosition屬性來設定Image的位置。
假設Image的錨點是在中心,下面分別求出線段s1-s2與4個邊框相交時anchoredPosition屬性的值:
與左邊框相交時:
anchoredPosition=new Vector2(-螢幕寬度/2+Image寬度/2,螢幕高度/2-交點y座標);
與下邊框相交時:
anchoredPosition=new Vector2(交點x座標-螢幕寬度/2,-螢幕高度/2+Image寬高/2);
與右邊框相交時:
anchoredPosition=new Vector2(螢幕寬度/2-Image寬度/2,螢幕高度/2-交點y座標);
與上邊框相交時:
anchoredPosition=new Vector2(交點x座標-螢幕寬度/2,螢幕高度/2-Image寬高/2)。
(注意,加減Image寬度(高度)/2,是為了使Image完全顯示在螢幕內。)