91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用C#?WPF實現動態3D光照效果

發布時間:2023-03-01 11:26:30 來源:億速云 閱讀:159 作者:iii 欄目:開發技術

這篇文章主要介紹“怎么使用C# WPF實現動態3D光照效果”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“怎么使用C# WPF實現動態3D光照效果”文章能幫助大家解決問題。

交互式調節光效

接下來想動態實現光照效果,即如下圖所示

怎么使用C#?WPF實現動態3D光照效果

看到這個滾動條,大家可能馬上想到,將SliderLight的內容綁定在一起似乎更容易實現。所以第一步就是把光效和幾何模型分開,其著手點自然是mainViewport,將其內部填充如下內容。

<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的內外尺寸和Slider綁定在一起。這個操作大家應該是比較熟悉的了,畢竟早在畫立方體的時候就已經演示過了。

首先,用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>

給地球點顏色看看

由于此前一直是白光照明,所以有些枯燥,故而接下來用不同顏色的光照明,其效果為

怎么使用C#?WPF實現動態3D光照效果

顏色也是光效的一部分,但由于顏色并不是單個的數值,從而難以直接綁定,但其Slider代碼和sInner是差不多的,對于RGB通道,分別建立如下的區塊。

<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實現動態3D光照效果”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

wpf
AI

兰考县| 清镇市| 五峰| 闽侯县| 曲靖市| 西宁市| 横山县| 鲁甸县| 江陵县| 垫江县| 乌海市| 博湖县| 新津县| 东宁县| 鹤山市| 阿拉善左旗| 峨眉山市| 盐城市| 汨罗市| 化隆| 光山县| 汝南县| 右玉县| 通榆县| 岳池县| 安吉县| 广昌县| 南木林县| 山阳县| 遂宁市| 湘阴县| 佛冈县| 连南| 梧州市| 曲水县| 荔波县| 安丘市| 襄城县| 裕民县| 安福县| 子洲县|