2014-02-11 98 views
0

這裏點光源衰減是管的Model3DViewport3D元件內顯示:混淆在WPF 3D

enter image description here

管很長,所以我切成段顯示紋理只是一個段,以節省存儲器。

爲了隱藏有限模型管末端的小黑圈,我添加了一個PointLight

但是,無論我選擇哪一個ConstantAttenuationLinearAttenuationQuadraticAttenuation的值,光線過快掉落,模型太暗。

我嘗試添加一個AmbientLight,但這會立即使隧道的末端變得可見並破壞真實感(用戶永遠不應該注意到模型是有限的 - 它會移動紋理或相機並保持相機周圍的sime光)。

如何使用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 
          }; 

回答

1

到可能POINTLIGHT但事實上,不斷增長的距離,並在模型相同的法向量,角度您的問題將不相關在這種情況下,光線照射到表面的方式會有所不同,因此反射越來越少的光線,因此其他網格會變得越來越黑暗。與其他燈光相反的環境光線會忽略法線,這就是您看到整個模型的原因。

使用下面的代碼,無論你有多遠,你的所有網格物體都會反射相同數量的光線,然後你可以使用衰減來使距離更遠。

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

或者您可以保留您的Pointlight設置並調整一點法線。

Pointlight還具有Range屬性,但如果您需要它,它僅用於限制您的點光源的範圍,因此它不會對您有所幫助。

+0

您是否嘗試過玩法?正如我在最大可能的情況下用你的設置PointLight強度寫的,所以改變法線似乎只是如何增加管內可見度的方法。如果你找到其他選擇,請讓我們知道... – het2cz

+0

謝謝。相機必須平穩移動,因此實時更新所有法線會很乏味。不過謝謝你的回答,它解決了這個問題。 我終於添加了更多的點光源,以儘可能少地更新模型。 – Libor