使用WPF实现3D场景[一]

简介: 原文:使用WPF实现3D场景[一] 在这篇文章里,将介绍如何实现一个简单的三维场景,一个三维的空间,包括空间内的三维物体的组合. 首先介绍一下一个三维场景里的基本元素: 先是定义一个简单的三维的场景环境 代码如下: 以上是定义了一个名称叫做 myViewport 的的三维场景,接下来可以在这个三位场景里添加一些元素: 元素一:照相机 照相机是三维场景内用户的视角,当然照相机也是唯一的。
原文: 使用WPF实现3D场景[一]

在这篇文章里,将介绍如何实现一个简单的三维场景,一个三维的空间,包括空间内的三维物体的组合.

首先介绍一下一个三维场景里的基本元素:

先是定义一个简单的三维的场景环境

代码如下:

< Viewport3D  Name ="myViewport" >
</ Viewport3D >

以上是定义了一个名称叫做 myViewport 的的三维场景,接下来可以在这个三位场景里添加一些元素:

元素一:照相机

照相机是三维场景内用户的视角,当然照相机也是唯一的。

来看如何定义一个简单的照相机代码:

< Viewport3D .Camera >
        
< PerspectiveCamera  FarPlaneDistance ="3000"  NearPlaneDistance ="0.25"  FieldOfView ="90"  Position ="1800,0,0"  LookDirection ="-1,0,0"  UpDirection ="0,1,0" ></ PerspectiveCamera >
      
</ Viewport3D.Camera >

这里面描述了照相机在三维场景里的位置,包括它观察的角度,最远的视线,等等这样信息和属性。如果想灵活的使用照相机改变视角会在第二讲和第三讲里详尽的介绍。

元素一:三维模型

三维模型是三维场景内的物体,也就是模型中的元素,不唯一,可以组合,重叠。

来看如何定义一个简单的三维模型组合的代码:

       < ModelVisual3D  x:Name ="topModelVisual3D" >
        
< ModelVisual3D .Children >
          
< ModelVisual3D >
            
< ModelVisual3D .Content >
              
< DirectionalLight  Color ="#FFFFFFFF"  Direction ="-3,-4,-5"   />
            
</ ModelVisual3D.Content >
          
</ ModelVisual3D >

          
< ModelVisual3D >
            
< ModelVisual3D .Content >
              
< GeometryModel3D  Geometry ="{StaticResource chair}" >
                
< GeometryModel3D .Material >
                  
< DiffuseMaterial >
                    
< DiffuseMaterial .Brush >
                      
< SolidColorBrush  Color ="Yellow"  Opacity ="1.0"   />
                    
</ DiffuseMaterial.Brush >
                  
</ DiffuseMaterial >
                
</ GeometryModel3D.Material >
                
< GeometryModel3D .Transform >
                  
< TranslateTransform3D  OffsetX ="0"  OffsetY ="-200"  OffsetZ ="-600"   />
                
</ GeometryModel3D.Transform >
              
</ GeometryModel3D >
            
</ ModelVisual3D.Content >
          
</ ModelVisual3D >

          
< ModelVisual3D >
            
< ModelVisual3D .Content >
              
< GeometryModel3D  Geometry ="{StaticResource table}" >
                
< GeometryModel3D .Material >
                  
< DiffuseMaterial >
                    
< DiffuseMaterial .Brush >
                      
< SolidColorBrush  Color ="Yellow"  Opacity ="1.0"   />
                    
</ DiffuseMaterial.Brush >
                  
</ DiffuseMaterial >
                
</ GeometryModel3D.Material >
                
< GeometryModel3D .Transform >
                  
< TranslateTransform3D  OffsetX ="0"  OffsetY ="20"  OffsetZ ="60"   />
                
</ GeometryModel3D.Transform >
              
</ GeometryModel3D >
            
</ ModelVisual3D.Content >
          
</ ModelVisual3D >


          
< ModelVisual3D >
            
< ModelVisual3D .Content >
              
< GeometryModel3D  Geometry ="{StaticResource man}" >
                
< GeometryModel3D .Material >
                  
< DiffuseMaterial >
                    
< DiffuseMaterial .Brush >
                      
< SolidColorBrush  Color ="black"  Opacity ="1.0"   />
                    
</ DiffuseMaterial.Brush >
                  
</ DiffuseMaterial >
                
</ GeometryModel3D.Material >
                
< GeometryModel3D .Transform >
                  
< TranslateTransform3D  OffsetX ="75"  OffsetY ="20"  OffsetZ ="0"   />
                
</ GeometryModel3D.Transform >
              
</ GeometryModel3D >
            
</ ModelVisual3D.Content >
            
            
            
< ModelVisual3D .Transform >
              
< Transform3DGroup >
                
< ScaleTransform3D  ScaleX ="10"  ScaleY ="10"  ScaleZ ="10"   x:Name ="scaleTransform" />
                
< MatrixTransform3D />
                
< RotateTransform3D  >
                  
< RotateTransform3D .Rotation  >
                    
< AxisAngleRotation3D  Angle ="275"  Axis ="0,0,1"  x:Name ="myAngleRotationMan" />
                  
</ RotateTransform3D.Rotation >
                
</ RotateTransform3D >
              
</ Transform3DGroup >
            
</ ModelVisual3D.Transform >  
            
            
          
