3

我有一个房子的 3D 模型,屋顶是看不见的,所以房间可以看到(就像这里

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

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

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

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

环境光不起作用,因为所有表面看起来颜色相同:

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

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

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


在用户“jdv”发表评论后编辑

4

2 回答 2

4

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

  1. 昏暗(可能 30% 亮)的环境光。这始终显示所有表面。
  2. 一个定向光,大约 80% 白色,跟随相机,但偏离了 30 度左右。我发现“相机左肩上方”的光线往往是人们经常期望的。

此外,如果您的表面法线并不总是正确的,您可以使用第三盏灯 - 另一个指向与第一盏相反方向的定向光。如果您的法线不合适,这将照亮曲面的背面。

于 2010-10-02T21:32:13.117 回答
2

由于您可以使用 2 个光源,因此我会尝试使用昏暗的灯光作为环境背景光,并使用更强的定向光来与表面形成对比。

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

在黑暗的房间(无环境光),使用手电筒(定向光),您会看到基于表面与手电筒角度的巨大差异。添加一些环境照明,随着环境光源变得更强,这些差异的刺耳度会降低,直到在某个时候,它会压倒手电筒并且所有东西都显得均匀照明。

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

于 2010-10-02T21:20:43.490 回答