【问题标题】:Triangle-Cube/Voxel Intersection三角立方体/体素交点
【发布时间】:2014-03-07 06:54:33
【问题描述】:

检测三角形是否与 3D 空间中的体素/立方体相交的最佳算法是什么?我有这个来源,用 C 语言编写:http://tog.acm.org/resources/GraphicsGems/gemsiii/triangleCube.c。我试图重构这段代码并将其转换为 C++,但我意识到我真的不知道发生了什么。此外,cmets 声明三角形交点与单位立方体进行比较,但是我无法找到一种方法来扩展算法以使用任意立方体/体素。

是否有更清晰的检测三角立方体相交的实现(最好在 C++ 中)?如果没有,对我来说扩展 C 代码以使用任意多维数据集的最佳方法是什么?

提前谢谢你

【问题讨论】:

  • 单位立方体的限制应该不是问题。您可以简单地平移和缩放坐标系,使体素占据与单位立方体相同的空间。

标签: c++ graphics geometry intersection voxel


【解决方案1】:

一个简单的算法是:

  • 计算三角形所在的平面。
  • 找到这个平面和立方体(如果有的话)的交点。
  • 如果没有交叉点,那么问题就解决了。
  • 否则,找到穿过每个三角形边的直线。
  • 对于每条线:如果交叉点在“外侧”,则没有交叉点。
  • 否则会有交叉路口。

如果您对“最佳”算法的标准是简单,那么这将是一个很好的标准。如果您正在寻找性能,可能会有一些更快的性能。

您也可以尝试查看托管在以下位置的代码:

http://fileadmin.cs.lth.se/cs/Personal/Tomas_Akenine-Moller/code/

【讨论】:

  • 这不是一个完整或正确的算法,立方体可以完全位于三角形的中心,与三角形的“面”相交而不与任何边相交。类似地,体素可以位于三角形的平面上,但距离三角形很远,没有相交。
  • 我认为你不懂这个算法。它首先查看 2D 平面和立方体之间的交点,然后检查该交点是否位于三角形之外。该算法从不直接检查三角形边缘和立方体之间的交点。
  • 我同意我不明白你写的东西。那么,第二步和第三步的交集是什么?一个点?一条线?多边形?这是第四步提到的同一个路口吗?当您写“在三角形边缘的外侧”时,您的意思是检查某个点是否位于与三角形穿过该边缘的正交平面定义的左侧或右侧半空间上?我担心如果你在计算这个初始平面立方体交点(点?)时不小心,你最终可能会得到同样的误报和否定。
  • 所有步骤中提到的交集都是一样的。它是包含三角形的平面和立方体的交点。如果它存在,它要么是一个多边形,要么是一个点,很少见。一旦找到这一点,算法只需要考虑位于平面上的二维系统。然后对于穿过三角形边缘的每条线,算法检查原始交点是否位于线的三角形一侧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 2016-07-01
  • 1970-01-01
  • 2020-12-18
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多