C# WPF實(shí)現(xiàn)動(dòng)態(tài)3D光照效果
交互式調(diào)節(jié)光效
接下來(lái)想動(dòng)態(tài)實(shí)現(xiàn)光照效果,即如下圖所示

看到這個(gè)滾動(dòng)條,大家可能馬上想到,將Slider和Light的內(nèi)容綁定在一起似乎更容易實(shí)現(xiàn)。所以第一步就是把光效和幾何模型分開(kāi),其著手點(diǎ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就是光效,而且是最普通的全部照亮。相應(yīng)地更改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);
}
接下來(lái)則著手改造xml端的光效,方法是將SpotLihght的內(nèi)外尺寸和Slider綁定在一起。這個(gè)操作大家應(yīng)該是比較熟悉的了,畢竟早在畫(huà)立方體的時(shí)候就已經(jīng)演示過(guò)了。
首先,用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>
給地球點(diǎn)顏色看看
由于此前一直是白光照明,所以有些枯燥,故而接下來(lái)用不同顏色的光照明,其效果為

顏色也是光效的一部分,但由于顏色并不是單個(gè)的數(shù)值,從而難以直接綁定,但其Slider代碼和sInner是差不多的,對(duì)于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寫(xiě)為
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是個(gè)全局變量,當(dāng)所有界面初始化完成之后設(shè)為T(mén)rue。
到此這篇關(guān)于C# WPF實(shí)現(xiàn)動(dòng)態(tài)3D光照效果的文章就介紹到這了,更多相關(guān)C# WPF動(dòng)態(tài)3D光照內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c#中的virtual方法及應(yīng)用場(chǎng)景分析
在 C# 中,virtual?關(guān)鍵字用于修飾方法、屬性、索引器或事件,這篇文章主要介紹了c#中的virtual方法及應(yīng)用場(chǎng)景分析,需要的朋友可以參考下2025-03-03
C#操作SQLite數(shù)據(jù)庫(kù)幫助類(lèi)詳解
這篇文章主要介紹了C#操作SQLite數(shù)據(jù)庫(kù)幫助類(lèi),詳細(xì)分析了C#針對(duì)sqlite數(shù)據(jù)庫(kù)的連接、查詢(xún)、分頁(yè)等各種常見(jiàn)操作的實(shí)現(xiàn)與封裝技巧,需要的朋友可以參考下2017-07-07
C#連接SQLite數(shù)據(jù)庫(kù)并實(shí)現(xiàn)基本操作
本文介紹了SQLite,一個(gè)輕量級(jí)的跨平臺(tái)數(shù)據(jù)庫(kù)管理系統(tǒng),以及如何在C#中使用System.Data.SQLite庫(kù)進(jìn)行操作,包括創(chuàng)建、修改和查詢(xún)數(shù)據(jù)庫(kù),以及使用SQLiteHelper類(lèi)簡(jiǎn)化SQL使用,此外,還提到了DB文件查看工具SQLiteSpy的應(yīng)用,需要的朋友可以參考下2024-12-12
C# 復(fù)制指定節(jié)點(diǎn)的所有子孫節(jié)點(diǎn)到新建的節(jié)點(diǎn)下
這篇文章主要介紹了C# 復(fù)制指定節(jié)點(diǎn)的所有子孫節(jié)點(diǎn)到新建的節(jié)點(diǎn)下的相關(guān)資料,非常不錯(cuò)具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10
c# 獲取數(shù)據(jù)庫(kù)中所有表名稱(chēng)的方法
在很多情況下我們需要將指定的數(shù)據(jù)庫(kù)中的所有表都列出來(lái)。在使用c#進(jìn)行軟件開(kāi)發(fā)時(shí),我們有哪些方法可是實(shí)現(xiàn)這個(gè)目的呢?本人對(duì)此進(jìn)行概要的總結(jié),有以下6中方式可以實(shí)現(xiàn)這個(gè)目的。2010-02-02

