回答
你正在尋找的是一個空間分區方案。處理這個問題有很多選擇,並且在這方面也有大量的研究。克里斯特愛立信的Real-Time Collision Detection是一個很好的閱讀。
該書中涵蓋的一個簡單方法是定義一個網格,將所有對象分配給它相交的所有單元格,並且沿着與該線相交的網格單元前後移動,與與該網格單元格關聯的每個對象相交。請記住,一個對象可能與更多的網格單元格相關聯,所以計算出的交點可能實際上不在當前單元格中,但實際上稍後。
下一個問題將是你如何定義該網格。不幸的是,沒有一個好的答案,你需要考慮哪種方法最適合你的情況。其他感興趣的分區方案是不同的樹結構,如kd-,Oct-和BSP-trees。你甚至可以考慮使用與網格相結合的樹木。
編輯
正如指出的那樣,如果你的設置實際上是這三樣東西,你肯定更好的只是每一個相交,並只挑選最早的。如果你正在尋找射線球,射線柱等交叉點測試,這些並不是很難,而且一個快速谷歌應該提供你可能需要的所有數學。 :)
「計算效率」取決於該集有多大。
對於一小組三個,只是依次測試它們中的每一個,它是真的不值得嘗試優化。
對於較大的集合,查看劃分空間的數據結構(例如KD-Trees)。整個章節(甚至整本書)都致力於解決這個問題。我最喜歡的參考書是An Introduction to Ray Tracing(編輯安德魯·S。格拉斯納)
或者,如果我誤解你的問題,你實際上需要的算法對於特定類型的對象射線對象路口,見同一本書!
我假設你有一個射線d =(dx,dy,dz),從o =(ox,oy,oz)開始,你可以找到參數t,使得交點p = o + d *噸。 (類似於this頁面,其描述了使用P2-P1作爲d,P1作爲o和u作爲t的射線平面相交)
我會問的第一個問題是「這些物體是否相交」?
如果不是那麼你可以作弊一點,並檢查有序的射線碰撞。由於您有三個物體可能會或不會每幀移動,因此需要預先計算它們距相機的距離(例如,從它們的中心點)。依次測試每個物體,通過距相機的距離,從最小到最大。雖然空白空間是現在渲染中最昂貴的部分,但這比僅對三者進行測試並取最小值更有效。如果你的圖像高分辨率,那麼這是非常有效的,因爲你在像素數量上分攤成本。
否則,對所有三種,並採取最小值...
在其他情況下的測試,你可能想使這兩種方法的混合體。如果您可以按順序測試兩個對象(例如,沿着圓柱形隧道向下移動一個球體和一個立方體),但測試第三個並獲取最小值以查找最終對象。
那麼,這取決於你真的想做什麼。如果您希望爲簡單場景中的幾乎每個像素生成一個正確的解決方案,一個非常快速的方法是預先爲每個像素預先渲染所有對象的「前面有什麼」使用掃描轉換(也稱爲z緩衝區)將顏色轉換爲背景項目緩衝區。這有時被稱爲項緩衝區。
使用該預計算,您可以知道將要拍攝到場景中的幾乎所有光線都可見。因此,您的光線環境相交問題會大大簡化:每條光線都會碰到一個特定的物體。
當我在做這個many years ago時,我正在製作一些公認的簡單場景的實時光線追蹤圖像。我在相當一段時間裏沒有重新訪問過這些代碼,但是我懷疑用現代編譯器和圖形硬件的性能會比我看到的好幾個數量級。 PS:當我在90年代初期進行文獻搜索時,我首先閱讀了關於物品緩衝區的想法。我最初發現它在(我相信)從70年代後期的ACM文件中提到。可悲的是,我沒有可用的源代碼,但簡而言之,這是一個非常古老的想法,並且非常適合掃描轉換硬件。
- 1. 從另一個點計算最近點的最佳方法是什麼?
- 2. 有沒有一種有效的方法來計算給定的一組線段之間的交點數量?
- 3. 有效處理物體間碰撞檢測的最佳方法是什麼?
- 4. 你如何計算一個物體與另一個物體之間的角度?
- 5. 什麼是計算最近點的有效方法?
- 6. 計算一組點的散列碼的最佳方式是什麼?
- 7. 計算2個整數座標點之間距離的最有效方法是?
- 8. 什麼是計算時間跨度的最佳方法?
- 9. 什麼是最有效的方法來找到Python中的一條線和一個圓的交點?
- 10. 計算一段時間內行駛距離的最佳方法是什麼?
- 11. 圍繞一組DisplayObject計算邊界框的最佳方法是什麼?
- 12. 獲得當月第一天的最有效方法是什麼?
- 13. 計算Vuejs中DOM元素之間距離的最佳方法是什麼?
- 14. 在R中有效計算一點和一組點之間的所有距離
- 15. 什麼是射線交點間隔?
- 16. 計算線段之間的交點
- 17. 將一組物品分類到桶中的最有效方法是什麼?
- 18. 觀察文件的最佳方法
- 19. 從數組中刪除第一個元素的最佳方法是什麼?
- 20. 「用功能裝飾物體」的最佳方法是什麼?
- 21. 優雅的方式確定時間點之間的最後一次觀察?
- 22. 計算每行DataFrame中第一個有效值和最後一個有效值之間的差異?
- 23. 組合2個可觀察物體,以便只有當第二個發射時才發出下一個值
- 24. Android:計算兩個位置之間距離的最佳方法
- 25. 用一般參數映射路線的最佳方法是什麼?
- 26. SQL Server計算當前行和下一行之間的datediff的最佳方法是什麼?
- 27. 地圖計算點之間的最佳路線
- 28. 在Java中計算xml節點的最有效方法是什麼
- 29. 將元素更新爲可觀察數組的最佳方式是什麼?
- 30. 將同一個字符串分組在一起的最佳算法是什麼?
分區對於3個對象來說是矯枉過正的。認爲最好解釋downvote ... – jheriko 2009-02-02 18:41:43