WPF中的三维空间(2)
原文:WPF中的三维空间(2)
2.10.3
三维对象操作
1.在二维平面空间移动、缩放、旋转Viewport3D控件对象

图2-196 选中Viewport3D控件对象
图2-197
二维平面空间中对象操作图标
【设计面板】实际上是X-Y平面,在【对象和时间线】面板上选中Viewport3D控件对象,同时选中【工具】面板中的“选择”工具,在【设计面板】中的选中的对象被平面蓝色边框(称二维边框)包围,边框上有8个选择点,如图2-196所示。图的中央有1个点是对象的中心点。这时,当鼠标出现在选中区域内,鼠标形状如图2-197左1所示,可以移动3D对象;
当鼠标悬浮在图2-196对象边框的选择点时,鼠标形状如图2-197中间所示,可以缩放3D对象(按住Shift键时保持纵横比),二维边框也跟随变化;
当鼠标悬浮在图2-196对象边框的顶点外时,鼠标形状如图2-197右边所示,可以在X-Y平面中旋转3D对象(按住Shift键时有15度的增量);
调整大小、缩放或倾斜对象的同时按住 Alt
键,将保留中心点的位置不变。
在【属性】面板的“转换”栏中也可以对三维对象进行平移、旋转、缩放等操作。
2.在三维空间调整3D几何对象姿态
当选择【对象和时间线】面板中的3D几何对象(World),同时选中【工具】面板中的“选择”工具,在【设计面板】中的选中的3D几何对象被立体边框(三维边框)包围,如图2-198所示。

图2-198 选中3D几何对象
图2-199三维立体空间中操作图标
当鼠标悬浮在图2-198的坐标轴上(如箭头端)时,出现图2-199中左边图的形状(现在是悬浮在X轴上的形状,Y、Z轴上的形状稍有差异,主要是横线和箭头的夹角不一样),这时可以沿坐标轴在二维边框内整体移动几何对象。
当鼠标悬浮在图2-198的两个坐标轴交叉的弧线上时,出现图2-199中间图的形状,这时可以沿某轴旋转3D几何对象;
当鼠标悬浮在图2-198的坐标轴和弧线的交叉点上时,出现图2-199右边图的形状,这时可以沿某轴缩放3D几何对象;
当选中【工具】面板中的“摄影轨迹”工具时,可以任意角度旋转3D几何对象。
3.照相机移动
当选中【工具】面板中的“摄影轨迹”工具时,旋转3D几何对象就是移动相机。
当选中“摄影轨迹”工具时,按住Alt键,鼠标向上移动,照相机靠近3D对象,鼠标向下移动,照相机远离3D对象;
当选中“摄影轨迹”工具时,按住Ctrl键,约束相机在X-Y平面移动;
当选中“摄影轨迹”工具时,按住Shift键,相机在X、Y、Z方向增量15度旋转;
另外,在照相机属性中进行有关设置也可以移动相机。
4.移动光线方向
选中光源,在【属性】面板的相应属性中可以移动光源方向。选中光源,在“转换”栏中也可以旋转变换光源方向。
5.示例

图2-200
三维对象动画示例
图2-200左图是三维管状对象动画示例的运行界面,右图是在3D Max中制作的1个管状模型,导出为“管状体.obj”,导入WPF后贴图。3个按钮用于启动动画,每个动画对应1个故事板,下面扼要介绍制作过程。
(1)将“管状体.obj”添加到项目中,并拖入MainWindow.xaml的【设计面板】,选中它,用图2-196的方法调整其大小(不要做旋转操作),如图2-200所示大小。

图2-201
Material设置
(2)贴图:选择1个jpg图像文件添加到项目中,并且生成图像刷ImageBrush1。在【对象和时间线】面板中选中3D对象“World”的“DefaultMaterial”(参考图2-195),选择【属性】面板“材料”栏目中的Material(如图2-201),在弹出的画笔设置窗口选择“画笔资源”—ImageBrush1,这时3D对象被贴图了,如图2-200。
(3)光线设置:选择World—Tube01—DirectionLightContainer—DirectionLight(【对象和时间线】面板,Tube01是从3DMax带来的名称),参看图2-195(3D对象名称有差别)。选择【属性】面板“光”栏目,如图2-202。

图2-202 光线设置
图2-202中,选择光类型和Color(黄色)设置。
到此,3D几何对象的外观设置完成。
(4)3D对象旋转:新建并设计第1个故事板Storyboard1,完成旋转动画。在【对象和时间线】面板上选中“World”,0秒处设置1个关键帧。选择【属性】面板“转换”栏中的“旋转”变换,分别在2秒、4秒、6秒和8秒处设置关键帧(在Y轴角度坐标栏分别输入90、180、270和360,输入值和显示值不统一,实际一样),输入后的显示键图2-203。

