多边形数学

时间:2009-04-15 20:12:38

标签: math opengl graphics 3d

给定一个点列表,这些点形成一个面向三维空间的简单二维多边形和该多边形的法线,有什么方法可以确定哪些点是特定的“拐角”点?

例如,哪个点位于左下角,右下角或最顶点?多边形可以以任何三维方向定向,所以我很确定我需要对法线做一些事情,但是我无法正确地计算数学。

谢谢!

8 个答案:

答案 0 :(得分:2)

您需要更多信息才能做出决定。一组(共面)点和法线不足以为您提供“左下”或“右上”的概念或任何此类相对识别。

从法线方向查看多边形(使其显示为简单的2D形状)是一个良好的开端,但该形状可以旋转到任意角度。

  1. 您可以使用3D世界中的其他信息来获取坐标系参考吗?

  2. 你想通过了解形状的极端角落来实现什么目标?

答案 1 :(得分:1)

你在寻找一个边界框吗?

我不确定正常与你的要求有什么关系。

要获取边界框,请保留4个变量:MinX,MaxX,MinY,MaxY

然后循环遍历所有点,根据MaxX和MinX检查X值,并根据MaxY和MinY检查Y值,并根据需要更新它们。

循环完成后,您的框被定义为MinX,MinY定义为左上角,MinX,MaxY定义为右上角,依此类推......

回复您的评论:

如果你想在投影后使用你的盒子,你需要的是获得“转换”点。然后应用如上所述的边界框循环。

转换通常意味着投影(场景渲染)后的2D屏幕坐标,但它也可能意味着您投射到的任何平面上的2D点。

答案 2 :(得分:1)

可能的算法是

  1. 通过使用连接两对不同角落的矢量的叉积来找到法线,

  2. 创建一个转换矩阵来旋转多边形,使其在XY空间中更平整(即沿Z轴正常排列)

  3. 计算边界框的坐标或您正在使用的任何其他角落定义(因为多边形现在在2D空间中对齐,这是一个相当简单的问题)

  4. 应用步骤2中使用的变换矩阵的逆矩阵将这些坐标转换回3D空间。

答案 3 :(得分:1)

我认为你的问题需要一些额外的信息 - 即任何一点可被视为“最顶层”或“最左边”的坐标系。

不要忘记,虽然法线告诉你多边形面向哪个方向,但它本身并没有告诉你哪个方向是“向上”。可以围绕正常向量旋转(或“滚动”),并且仍然面向相同的方向。

这就是为什么大多数3D渲染系统都有一个摄像头,它不仅包含“视图”矢量,还包含“向上”和“向右”矢量。对后两者的改变实现了相机在视图矢量周围“滚动”的效果。

答案 4 :(得分:0)

将其投影到飞机上并获得边界框。

答案 5 :(得分:0)

我有一个愚蠢的想法,但有可能获得负面的一点,我会试一试:

  1. 获取最小值/最大值 每个三维轴 指向你的2d多边形。在每个点的值列表上使用循环/迭代器进行单次传递就足够了,只需替换最小值和最大值即可。最终结果是具有“最低”X,Y,Z坐标和“最高”X,Y,Z坐标的列表。
  2. 遍历此min / max列表 创建每个点的值 (“角落”)的“边界框” 围绕物体。结果 应该是一个始终包含的框 无论轴是什么对象 检查或定向(没有点 多边形将超过 你收集的最多或最小数量。)
  3. 然后得到每个“2d的距离 多边形“指向每个角落 在“边界框”上的位置;该 缩短点之间的距离, “更接近”就是那个“角落”。
  4. 远非最佳,肯定很糟糕,但肯定很快。您可以在对象旋转期间对此进行后捕获,只需查找每个旋转的x / y / z值的最小值/最大值,并提前保留这些值的列表。

答案 6 :(得分:0)

如果你可以假设形状存在一些限制,那么你可能会知道更少的信息。例如,如果您的形状是一个小方块的组成,一侧有一个细长的三角形(即一个简单的对称几何体),那么您可以比较每个列表点到“质心”的距离。最大的距离将识别锥体的尖端,第二个最大的距离将是距离锥体的尖端最远的两个点......如果列表中有一些顺序,则像点以逆时针顺序输入(关于正常),你可以识别所有的点。这听起来像是一些计算,所以尝试在形状中加入一些额外的信息可能是合理的,比如“质心”和位于COM上方“向上”的参考点(但不是正常的) )。例如,这将为您提供一个“向上”矢量,您可以将其与法线交叉以定义一些身体坐标。此外,法线可以通过点列表的排序来定义。如果你不能假设形状(或者即使形状是对称的,例如),那么你将需要更多的数据。这取决于你的约束。

答案 7 :(得分:0)

如果您知道3D中的多边形是“平坦的”,则可以使用法线将顶点的所有3D点变换为2D表示(相对于多边形所在的平面的点) - 但是这仍然会让你定义这个坐标系的原点(但这对你的问题并不重要)并且至少有一个轴的方向(如果你想要正交轴,你仍然可以旋转它们你选择的原点) - 这就是麻烦开始的地方。 我建议使用3D坐标系的Y轴,在平面上投影并将结果方向用作“向上” - 但是如果你的计划与Y轴正交,你就会遇到麻烦(现在你可能想要将投影的Z轴用作“向上”)。

数学很简单(你可以使用内积(又称标量积)投影到你的平面和一些矩阵的东西转换成2D坐标系 - 你可以通过谷歌搜索光线追踪算法获得所有这些多边形。