在WPF Viewport3D中有一个单色3D物体的有用光照

3

我有一个房子的3D模型,屋顶是透明的,使得可以看到房间内部(类似于这里)。

但是(目前)我没有纹理,每个表面都是相同的颜色,例如:

var myMaterial = new DiffuseMaterial (new SolidColorBrush(myColor))

如果我在WPF Viewport3D中查看它,我希望能够区分表面。例如,我想知道地板何时结束以及墙壁何时开始。
通过对对象进行照明应该是可能的。我已经尝试过:
环境光不起作用,因为所有表面看起来都是同样的颜色:
myViewport3D.Children.Add(new ModelVisual3D(){Content = new AmbientLight(Colors.White)})

如果我使用定向光并将其位置固定在移动相机上,有些表面法线有时几乎垂直于相机/光源,因此几乎是黑色的,这看起来更加不自然。那么,在WPF Viewport3D中区分单色3D对象的表面的好方法是什么?

2
你能使用两个光源吗?如果可以,它们是可加的吗?我只是想知道是否同时拥有定向光源(根据表面方向提供不同的照明)和环境光源(照亮所有表面)会起作用。 - Jeff Ogata
1
我认为您的表面之所以变黑是因为它们远离光源,而不是因为它们“几乎垂直于相机”。正如“adrift”所指出的那样,使用两个光源应该可以解决这个问题。 - user180326
是的,在WPF中它们是可加的。我曾经尝试过,但对结果不满意。也许我应该尝试一下这些光源的强大功能。 - Janko R
2个回答

4
个人认为,最好的方法是使用两个灯光的组合来实现这一目标。第一个是昏暗(可能只有30%的亮度)的环境光,它能够照亮所有表面。第二个是方向光,大约为80%的白色,跟随相机移动,但偏离30度左右。我发现“在相机左肩上方”的灯光通常是人们期望的。此外,如果你的表面法线不总是正确的,可以使用第三个灯光——另一个指向第一个灯光相反方向的方向光。这将照亮表面的背面,如果你的法线不适当的话。

2
由于您可以使用2个光源,我建议尝试使用一盏暗淡的灯光作为环境背景灯,以及一盏稍强的定向灯来突出表面的对比度。
我不是3D专家,但会这样想:
在一个黑暗的房间里(没有环境光),用手电筒(定向光)照射,您会根据表面与手电筒的角度看到明显的差异。添加一些环境照明,随着环境光源变得更强,这种差异的严酷程度会减小,直到某个点,它会压倒手电筒,使一切都呈均匀照明状态。
祝你好运,希望你能实现你想要的效果。

谢谢,这个方法可行。但是我必须记住这种方法可能不是最好的。理论上,总会有至少两个面具有不同的法线,但是每个面积获得相同的光照量。在我的情况下,这并不重要,因为所有的墙都沿着轴线,所以我只需要考虑6个法线。 - Janko R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接