2010-03-16 59 views
3

在編寫模型編輯器時,除了啓用光線跟蹤之外,我還可以考慮一些操作,我希望找到關於光線與三角形貝塞爾貼片之間交點的非常好的近似值。檢測並找到相交線與立方貝塞爾三角形

如何做到這一點?我知道幾種方式,但可能有更好的方法。

確切的使用案例:我可能想使用一個貝塞爾三角形補丁作爲參考面,用鼠標繪製詳細的形狀。我可能也想找出這種補丁的分裂點。

如果有C源代碼的話,我可能也會喜歡。也許甚至使用它而不是滾動我自己的代碼。

回答

2

我建議你實施Triangular Bezier Clipping(PDF)。

但是,另一種可能性是將您的三角形補丁轉換爲張量積Bezier補丁。這樣做的好處是對張量產品Beziers有更多的支持,所以你更可能找到一些你可以使用的代碼。轉換是簡單的:

  • 查看三角形補丁作爲一系列N + 1行的控制點(其中n是度)
    • 的第一行已經1個控制點,且每行具有1個更多控制點比上次
  • 現在,將每個行作爲適當的程度(以度n度0)
  • 度的Bezier曲線提升每行度n
    • 每一行現在將有n + 1個控制點,用n形成n + 1 + 1個網格的控制點
  • 點的該網格,由n個貝塞爾補丁作爲一個度n,是一種與您的三角形相同的表面

只需找到相交點,這應該工作得很好。但是,張量產品補丁是退化的(一端有重合點),所以當你接近退化角時,你可能會發現你正在引入一些數值問題。另外,映射回三角形域可能會使紋理映射等問題變得棘手。所以我建議你使用更直接的三角貝塞爾剪裁,如果你不介意一點實施。

+0

這是我通過搜索找到的一篇論文。在ACM之後我沒有訪問權限,所以感謝您找到它的直接鏈接。 – Cheery

0

我對三角貝塞爾貼片不熟悉,但如果它總是可以包含在一個三角形內,那麼如果射線與三角形相交,它也必須與它內部的曲線相交。

如果以上情況屬實,那麼您可以搜索兩側頂點相交的兩個頂點之間的曲線,以獲得與射線足夠近的點。我想你可以在這個區域的曲線參數上進行二分查找來獲得這一點。

+0

我可以在控制多邊形中使用三角形,但它將無法完全包含貝塞爾補丁。通過特別檢查邊緣,這可以工作。 – Cheery