C# WPF实现动态3D光照效果

 更新时间:2023年03月01日 09:27:35   作者:微小冷  
这篇文章主要为大家详细介绍了如何利用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>

给地球点颜色看看

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

颜色也是光效的一部分,但由于颜色并不是单个的数值,从而难以直接绑定,但其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光照效果的文章就介绍到这了,更多相关C# WPF动态3D光照内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#编程报错System.InvalidOperationException问题及解决

    C#编程报错System.InvalidOperationException问题及解决

    这篇文章主要介绍了C#编程报错System.InvalidOperationException问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • C#实现动态数据绘图graphic的方法示例

    C#实现动态数据绘图graphic的方法示例

    这篇文章主要介绍了C#实现动态数据绘图graphic的方法,结合实例形式分析了C#根据动态数据绘制2D数据表格的相关操作技巧,需要的朋友可以参考下
    2017-09-09
  • 基于C#实现的敏感字检测示例

    基于C#实现的敏感字检测示例

    这篇文章主要介绍了基于C#实现的敏感字检测示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • C#编写Windows服务实例代码

    C#编写Windows服务实例代码

    本篇文章主要介绍使用Microsoft Visual Studio2012可以很方便的创建一个Windows服务,本例实现一个向D盘的txt文件里,写入系统时间的Windows服务
    2013-10-10
  • C#滑动验证码拼图验证功能实现(SlideCaptcha)

    C#滑动验证码拼图验证功能实现(SlideCaptcha)

    目前网站上的验证码机制可谓是五花八门,有简单的数字验证,有掺杂了字母和文字的混淆验证,还有通过滑块进行的拼图验证,下面这篇文章主要给大家介绍了关于C#滑动验证码拼图验证功能的实现方法,需要的朋友可以参考下
    2022-04-04
  • C#获取鼠标在listview右键点击单元格的内容方法

    C#获取鼠标在listview右键点击单元格的内容方法

    下面小编就为大家带来一篇C#获取鼠标在listview右键点击单元格的内容方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C#基于NPOI操作Excel

    C#基于NPOI操作Excel

    这篇文章介绍了C#基于NPOI操作Excel的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • Unity EasyTouch摇杆插件使用示例详解

    Unity EasyTouch摇杆插件使用示例详解

    这篇文章主要介绍了Unity EasyTouch摇杆插件使用,这套插件还支持双指缩放,滑动,手指画圈,点击,多指触碰,拖拽等,通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • C#模拟window操作鼠标的方法

    C#模拟window操作鼠标的方法

    这篇文章主要介绍了C#模拟window操作鼠标的方法,可实现模拟鼠标移动到固定位置后点击右键的功能,涉及鼠标常用事件的操作技巧,需要的朋友可以参考下
    2015-07-07
  • C#中数组Array,ArrayList,泛型List详细对比

    C#中数组Array,ArrayList,泛型List详细对比

    关于数组Array,ArrayList,泛型List,简单的说数组就是值对象,它存储数据元素类型的值的一系列位置.Arraylist和list可以提供添加,删除,等操作的数据. 具体如何进行选择使用呢,我们来详细探讨下
    2016-06-06

最新评论