当前位置: 首页 > news >正文

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

原文: 使用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

 

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

相关文章:

  • 初识MongoDB
  • STM32之CAN ---CAN ID过滤器分析
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 进制之间的相互转换
  • 值得推荐的10本PHP书籍(转)
  • C文件操作
  • 深入理解ReactRedux
  • 使用JAVA进行MD5加密后所遇到的一些问题
  • ExpandableListView使用(三)-ScrollView嵌套ExpandableListView,列表显示不全
  • ORACLE中的各种数据类型详细的介绍
  • 一个简单的golang json解析库
  • Java Web笔记 – Servlet中的Filter过滤器的介绍和使用 编写过滤器
  • java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path
  • maven中jar、war、pom的区别
  • 尝试使用word发布博客
  • 345-反转字符串中的元音字母
  • Akka系列(七):Actor持久化之Akka persistence
  • angular2 简述
  • echarts的各种常用效果展示
  • Go 语言编译器的 //go: 详解
  • Invalidate和postInvalidate的区别
  • Java精华积累:初学者都应该搞懂的问题
  • js中forEach回调同异步问题
  • Laravel 实践之路: 数据库迁移与数据填充
  • leetcode386. Lexicographical Numbers
  • python docx文档转html页面
  • Redis在Web项目中的应用与实践
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • 读懂package.json -- 依赖管理
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 聊聊springcloud的EurekaClientAutoConfiguration
  • 如何在 Tornado 中实现 Middleware
  • 入门级的git使用指北
  • 三分钟教你同步 Visual Studio Code 设置
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 项目实战-Api的解决方案
  • 责任链模式的两种实现
  • 主流的CSS水平和垂直居中技术大全
  • 数据库巡检项
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #数学建模# 线性规划问题的Matlab求解
  • (3)llvm ir转换过程
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (分布式缓存)Redis持久化
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (算法)求1到1亿间的质数或素数
  • (转)EOS中账户、钱包和密钥的关系
  • (转)h264中avc和flv数据的解析
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)关于pipe()的详细解析