【问题标题】:Defining the drawing order of polygons定义多边形的绘制顺序
【发布时间】:2021-06-04 10:49:43
【问题描述】:

我在等轴测中工作。我有一组形成特定身体的多边形。多边形由坐标为 x、y 和 z 的一些点组成,它们位于同一平面上。多边形彼此不相交。绘制时,我想确保首先绘制最远的多边形,然后是靠近的多边形(这样近的多边形似乎与最远的多边形重叠)。我试图通过它们的点坐标总和的算术平均值对多边形进行排序,按坐标总和最大的点,依此类推。但在某些情况下,这并没有给出预期的结果。如何确定绘制多边形的顺序以便最后绘制最近的?

【问题讨论】:

  • 这并不简单,因为您的平面不平行于投影平面。对于每一对平面 A、B,您必须找到它的交线,然后找到可以看到的半个平面。

标签: 3d geometry polygon transformation


【解决方案1】:

好消息是您的多边形是平面的并且不会相互交叉。通过这种方式,每个多边形都在它们的角可以找到的最小和最大深度之间扩展。使用几乎所有的 3D 到 2D 投影方法(如 here 描述的方法),在对每个点进行变换后,得到一个 3D 点。这些点的第一个和第二个坐标用于二维绘图,第三个坐标被丢弃。这第三个坐标表示点的深度,可用于对多边形进行排序。

当不能使用Z-buffer 时,要手动绘制三维对象,多边形必须先按最大深度排序,然后再按最小深度排序。但是在实现排序算法时,必须注意floating point errors。假设为每个多边形计算角的最小和最大深度。排序算法可能是这样的:

for i = 0 to n-2
  for j = i+1 to n-1
    if (p[j].MaxD < p[i].MaxD - eps) or 
       ((abs(p[j].MaxD - p[i].MaxD)<eps) and
        (p[j].MinD < p[i].MinD - eps)) then
        swap(p[i], p[j])
    end if
  end for
end for
        

,其中eps 是一个非常小的正值,例如1e-10.

【讨论】:

  • 抱歉,我不太清楚如何计算最小和最大深度。知道多边形点(x、y、z坐标)和多边形的平面方程如何找到它们?
  • @Ivan 点的深度不是只能根据点的坐标来计算的东西,另一个重要的参数是视点(相机)的位置和特性。想象在空间中有一个与您的显示器屏幕平行的假设平面。为了绘制 3D 场景,我们将所有点投影在这个虚拟平面上。点的深度是从该点到这个假设平面的最近距离。
  • @Ivan 因此,找到点的深度与您用于将点从其实际 3D 空间转换到 2D 绘图平面的数学完全相关。
  • 我是否正确理解最大深度将是从最近点到相机的距离?可以把相机当成平面吗(等距的情况下,平面由三个点给定,例如(x y z order) (1,0,0) (0,1,0) (0,0,1))与观察者平行,任务被简化为找到点到这个平面的距离?找到的最小距离就是最小深度,最大距离就是最大深度?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 2018-03-11
  • 2011-12-30
  • 2013-02-28
相关资源
最近更新 更多