最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# WPF實現(xiàn)動態(tài)3D光照效果

 更新時間:2023年03月01日 09:27:35   作者:微小冷  
這篇文章主要為大家詳細(xì)介紹了如何利用C# WPF實現(xiàn)動態(tài)3D的光照效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

交互式調(diào)節(jié)光效

接下來想動態(tài)實現(xiàn)光照效果,即如下圖所示

看到這個滾動條,大家可能馬上想到,將SliderLight的內(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就是光效,而且是最普通的全部照亮。相應(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);
}

接下來則著手改造xml端的光效,方法是將SpotLihght的內(nèi)外尺寸和Slider綁定在一起。這個操作大家應(yīng)該是比較熟悉的了,畢竟早在畫立方體的時候就已經(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是個全局變量,當(dāng)所有界面初始化完成之后設(shè)為True。

到此這篇關(guān)于C# WPF實現(xiàn)動態(tài)3D光照效果的文章就介紹到這了,更多相關(guān)C# WPF動態(tài)3D光照內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#異常處理總結(jié)及簡單實例

    C#異常處理總結(jié)及簡單實例

    這篇文章主要介紹了C#異常處理總結(jié)及簡單實例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • c#中的virtual方法及應(yīng)用場景分析

    c#中的virtual方法及應(yīng)用場景分析

    在 C# 中,virtual?關(guān)鍵字用于修飾方法、屬性、索引器或事件,這篇文章主要介紹了c#中的virtual方法及應(yīng)用場景分析,需要的朋友可以參考下
    2025-03-03
  • Unity3D如何獲取時間戳或北京時間

    Unity3D如何獲取時間戳或北京時間

    這篇文章主要為大家詳細(xì)介紹了Unity3D獲取時間戳或北京時間的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C#操作SQLite數(shù)據(jù)庫幫助類詳解

    C#操作SQLite數(shù)據(jù)庫幫助類詳解

    這篇文章主要介紹了C#操作SQLite數(shù)據(jù)庫幫助類,詳細(xì)分析了C#針對sqlite數(shù)據(jù)庫的連接、查詢、分頁等各種常見操作的實現(xiàn)與封裝技巧,需要的朋友可以參考下
    2017-07-07
  • C#中float的取值范圍和精度分析

    C#中float的取值范圍和精度分析

    這篇文章主要介紹了C#中float的取值范圍和精度,較為詳細(xì)的分析了float的取值范圍與表示方法及精度等概念,有助于深入了解C#數(shù)據(jù)類型,需要的朋友可以參考下
    2014-11-11
  • C#連接SQLite數(shù)據(jù)庫并實現(xiàn)基本操作

    C#連接SQLite數(shù)據(jù)庫并實現(xiàn)基本操作

    本文介紹了SQLite,一個輕量級的跨平臺數(shù)據(jù)庫管理系統(tǒng),以及如何在C#中使用System.Data.SQLite庫進行操作,包括創(chuàng)建、修改和查詢數(shù)據(jù)庫,以及使用SQLiteHelper類簡化SQL使用,此外,還提到了DB文件查看工具SQLiteSpy的應(yīng)用,需要的朋友可以參考下
    2024-12-12
  • C#實現(xiàn)解壓GZip文件的方法

    C#實現(xiàn)解壓GZip文件的方法

    這篇文章主要介紹了C#實現(xiàn)解壓GZip文件的方法,涉及C#操作壓縮文件的技巧,需要的朋友可以參考下
    2015-05-05
  • C# 復(fù)制指定節(jié)點的所有子孫節(jié)點到新建的節(jié)點下

    C# 復(fù)制指定節(jié)點的所有子孫節(jié)點到新建的節(jié)點下

    這篇文章主要介紹了C# 復(fù)制指定節(jié)點的所有子孫節(jié)點到新建的節(jié)點下的相關(guān)資料,非常不錯具有一定的參考借鑒價值,需要的朋友可以參考下
    2016-10-10
  • c# 獲取數(shù)據(jù)庫中所有表名稱的方法

    c# 獲取數(shù)據(jù)庫中所有表名稱的方法

    在很多情況下我們需要將指定的數(shù)據(jù)庫中的所有表都列出來。在使用c#進行軟件開發(fā)時,我們有哪些方法可是實現(xiàn)這個目的呢?本人對此進行概要的總結(jié),有以下6中方式可以實現(xiàn)這個目的。
    2010-02-02
  • C#并行編程之Task任務(wù)

    C#并行編程之Task任務(wù)

    這篇文章介紹了C#并行編程之Task任務(wù),文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05

最新評論

林甸县| 会宁县| 太康县| 福海县| 塔河县| 泰宁县| 高邮市| 麟游县| 峡江县| 双辽市| 开阳县| 新民市| 方山县| 莆田市| 千阳县| 青海省| 巴彦淖尔市| 杨浦区| 基隆市| 邢台市| 灌云县| 南城县| 柘城县| 康定县| 崇信县| 阿克苏市| 杨浦区| 乌拉特中旗| 沙湾县| 扶绥县| 萝北县| 阳信县| 临澧县| 安阳县| 新安县| 扬中市| 五常市| 积石山| 长治市| 永川市| 青川县|