我有一個物體,它面對着(例如)45度視場的特定方向,以及極限視野範圍。我已經完成了所有初始檢查(Quadtree節點和距離),但是現在我需要檢查一個特定的對象是否在該視圖錐體內(在這種情況下,如果我們可以看到它,則僅決定跟隨該對象)。如何檢查一個遊戲對象是否可以看到另一個遊戲對象?
除了從Direction - (FieldOfView/2)
到Direction + (FieldOfView/2)
(我現在這樣做,這是可怕的)每個學位投射射線,什麼是做這種可見性檢查的最佳方法是什麼?
我有一個物體,它面對着(例如)45度視場的特定方向,以及極限視野範圍。我已經完成了所有初始檢查(Quadtree節點和距離),但是現在我需要檢查一個特定的對象是否在該視圖錐體內(在這種情況下,如果我們可以看到它,則僅決定跟隨該對象)。如何檢查一個遊戲對象是否可以看到另一個遊戲對象?
除了從Direction - (FieldOfView/2)
到Direction + (FieldOfView/2)
(我現在這樣做,這是可怕的)每個學位投射射線,什麼是做這種可見性檢查的最佳方法是什麼?
計算你的視線方向(理解爲矢量)和從你開始到結束的向量之間的角度。如果它落在FieldOfView/2下,則可以查看該對象。
這角度:
arccos(scalarProduct(viewDirection, (object - you))/(norm(viewDirection)*norm(object - you))).
如果你正在做3D和可以定義可視範圍爲平截,那麼你可以使用類似這樣的Frustrum Culling技術的東西。
獲取觀看者的方向矢量和從觀看者到目標的矢量之間的角度。如果該角度小於(FieldOfView/2),則目標位於觀察者的視野內。
如果你的載體是2D或3D,這將工作相同的方式。 (在3D中,如果你有一個視錐體而不是錐體,那麼你需要將角度分成兩個分量。)你只需要找到兩個向量之間的角度。
如果要測試比單個點大的目標,則每個目標都需要多個點,例如邊界框的拐角。如果從觀察者到這些點中的任何一個的矢量在視野內給出一個角度,則該框的該角是可見的。
我曾經在視頻遊戲行業工作過,我可以說每個框架都做arccos這樣的trig函數並不理想。相反,你預先計算角度的餘弦的錐:
float cos_angle = cos(PI/4); // 45 degrees, for example
然後,您可以快速檢查每一幀,如果一個點通過比較與錐體的點積和落入錐內。
vector test_point_vector = normalize(test_point_loc - cone_origin);
float dot_product = dot(normalized_cone_vector, text_point_vector);
bool inside_code = dot_product > cos_angle;
沒有三角函數,只是一些乘法,除法和加法。大多數遊戲引擎都有一個優化的矢量歸一化()函數。
這工作,因爲這個等式:
A · B = |A| * |B| * cos(Θ)
如果規範化向量(A - >的),公式被簡化:
An · Bn = cos(Θ)
謝謝你。我喜歡限制每幀三角函數的數量。我肯定會考慮嘗試這一個(可惜,只有一次考試完成)。 – AshtonKJ 2008-11-03 05:21:48
好的答案已,但我只是想給你一個鏈接到Wolfire博客的鏈接,他們最近開始了一個以「視場」方程爲例的代數系列。 Go read it,它寫得很好,很容易。
謝謝,正是我在找的東西。我認爲這可能是基於我已有的最簡單的方法。 – AshtonKJ 2008-10-15 05:42:27