您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么使用C# WPF實(shí)現(xiàn)動(dòng)態(tài)3D光照效果”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“怎么使用C# WPF實(shí)現(xiàn)動(dòng)態(tài)3D光照效果”文章能幫助大家解決問(wèn)題。
接下來(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>
由于此前一直是白光照明,所以有些枯燥,故而接下來(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光照效果”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。