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

标签 c# wpf lighting viewport3d

我有一个房子的 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”发表评论后编辑

最佳答案

就我个人而言,我发现通过组合两种灯可以达到“最佳”效果。

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

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

关于c# - WPF Viewport3D 中单色 3D 对象的有用照明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3847474/

相关文章:

c# - 什么是 C# 中的内部设置属性?

wpf - 在wpf autocompletebox中,滚动条不会随着向上键移动

c# - 二维瓷砖照明

c++ - 如何停止位置灯随相机移动

c++ - opengl光减少反射

c# - PHP 中的 SQL 更新

c# - 从 Microsoft Chart 控件获取鼠标单击事件单击数据标记

.net - 如何在样式中使用附加属性?

c# - 当 AutoGenerateColumns 设置为 True 时,如何停止在 DataGrid 中生成特定列?

c# - 如何在 C# 中使用通用接口(interface)从子对象引用父对象?