【问题标题】:Confusion about PointLight attenuation in WPF 3DWPF 3D中关于PointLight衰减的困惑
【发布时间】:2014-02-13 07:03:27
【问题描述】:

这是在Viewport3D 元素中显示的管的Model3D

管子很长,所以我将纹理分段显示,以节省内存。

为了隐藏有限模型管末端的小黑圈,我添加了PointLight

但是,无论我选择ConstantAttenuationLinearAttenuationQuadraticAttenuation的哪个值,光衰太快,模型太暗。

我尝试添加AmbientLight,但这会立即使隧道的尽头可见并破坏真实感(用户永远不应注意到模型是有限的 - 它会移动纹理或相机并在相机周围保持相同的光线) .

如何仅使用PointLight 来增加光线?

我知道衰减因子公式是:

ConstantAttenuation + LinearAttenuation * D + QuadraticAttenuation * D^2

其中 D 是与光源的距离。

然后将光强度除以计算出的因子。但是,当我使用ConstantAttenuation1 并设置其他0 时,根本不应该有衰减(所有点的因子都是1,距离不起作用)。然而模型仍然显示出光线衰减......

代码:

this.pointLight = new PointLight
                            {
                                Position = new Point3D(0.0, 0.0, 0.0),
                                Color = Colors.White,
                                ConstantAttenuation = 1.0,
                                LinearAttenuation = 0.0,
                                QuadraticAttenuation = 0.0
                            };

【问题讨论】:

    标签: wpf 3d light


    【解决方案1】:

    您的问题可能与点光源无关,但随着距离的增加和模型上相同的法向量,光线照射到表面的角度会有所不同,因此反射的光线会越来越少,因此距离越远。网格会显得越来越暗。与其他灯光相反的环境光会忽略法线,这就是您看到整个模型的原因。

    使用以下代码,您的所有网格将反射相同数量的光,无论它们有多远,然后您可以使用衰减来使更远的地方更暗。

        meshGeometry3D.Normals.Clear();
        foreach (Point3D point in meshGeometry3D.Positions)
        {
            meshGeometry3D.Normals.Add(camera.Position-point);
        }
    

    或者您可以保留点光源设置并稍微调整法线。

    Pointlight 也有 Range 属性,但它仅用于在需要时直接限制 Pointlight 的范围,因此对您没有帮助。

    【讨论】:

    • 你试过玩法线吗?正如我所写的那样,您将 PointLight 强度设置为尽可能大,因此更改法线似乎是提高管内可见度的唯一方法。如果您发现了其他选项,请告诉我们...
    • 谢谢。相机必须随着光线平稳移动,因此实时更新所有法线会很乏味。但是还是感谢您的回答,它解决了问题。我终于添加了更多点光源,以尽可能少地更新模型。
    猜你喜欢
    • 1970-01-01
    • 2013-02-21
    • 2019-05-17
    • 2020-03-06
    • 2016-03-16
    • 2013-07-27
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    相关资源
    最近更新 更多