2011-03-17 69 views
0

假設我有一個由其位置和方向定義的相機,以及由其中心和範圍(從盒子中心到面部中心的三個正交矢量)定義的盒子。當其外表面朝向相機時,臉部可見,當其內表面朝向相機時,臉部不可見。Box背面剔除

看起來很明顯,取決於盒子的位置和方向,盒子可能有1-3個可見面。有沒有一些聰明的方法來確定哪些面是可見的?一個顯而易見的解決方案是計算面部法線的6個點積與每個面部的面部相機向量。有沒有更好的辦法?

注意:將使用透視投影,但我認爲它不重要,「面對相機」的屬性似乎獨立於投影。

回答

2

我相信你描述的方法是做這件事的正常方法。這是一個非常快速的計算,所以你不應該擔心速度太快。這與他們使用相同的方法來減少光線三角交點算法的計算次數。如果臉部的前部不可見,則該方法不會繼續計算該臉部。有關此算法的C++實現,請參閱本文。這是在計算的前半部分。 http://jgt.akpeters.com/papers/MollerTrumbore97/code.html

2

唯一的巧妙之處在於,如果立方體的一個面是可見的,那麼相反的面就絕對不是。至少在一個規則的透視投影。

請注意,相反的情況可能並非如此:如果一張臉不可見,反面也可能看不見。這是因爲投影的類型很重要。想象一下,立方體真的靠近相機,它正直視一張臉。然後稍微旋轉立方體,並在平行投影的同時,另一張臉立即可見,在透視投影中不會發生。

+0

謝謝,我現在可以看到我對投影錯了。使用平行投影時,剔除會更容易一些,點積可能與投影方向相反,因此不需要計算每個面的偏移量。 – Suma 2011-03-17 14:54:26

+0

@Suma如果您的相機始終處於(0,0,0)並與一個軸對齊(通常朝向Z軸的正端),許多計算變得更加容易。例如,攝像機臉部矢量就是臉部點的座標。 – biziclop 2011-03-17 15:01:40