WPF Viewport3D中单色3D对象的有用照明

时间:2010-10-02 20:48:47

标签: c# wpf lighting viewport3d

我有一个3D Modell的房子,屋顶是看不见的,所以可以看到房间 (如here

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

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

如果我在WPF Viewport3D中查看它,我希望能够区分曲面。 例如,我想看看地板何时结束并且墙壁开始。

这应该可以通过点亮对象来实现。我已经尝试过了:

环境光不起作用,因为所有表面看起来都是同色的:

myViewport3D.Children.Add(new ModelVisual3D(){Content = new AmbientLight(Colors.White)})

如果我使用定向光并将其位置固定在移动的相机上,有些表面法线有时几乎垂直于相机/光线,因此几乎是黑色,看起来更不自然。

那么在WPF Viewport3D中区分单色3DObject的表面有什么好方法呢?


在用户“jdv”撰写评论后编辑

2 个答案:

答案 0 :(得分:3)

就我个人而言,我发现这可以通过两盏灯的组合来实现“最佳”。

  1. 昏暗(可能30%点亮)环境光。这始终显示所有表面。
  2. 一个方向灯,大约80%白色,跟随相机,但是关闭30度左右。我发现“在相机的左肩上”的灯光往往是人们常常期待的。
  3. 此外,如果曲面法线并不总是正确的,则可以使用第三个光 - 另一个方向光指向第一个光线的相反方向。如果您的法线不正确,这将点亮曲面的背面。

答案 1 :(得分:2)

由于你可以使用2个光源,我会尝试使用昏暗的光线作为环境背景光,并使用稍微强一些的方向光来对比表面。

我不是3D专家,但会这样想:

在黑暗的房间(没有环境光线),使用手电筒(定向灯),您将看到基于表面与手电筒角度的显着差异。添加一些环境光线,随着环境光源变强,这些差异的粗糙程度会降低,直到某个时刻,它会超过手电筒并且所有东西都显得均匀亮起。

祝你好运,希望你能够达到你想要的效果。