图2-203 旋转变换Y轴角度输入
需要说明的是,3D对象的旋转姿态和在3Dmax中的原始造型有关,图2-200中Y轴正方向向上(没有穿过管状体纵向中心线),X轴正方向向右,Z轴正方向面对读者,这样沿Y轴的旋转不会是管状体本身的自转。
(5)相机移动:新建并设计第2个故事板Storyboard2,移动相机使3D对象缩放。在【对象和时间线】面板上选中Camera—PerspectiveCamera,0秒处创建1个关键帧。选择【属性】面板“转换”栏中的“位移”变换,在3秒处在Z坐标栏内输入180(缩小),在6秒处在Z坐标栏内输入0(还原),在3秒、6秒处创建了2个关键帧。参考图2-200右图,Z轴正方向面向读者,这相当于远景相机在Z轴方向远离和还原。
(6)光线移动:新建并设计第3个故事板Storyboard3,进行光线移动操作。在【对象和时间线】面板中选择World—Tube01—DirectionLightContainer—DirectionLight,选择【属性】面板“转换”栏中的“旋转”变换,分别在2秒、4秒、6秒和8秒处设置关键帧(在X轴角度坐标栏分别输入90、180、270和360)。
(7)触发器设置:3个按钮button1(旋转)、button2(相机移动)、button3(光线移动)分别控制Storyboard1、Storyboard2、Storyboard3的启动。触发器的设置请参看前面“二维动画设计”中有关触发器的内容。
运行程序可以看到3D对象的动画效果。
WPF中的三维空间(2)的更多相关文章
- WPF中的三维空间(1)
原文:WPF中的三维空间(1) WPF中可以创建三维几何图形,支持3D对象的应用,支持从3D Max等软件将3D文件obj导入设计中,但是目前还不支持将材质同时导入,这样需要在WPF中对3D对象重新设 ...
- WPF中对三维模型的控制
原文:WPF中对三维模型的控制 (以下选自南开大学出版社出版的<WPF和Silverlight教程>) 3Dmax中的建模模型可以导出为obj文件格式,将此文件导入WPF项目中,由WPF完 ...
- 用游戏杆控制WPF中三维模型
原文:用游戏杆控制WPF中三维模型 用游戏杆控制WPF中三维模型 今天心情比较好,不写WF的文章了,换个主题.写一个我最最最擅长的内容. 例子下载: http://files.cnblogs. ...
- 在WPF中使用依赖注入的方式创建视图
在WPF中使用依赖注入的方式创建视图 0x00 问题的产生 互联网时代桌面开发真是越来越少了,很多应用都转到了浏览器端和移动智能终端,相应的软件开发上的新技术应用到桌面开发的文章也很少.我之前主要做W ...
- MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息
MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...
- MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信
MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- MVVM模式解析和在WPF中的实现(三)命令绑定
MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- MVVM模式和在WPF中的实现(二)数据绑定
MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
随机推荐
- 轻松学会多线程(四)——synchronized同步keyword知多少
每个对象都有一把独占锁. 独占锁仅仅限制线程对它的同步方法的訪问,对非同步方法,独占锁没有意义. synchronizedkeyword能够作为函数的修饰符,也能够作为函数内的语句,也就是平时说的同步 ...
- thinkphp URL规则、URL伪静态、URL路由、URL重写、URL生成(十五)
原文:thinkphp URL规则.URL伪静态.URL路由.URL重写.URL生成(十五) 本章节:详细介绍thinkphp URL规则.URL伪静态.URL路由.URL重写.URL生成 一.URL ...
- java中Hashtable中的t为什么是小写(转)
因为在很多年前刚学java的时候用到Hashtable的时候比较好奇为什么第二个t是小写,这不符合sun的风格啊,整个jdk都是标准驼峰,于是带着这个疑问翻过 很多书,看多很多资料,最后的结论是: H ...
- jquery实现鼠标拖动
<html> <head> <script type='text/javascript' src='js/jquery-1.5.1.js'></scr ...
- 微信 SDK 不能 分享
说多了都是泪水,真的. 前段时间,做好了微信的分享功能,测试通过的,最近我又跑了一遍用例,发现不能启动微信客户端了,怎么都启动不了,日志如下:ignore wechat app signature v ...
- 为什么使用 React? Edit on GitHub
为什么使用 React? React 是一个 Facebook 和 Instagram 用来创建用户界面的 JavaScript 库.很人多认为 React 是 MVC 中的 V(视图). 我们创造 ...
- python实现了字符串的按位异或和php中的strpad函数
近期在写自己主动化測试,因为开发加密中用到strpad和字符串的按位异或,而python中没有这种函数和功能,所以必须自己写一套,要不自己主动化測试无法进行,所以就用python实现了一下,因为在写字 ...
- (转)Python获取当时时间
我有的时候写程序要用到当前时间,我就想用python去取当前的时间,虽然不是很难,但是老是忘记,用一次丢一次, 为了能够更好的记住,我今天特意写下python 当前时间这篇文章,如果你觉的对你有用的话 ...
- 怎样将android studio项目导入eclipse
如今,越来越多的开源项目都是用android studio来开发的,所以源码都与eclipse有所不同. 以下是将android studio项目导入eclipse的一般步骤: 1. 先解压项目: 2 ...
- 09_android入门_採用android-async-http开源项目的GET方式或POST方式实现登陆案例
依据08_android入门_android-async-http开源项目介绍及用法的介绍,我们通过最常见的登陆案例进行介绍android-async-http开源项目中有关类的使用.希望对你学习an ...