【问题标题】:Useful lighting of a single-colored 3D object in a WPF Viewport3DWPF Viewport3D 中单色 3D 对象的有用照明
【发布时间】:2010-10-03 05:46:18
【问题描述】:

我有一个房子的 3D 模型,屋顶是看不见的,所以房间可以看到 (如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 个光源,如果可以,它们是相加的吗?只是想知道同时使用定向光源(根据表面方向提供不同的照明)和环境光源(照亮所有表面)是否可行。
  • 我认为你的表面是黑色的原因是因为它们远离光源,而不是因为它们“几乎垂直于相机”。正如漂移指出的那样,2 盏灯应该可以解决这个问题。
  • 是的,它们在 WPF 中是附加的。我试过一次,但对结果并不满意。也许我应该利用这些光源的力量。

标签: c# wpf lighting viewport3d


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 谢谢你的作品。但我必须记住,这种方法可能不是最好的。理论上,总是至少有两个面具有不同的法线,每个区域获得相同数量的光。在我的情况下,这并不重要,因为所有的墙都沿着轴,所以我只需要考虑 6 个法线。
    猜你喜欢
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多