在WPF中使用PlaneProjection模拟动态3D效果

原文:在WPF中使用PlaneProjection模拟动态3D效果

  虽然在WPF中也集成了3D呈现的功能,在简单的3D应用中,有时候并不需要真实光影的3D场景。毕竟使用3D引擎会消耗很多资源,有时候使用各种变换和假的阴影贴图也能设计出既省资源,又有很好用户体验的“伪”3D界面。

  在Silverlight中,因为性能问题,一般并不使用真3D引擎,微软为Silverlight提供了System.Windows.Media.PlaneProjection 类,用投影变换来模拟3D的效果。

  下面让我们看下一个 Microsoft Expression Blend 4 提供的示例 Wall3D (位于帮助>欢迎屏幕>示例)。

 

  大家不要被这个可以流畅滚动的3D图片墙所迷惑,其实这只是一个ListBox控件。MainPage中给ListBox定义了一个ItemsPanelTemplate,使用新的控件来作为ListBox中Items的布局控件,这个
控件就是这个项目最核心的类:CircularPanel3D。

  CircularPanel3D类继承自System.Windows.Controls.Panel,它实现了一种新的布局方式,效果大家在上一张图片中都看到了。这种华丽的效果实际上都是由这个最重要的类中的最重要的方法:
private void Refresh() 完成的。

1 privatevoid Refresh()
2 {
3 //几个计数器,看名字就功能很明了
4  int count =0;
5 int col =0;
6 int row =0;
7 int zLevel =0;
8
9 //开始遍历子元素
10  foreach (FrameworkElement childElement inthis.Children)
11 {
12 //AngleItem是指单个元素的旋转角度,算法是360除以列数
13 //这个方法的布局方式是先布满一圈,再下一环的,角度总是可以取模的
14 //所以这边直接AngleItem和count相乘了
15 //InitialAngle这个属性是用来确定整个圆环的偏转角度的,每次这个依赖属性变化就会重新计算布局(调用这个方法)
16 double angle = (this.AngleItem * count++) -this.InitialAngle;
17 //下面两个变量用来确定元素在屏幕上的位置,用到了三角函数,数学不好的请问高中数学老师
18 double x =this.Radius * Math.Cos(Math.PI * angle /180);
19 double z =this.Radius * Math.Sin(Math.PI * angle /180);
20 //创建个PlaneProjection对象,并赋值
21 PlaneProjection projection =new PlaneProjection();
22 if (projection !=null)
23 {
24 projection.CenterOfRotationX =0.5;
25 projection.CenterOfRotationY =0.5;
26 projection.CenterOfRotationZ =0.5;
27 projection.RotationY = angle +90;
28 projection.GlobalOffsetX = x;
29 //Distance实际上就是模拟的镜头距离
30 projection.GlobalOffsetZ = z -this.Distance;
31 //-330。。。坑爹的硬编码,实际上就是两行元素的间距,OffsetY是纵向的偏移量,用于调整环在屏幕上的位置
32 projection.GlobalOffsetY = row * (-330) +this.OffsetY;
33 }
34 //实际上是让double数变成int数,但是又不会丧失区别性,下面要用到
35 int depth = (int)(z *100);
36
37 double pDist = (this.Distance -1000) /2000;
38 double pZ = ((z +1000) /2000) +0.5;
39
40 //让太远的和太近的变透明
41 double opacity = (pZ - pDist) +0.4;
42 if (opacity >=1)
43 {
44 childElement.Opacity = (2- opacity);
45 }
46 elseif (opacity <0)
47 {
48 childElement.Opacity =0;
49 }
50 else
51 {
52 childElement.Opacity = opacity;
53 }
54
55 // 嗯这边有原版的英文注释,不解释
56 // Variable zLevel changes value of ZIndex for each item in the ListBox.
57 // This way the reflex of elements at the top will be placed behind the item below it.
58 Canvas.SetZIndex(childElement, depth-(++zLevel*10));
59
60 //根据Align属性设置对齐方式,不是很重要
61 double alignX =0;
62 double alignY =0;
63 switch (this.Align)
64 {
65 case AlignmentOptions.Left:
66 alignX =0;
67 alignY =0;
68 break;
69 case AlignmentOptions.Center:
70 alignX = childElement.DesiredSize.Width /2;
71 alignY = childElement.DesiredSize.Height /2;
72 break;
73 case AlignmentOptions.Right:
74 alignX = childElement.DesiredSize.Width;
75 alignY = childElement.DesiredSize.Height;
76 break;
77 }
78 //将PlaneProjection对象赋给子元素的Projection属性
79 childElement.Projection = projection;
80 //定位子元素
81 childElement.Arrange(new Rect(this.Width /2- alignX , this.Height /2- alignY, childElement.DesiredSize.Width, childElement.DesiredSize.Height));
82
83 //换行,又见坑爹的硬编码14。。这个代表有十四列
84 col++;
85 if (col >14)
86 {
87 col =0;
88 row++;
89 }
90 }
91 }






				
时间: 2024-10-07 06:13:46

