您将如何从建筑脚印生成建筑阴影?
我有建筑物高度的属性值。
因此,最好使阴影的大小基于此而变化。
使用ArcGIS找到的最佳建议是阴影:http : //blogs.esri.com/Support/blogs/mappingcenter/archive/2008/10/21/3d-effect-for-a-building-footprints.aspx
您将如何从建筑脚印生成建筑阴影?
我有建筑物高度的属性值。
因此,最好使阴影的大小基于此而变化。
使用ArcGIS找到的最佳建议是阴影:http : //blogs.esri.com/Support/blogs/mappingcenter/archive/2008/10/21/3d-effect-for-a-building-footprints.aspx
Answers:
一种快速且肮脏的方法是仅绘制建筑物屋顶的阴影,将其渲染为深灰色(如果存在任何底层地面,则最好为半透明),然后在其上绘制建筑物多边形。屋顶阴影是通过在由光源的方位角和海拔高度(被认为是无限远的)确定的方向上将建筑物多边形平移建筑物高度确定的距离而获得的。(下面显示了翻译量的公式。)
除了低海拔或较高的建筑物(例如摩天大楼)外,这似乎都可以正常工作:请查看右侧较高的隔离建筑物的阴影如何与建筑物本身分开。
要将阴影正确连接到建筑物,您需要包括建筑物墙壁的阴影。 这并不难。在位于P的一个点和位于Q的另一个点之间延伸的墙的阴影将是{P,Q,Q',P'}所描绘的四边形,其中Q'是Q的阴影,P'是Q的阴影P。多边形建筑物将是由闭合的点序列(P(1),P(2),...,P(n))表示的连接多边形的集合。对于每个这样的多边形,形成边缘(P(1),P(2)),(P(2),P(3)),...,(P(n),P( 1))。通过边缘上的循环可以很容易地做到这一点。
对于在方位光一个度(东北部)和海拔小号度(从地平线),点P与投影坐标(x,y)和高度的阴影ħ(在相同的单元中的所有表达,例如米)位于P'=(x-h sin(a)/ tan(s),y-h cos(a)/ tan(s))。您只需为整个层计算一次sin(a)/ tan(s)和cos(a)/ tan(s),并且对于每个多边形,您只需要将这些因子乘以高度即可获得多边形中的每个点阴影。(真正的计算工作量由GIS承担,而不是您的代码,因为它形成了所有这些四边形的并集。)
这是效果的一个例子。 (与第一个数字相比,方位角和高度略有变化,但是建筑物的多边形和高度(有所不同)与以前相同。)
响应请求,以下是用于创建第二个示例的代码。尽管几乎没有人再使用此语言(Avenue),但它很可能用作在您喜欢的GIS中创建解决方案的伪代码。(但是,与大多数伪代码不同,它已经通过实际运行进行过测试。:-)它是如此简单,不需要解释;请注意,索引从0而不是1开始,并且多边形环显式闭合(列表中的最后一点与第一个点重合)。
' S
' Return the shadow of a shape.
' Field calculator example:
' av.run("S", {[shape], [height], 200, 35})
'======================================================================'
theShape = SELF.Get(0) ' A projected polygon
xHeight = SELF.Get(1) ' Expressed in the projected units
xAzimuth = SELF.Get(2).AsRadians ' Any angle (in degrees) east of north
xAltitude = SELF.Get(3).AsRadians ' Angle between 0 and 90 (vertical)
'
' Compute the shadow offsets.
'
xSpread = 1/xAltitude.Tan
x = -xHeight * xSpread * xAzimuth.Sin
y = -xHeight * xSpread * xAzimuth.Cos
xy = x@y
'
' Begin with the original shape.
'
p = theShape.Clone
'
' Adjoin the wall shadows.
'
for each lPts in theShape.AsList ' Loop over the rings
for each i in 1..(lPts.Count-1) ' Loop over edges in this ring
l = {lPts.Get(i-1), lPts.Get(i), lPts.Get(i)+xy, lPts.Get(i-1)+xy}
p = p.ReturnUnion(Polygon.Make({l}))
end
end
return p
' end of script
我认为您所说的(寻找)不会成为arcmap(版本?)的功能。
请参阅此问题,以了解您可能不需要的限制。
利用3d Analyst扩展和arcscene,您可以添加光,但是仍然存在一些限制。
关于cityengine的事情有一些esri运动。
向下滚动到阴影精度部分。
我以前曾与lightscape相关联(已经退休,并且我确定自己生活在3dsmax内部)。
现在,路径可能会通过工程可视化产品线...
3ds Max