</ ModelVisual3D >
        
</ ModelVisual3D.Children >
        
        
< ModelVisual3D .Transform >
          
< Transform3DGroup >
            
< MatrixTransform3D />
            
< RotateTransform3D  >
              
< RotateTransform3D .Rotation  >
                
< AxisAngleRotation3D  Angle ="0"  Axis ="0,10,0"  x:Name ="myAngleRotationChair" />
              
</ RotateTransform3D.Rotation >
            
</ RotateTransform3D >
          
</ Transform3DGroup >
        
</ ModelVisual3D.Transform >
      
</ ModelVisual3D >

来看一下效果:

 

 

 

到这里就完成了整个的三维场景的建立。

补充元素:动画效果

如果想让整体的三维模型都能动起来,就需要为三维场景添加动画效果。

看一段可以让三维场景按纵轴(中心轴)旋转的代码:

    < Viewport3D .Triggers >
        
< EventTrigger  RoutedEvent ="Viewport3D.Loaded" >
          
< BeginStoryboard >
            
< Storyboard >
              
< DoubleAnimation 
                
Storyboard.TargetName ="myAngleRotationChair"
                Storyboard.TargetProperty
="Angle"
                From
="0"  To ="360"  Duration ="0:0:10"
                RepeatBehavior
="Forever"   />
            
</ Storyboard >
          
</ BeginStoryboard >
        
</ EventTrigger >
      
</ Viewport3D.Triggers >

填写如上代码之后就完成了一个最简单的三维动画的处理。

好的~如果您对更多的三维场景变成想有所了解,请关注第二讲。

如果您想下载源代码或收听语音教程,请访问:微软webcast

 

再次感谢您的关注,谢谢!

目录
相关文章
|
C#
WPF 界面实现多语言支持 中英文切换 动态加载资源字典
原文:WPF 界面实现多语言支持 中英文切换 动态加载资源字典 1、使用资源字典,首先新建两个字典文件en-us.xaml、zh-cn.xaml。定义中英文的字符串在这里面【注意:添加xmlns:s="clr-namespace:System;assembly=mscorlib】 zh-cn.
2895 0
|
IDE C# 开发工具
WPF钟表效果实现
中WPF中的RotateTransform实现UI元素的旋转,并模拟钟表的秒针、分针和时针。
1125 0
WPF钟表效果实现
|
IDE 编译器 C#
WPF实现强大的动态公式计算
数据库可以定义表不同列之间的计算公式,进行自动公式计算,但如何实现行上的动态公式计算呢?行由于可以动态扩展,在某些应用场景下将能很好的解决实际问题。本文就探讨一下如何在WPF中实现一种基于行字段的动态公式计算。
990 0
WPF实现强大的动态公式计算
|
网络协议 C# 移动开发
C# WPF上位机实现和下位机TCP通讯
C# WPF上位机实现和下位机TCP通讯下位机使用北京大华程控电源DH1766-1,上位机使用WPF。实现了电压电流实时采集,曲线显示。上午在公司调试成功,手头没有程控电源,使用TCP服务端模拟。昨天写的TCP服务端正好排上用场。
2337 0
|
C#
WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条)
原文:WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) 对于TreeView而言: TreeViewAutomationPeer lvap = new TreeViewAuto...
2314 0
|
XML 自然语言处理 C#
WPF 多语言实现
原文:WPF 多语言实现 很多国际化的程序都提供了多语言的选项,这样方便不同国家的使用者更方便的使用软件。这篇博客中将介绍在WPF中实现多语言的方式。 方式一,使用WPF动态资源的方式实现。先简单介绍下StaticResource和DynamicResource,这两者的区别在于动态资源改变后会实时的体现出来,而静态资源只加载一次,后面对资源的任何改变都不会体现出来。
1507 0
|
C#
WPF实现三星手机充电界面
原文:WPF实现三星手机充电界面 GitHub地址:https://github.com/ptddqr/wpf-samsung-phone-s5-charging-ui/tree/master 先上效果图 这个效果来自于三星S5的充电界面,版权归三星所有,这里仅仅是技术实现.
1659 0
|
C# vr&ar
WPF实现物理效果 拉一个小球
原文:WPF实现物理效果 拉一个小球 一直以来都对物理效果有神秘感,完全不知道怎么实现的.直到看到了周银辉在老早前写的一篇博客:http://www.cnblogs.com/zhouyinhui/archive/2007/06/23/793724.
934 0
|
C#
WPF实现Twitter按钮效果
原文:WPF实现Twitter按钮效果 最近上网看到这个CSS3实现的Twitter按钮,感觉很漂亮,于是想用WPF来实现下. 实现这个效果,参考了CSS3 原文地址:http://www.html5tricks.
1205 0
|
C# UED 自然语言处理
在WPF中实现图片一边下载一边显示
原文 在WPF中实现图片一边下载一边显示 当我们上网查看一个较大的图片时,浏览器能一边下载一边显示,这样用户体验是比较好的,但在WPF程序中,当我们通过如下方式显示一幅图片时:     img.Source = new BitmapImage(new Uri("http://localhost:8000/www/test.jpg")); 只能等到图片下载完成时才能显示出来,当图片较大时需要等待很久,即使在旁边放个进度条给人的感觉仍然不好。
1026 0