C# WPF實現(xiàn)動態(tài)3D光照效果
交互式調(diào)節(jié)光效
接下來想動態(tài)實現(xiàn)光照效果,即如下圖所示
看到這個滾動條,大家可能馬上想到,將Slider
和Light
的內(nèi)容綁定在一起似乎更容易實現(xiàn)。所以第一步就是把光效和幾何模型分開,其著手點自然是mainViewport
,將其內(nèi)部填充如下內(nèi)容。
<Viewport3D Name="mainViewport"> <Viewport3D.Camera> <PerspectiveCamera x:Name="camera"/> </Viewport3D.Camera> <ModelVisual3D x:Name="visual3d"> <ModelVisual3D.Content> <Model3DGroup x:Name="MainGroup"> <AmbientLight Color="White"/> </Model3DGroup> </ModelVisual3D.Content> </ModelVisual3D> </Viewport3D>
其中,AmbientLight
就是光效,而且是最普通的全部照亮。相應地更改cs
端的代碼,主要變化為
private void initialize3D() { DefineCamera(mainViewport); DefineModel(MainGroup); } private void DefineCamera(Viewport3D viewport) { camera = new PerspectiveCamera(); camera.FieldOfView = 60; new Ctrl(camera, viewport, this, viewport, viewport); } MeshGeometry3D mesh; private void DefineModel(Model3DGroup group) { // 生成曲面. mesh = SetEarth(50, 50); ImageBrush smileyBrush = new ImageBrush(); smileyBrush.ImageSource = new BitmapImage(new Uri("cs3d_8.jpg", UriKind.Relative)); SurfaceModel = new GeometryModel3D(mesh, new DiffuseMaterial(smileyBrush)); group.Children.Add(SurfaceModel); }
接下來則著手改造xml
端的光效,方法是將SpotLihght
的內(nèi)外尺寸和Slider
綁定在一起。這個操作大家應該是比較熟悉的了,畢竟早在畫立方體的時候就已經(jīng)演示過了。
首先,用DockPanel
布局,將Slider
放在上面的WrapPanel
中。
<DockPanel LastChildFill="True"> <WrapPanel DockPanel.Dock="Top"> <WrapPanel DockPanel.Dock="Top" Margin="0 0 10 0"> <WrapPanel> <TextBlock Text="Inner"/> <Slider Width="200" Value="3" Maximum="20" Minimum="1" x:Name="sInner"/> <TextBox Text="{Binding ElementName=sInner,Path=Value, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Margin="0 5" Width="30"/> </WrapPanel> <WrapPanel Margin="10 0 0 0"> <TextBlock Text="Outer"/> <Slider Width="200" Value="10" Maximum="30" Minimum="1" x:Name="sOuter"/> <TextBox Text="{Binding ElementName=sOuter,Path=Value, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Margin="0 5" Width="30"/> </WrapPanel> </WrapPanel> <Viewport3D Name="mainViewport"> </Viewport3D> </DockPanel>
給地球點顏色看看
由于此前一直是白光照明,所以有些枯燥,故而接下來用不同顏色的光照明,其效果為
顏色也是光效的一部分,但由于顏色并不是單個的數(shù)值,從而難以直接綁定,但其Slider代碼和sInner是差不多的,對于RGB通道,分別建立如下的區(qū)塊。
<WrapPanel Margin="5"> <TextBlock Text="R"/> <Slider Width="200" Value="150" Maximum="255" Minimum="0" x:Name="sColorR" ValueChanged="colorChanged"/> <TextBox Text="{Binding ElementName=sColorR,Path=Value, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" Margin="0 5" Width="30"/> </WrapPanel>
然后將colorChanged寫為
private void colorChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { if (!isInit) return; mySpotLight.Color = Color.FromRgb( (byte)sColorR.Value, (byte)sColorG.Value, (byte)sColorB.Value); }
其中,isInit是個全局變量,當所有界面初始化完成之后設為True。
到此這篇關于C# WPF實現(xiàn)動態(tài)3D光照效果的文章就介紹到這了,更多相關C# WPF動態(tài)3D光照內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C#編程報錯System.InvalidOperationException問題及解決
這篇文章主要介紹了C#編程報錯System.InvalidOperationException問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05C#實現(xiàn)動態(tài)數(shù)據(jù)繪圖graphic的方法示例
這篇文章主要介紹了C#實現(xiàn)動態(tài)數(shù)據(jù)繪圖graphic的方法,結(jié)合實例形式分析了C#根據(jù)動態(tài)數(shù)據(jù)繪制2D數(shù)據(jù)表格的相關操作技巧,需要的朋友可以參考下2017-09-09C#滑動驗證碼拼圖驗證功能實現(xiàn)(SlideCaptcha)
目前網(wǎng)站上的驗證碼機制可謂是五花八門,有簡單的數(shù)字驗證,有摻雜了字母和文字的混淆驗證,還有通過滑塊進行的拼圖驗證,下面這篇文章主要給大家介紹了關于C#滑動驗證碼拼圖驗證功能的實現(xiàn)方法,需要的朋友可以參考下2022-04-04C#獲取鼠標在listview右鍵點擊單元格的內(nèi)容方法
下面小編就為大家?guī)硪黄狢#獲取鼠標在listview右鍵點擊單元格的內(nèi)容方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01C#中數(shù)組Array,ArrayList,泛型List詳細對比
關于數(shù)組Array,ArrayList,泛型List,簡單的說數(shù)組就是值對象,它存儲數(shù)據(jù)元素類型的值的一系列位置.Arraylist和list可以提供添加,刪除,等操作的數(shù)據(jù). 具體如何進行選擇使用呢,我們來詳細探討下2016-06-06