多边形KML中的Z-fighting问题

时间:2014-08-25 12:57:27

标签: opengl 3d rendering kml tessellation

我正在尝试在地面以上的KML中创建一个多边形。当多边形尺寸较小时,它可以正常工作,但是当多边形很大时,由于Z-fighting,它看起来很奇怪。我也试过镶嵌,但结果是一样的。

    <?xml version="1.0" encoding="UTF-8"?>
    <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom">
      <Document>
        <name>KmlFile</name>
        <StyleMap id="TS">
          <Pair>
            <key>normal</key>
            <styleUrl>#TS0</styleUrl>
          </Pair>
          <Pair>
            <key>highlight</key>
            <styleUrl>#TS1</styleUrl>
          </Pair>
        </StyleMap>
        <Style id="TS0">
          <LineStyle id="TSLine">
            <color>7f0000c0</color>
            <width>2</width>
          </LineStyle>
          <PolyStyle id="TSPoly">
            <color>7f0000c0</color>
          </PolyStyle>
        </Style>
        <Style id="TS1">
          <LineStyle id="TSLine">
            <color>7f0000c0</color>
            <width>2</width>
          </LineStyle>
          <PolyStyle id="TSPoly">
            <color>7f0000c0</color>
          </PolyStyle>
        </Style>
        <Placemark>
          <name>Z-fighting issue with polygon</name>
          <description>
            Tessellation not working
          </description>
          <styleUrl>#TS</styleUrl>
          <Polygon>
            <tessellate>1</tessellate>
            <altitudeMode>relativeToGround</altitudeMode>
            <outerBoundaryIs>
              <LinearRing>
                <coordinates>
                  108.71,17.38,785 106.74,16.93,785 106.69,16.52,785 107.66,16.06,785 107.29,15.82,785 107.71,15.46,785 107.45,14.4,785 107.84,13.24,785 107.57,12.34,785 105.82,11.51,785 106.15,10.83,785 105.39,10.85,785 104.56,10.3,785 103.96,10.53,785 102.71,8.880000000000001,785 103.02,7.04,785 105.56,7.04,785 108.04,7.04,785 111.22,8.9,785 114.02,10.47,785 114.02,12.72,785 113.98,14.53,785 112.24,14.41,785 110.23,16.06,785 108.71,17.38,785
                </coordinates>
              </LinearRing>
            </outerBoundaryIs>
          </Polygon>
        </Placemark>
      </Document>
    </kml>

此问题的任何解决方案?

1 个答案:

答案 0 :(得分:0)

问题是地球是弯曲的,并且使用绝对 relativeToGround altitudeMode的KML中的多边形 NOT 跟随地球的曲率和切割地球的表面,如下图所示。这会导致多边形位于与地球相交的平面上,使边缘处于适当的高度,但中心切入海洋表面。

第二个问题是tessellation仅在<altitudeMode>的值为clampToGround或clampToSeaFloor时启用。绝对和相对高度忽略了细分。

如果将altitudeMode更改为clampToGround,则整个多边形将遵循地面/海洋的曲率,多边形将在海洋上方。只有这样才能启用曲面细分。

但是,要在地面上表示多边形,唯一的解决方法是创建较小的多边形区域,其大小足够小,不会受到地球曲率的影响。尝试将多边形细分为4个较小的多边形。如果这不起作用,那么将每个细分为4个多边形。

有关详情,请参阅第6.3.3节中的OGC KML 2.2 spec

KML Polygon interpolation with absolute altitude