在WPF中使用PlaneProjection模拟动态3D效果的相关文章

wpf中静态资源和动态资源的区别

静态资源(StaticResource)指的是在程序载入内存时对资源的一次性使用,之后就不再访问这个资源了. 动态资源(DynamicResource)指的是在程序运行过程中然会去访问资源. 原文地址:https://www.cnblogs.com/lyj-gyq/p/8496659.html

php模拟动态输出效果

读取数据库,显示数据 foreach($s as $ss){ echo '同步中 ...<br />'; for( $i = 1 ; $i < 2 ; $i++ ) { //echo $i . '<br />'; echo $ss['people']; echo "<br>"; flush(); ob_flush(); sleep(1); } echo 'End ...<br />'; }

如何让IOS中的文本实现3D效果

本转载至 http://bbs.aliyun.com/read/181991.html?spm=5176.7114037.1996646101.25.p0So7c&pos=9     zhedianshi 级别: 帮帮团 发帖 487 云币 430 加关注 写私信 只看楼主 更多操作楼主  发表于: 2014-06-10 我想要在IOS中对一些文本进行3D效果渲染,使用了UIKit和标准视图控制器. 实现之的效果大概能成为这样:   能不能通过iOS和UIKit实现?我只用了一个静态PNG图片,

WPF中静态引用资源与动态引用资源的区别

WPF中静态引用资源与动态引用资源的区别 WPF中引用资源分为静态引用与动态引用,两者的区别在哪里呢?我们通过一个小的例子来理解. 点击“Update”按钮,第2个按钮的文字会变成“更上一层楼”,而第1个按钮的文字没有变化. 原因是第1个按钮文字用的是静态引用资源,而第2个按钮文字用的是动态引用资源. 前台代码: <Window x:Class="PersonalLearning.StaticDynamicResourceDemo"        xmlns="http

wpf 模拟3D效果(和手机浏览图片效果相似)(附源码)

原文 wpf 模拟3D效果(和手机浏览图片效果相似)(附源码) pf的3D是一个很有意思的东西,类似于ps的效果,类似于电影动画的效果,因为动画的效果,(对于3D基础的摄像机,光源,之类不介绍,对于依赖属性也不介绍.),个人认为,依赖属性这个东西,有百分之五十是为了3D而存在.(自己写的类似于demo的东西)先上图,无图无真相这是demo的整个效果图,可以用鼠标移动,触摸屏也可以手指滑动,图片会移动,然后移动结束,会有一个回弹的判断. <Window x:Class="_3Dshow.Wi

WPF 中动态改变控件模板

在某些项目中,可能需要动态的改变控件的模板,例如软件中可以选择不同的主题,在不同的主题下软件界面.控件的样式都会有所不同,这时即可通过改变控件模板的方式实现期望的功能. 基本方法是当用户点击切换主题按钮是加载新的资源字典,并使用新加载的资源字典替代当前的资源字典这时要用到ResourceManager. 假设现有两个不同的资源字典文件Dictionary1.xaml和Dictionary2.xaml存在于Themes文件夹内: 在MainPage中使用其中一个资源字典作为默认样式文件: <Win

WPF中动态更新TextBlock文字中的超链接,文本

1.------------------------------------------------------------------------- 修改超链接的文本文字: <TextBlock><Hyperlink> <TextBlock  x:Name="TextBlockNeedChange" Text="改变的文本" /> </Hyperlink></TextBlock> 修改TextBlockN

WPF 中模拟键盘和鼠标操作

转载:http://www.cnblogs.com/sixty/archive/2009/08/09/1542210.html 更多经典文章:http://www.qqpjzb.cn/65015.html 其实SendKeys类提供的方法蛮好用的,可惜的是WPF中不能用了,说是WPF的消息循环方式改成了Dispatcher,所以直接调用System.Windows.Forms.SendKeys.Send()方法会报错. 不过没关系, 至少有use32的SendInput可用,通过P/Invoke

WPF中使用TranslateTransform3D修改CAD的3D旋转中心

原文:WPF中使用TranslateTransform3D修改CAD的3D旋转中心 ?????? 前面一篇文章讲述了2D旋转功能的实现,文章提到了修改3D旋转中心,这一节主要总结一下具体的修改3D旋转中心的实现方法.(这个功能的实现有一段时间了,需要通过代码好好总结一下) ????? TranslateTransform3D以相对容器的偏移移动对象,通过OffsetX.OffsetY.OffsetZ属性来指定偏移量. ? (1)定义对象 ??????? private TranslateTran