『壹』 关于C# 请问怎样可以在C#中用wpf做出一个3D场景查看窗体 请问用什么控件啊求代码详解 我
在wpf里有两种3d效果:一种是借助于3d引擎的真3D,一种是借助于继承System.Windows.Controls.Panel里的某些仿3D控件的伪3D。一般都是用第二种,因为这样既省资源也效果不错。
给你几个链接做参考吧:
http://www.silverlightchina.net/html/study/WPF/2013/0215/21833.html
http://www.silverlightchina.net/html/study/WPF/2012/1211/20773.html
http://www.silverlightchina.net/html/study/WPF/2012/1129/20502.html
『贰』 WPF导入OBJ模型后怎么获得这个模型对象
你下的OBJ模型应该是3D扫描成的模型吧,在特定软件下3D扫描是会自动把贴图扫描上的,也就是你第一张图显示的那样,但导入max就只会是一个白模,因为没有UV来确立模型的贴图。所以,这不是导入的问题,导入max本身就是显示灰白色的。什么是UV,那自己网络一下学习吧。而且3D扫描成的模型本身面数和布线都是杂乱无法在max里面编辑的。
过大可能是因为你两个文件制作的时候MAX设置的默认单位不同(分开制作多个文件最后合并的项目中最常见也是最需要注意的问题)没什么特别的方法,先把大模型缩小点,然后导出OBJ,打开另一个MAX文件,导入刚才导出的OBJ,再匹配调整大小。
如果你已经做了贴图,先调整大小,存一版(备份)。然后merge(中文版可能叫合并)另一个MAX文件进来。最后调整匹配大小。
如果你说的是模型容量太大,先把这个模型的布线整理一下,没用的线该删的删,该并的并,贴图材质球没用的也要清理,然后把整个模型再转一次多边形(这步是为了清理一些没用的编辑历史),还有如果有贴图,可以尽量缩小一下贴图的尺寸,如果贴图过多导致材质球比较多,可以用多位子材质球给模型面分ID来实现精简。
『叁』 WPF 3D模型 用什么软件制作
1.用3DMax做好模型导出obj格式,然后用blend把obj搞成xaml
2.用3DMax做好模型导出3Ds格式,然后用zam3D 导成xaml,zam3D 就是干这活的
『肆』 WPF 3D中如何选择模型的一部分并维护模型
我选择了一个方块,将方块显示为蓝色,同时屏幕坐上显示了点击方块后的操作。整个流程我处理了两个问题:1. 如何选择模型的这一部分2. 如何维护你选择的这个部分 问题1:如何选择模型的这一部分由于WPF 3D模型中只有Viewport3D对象有MouseButtonLeftDown事件,而模型的某个部分是没有这个事件的。因此需要使用首先VisualTreeHelper.HitTest来确定具体点击的是哪个模型,同时这个模型是需要给外部用的,因此我们自定义了一个的事件给外部调用。 1 //自定义个一个模型选中的EventHandler 2 public class Visual3DEventArgs : EventArgs3 {4 public ModelVisual3D Visual3D { get; set; }56 public Visual3DEventArgs(ModelVisual3D modelVisual3D)7 {8 this.Visual3D = modelVisual3D;9 }10 }1112 public delegate void (object sender, Visual3DEventArgs args);13 //....
14 15 //声明Viewport3D的LeftButton事件16 ViewPort.MouseLeftButtonDown += ViewPort_MouseLeftButtonDown;1718 //Viewport LeftButton的函数19 void ViewPort_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs args)20 {21 Point mousePos = args.GetPosition(ViewPort);
22 var hitParams = new PointHitTestParameters(mousePos);
23 VisualTreeHelper.HitTest(ViewPort, null, ResultCallback, hitParams);24 }2526 //根据HitTest选中之后的处理27 private HitTestResultBehavior ResultCallback(HitTestResult result)28 {29 RayHitTestResult rayResult = result as RayHitTestResult;3031 if (rayResult != null)32 {33 var visual3D = result.VisualHit as ModelVisual3D;
34 if (visual3D != null)35 {36 if (OnModelSelected != null)37 {38 OnModelSelected(this, new Visual3DEventArgs(visual3D));39 }4041 return HitTestResultBehavior.Stop;42 }4344 }45 return HitTestResultBehavior.Continue;
46 } 2. 问题2:如何维护你选择部分我刚刚在Visual3DEventArgs中已经获得了选择的模型了,这时候我就可以对它进行操作了。或许数据库中有个模型叫"block1",查找数据等等.... 但是很悲催的是, 虽然在xaml文件中ModelVisual3D是有x:name的,但是ModelVisual3D本书是没有 ModelVisual3D.Name这个属性的,即使获取了这个模型,也只能对其进行基本的渲染,根本没有办法进行逻辑操作(例如根据数据库通信等)。 只有通过viewport3D.FindName(string name)才能获取对象! 解决办法是:我们自己可以维护一个模型名字表(其实就是个xml文件): dg01 dg02 dg04 然后定义一个返回名字的函数: 1 public Section GetSelSection(ModelVisual3D visual3D)2 {3 if (_context != null && _context.Sections != null && visual3D != null)4 {5 var viewPort = _context.Model.ViewPort;67 foreach (var section in _context.Sections)8 {9 if (viewPort.FindName(section.Name) == visual3D)10 {11 return section;12 }13 }14 }15 17 return null;
18 } 我就可以通过GetSelSection(args.Visual3D)获得这个section对象了。对了,这个Section就是刚才XML文件的映射类。
『伍』 WPF如何提升三维呈现性能及优化
一、图形硬件加速
wpf中的图形呈现都是通过图形卡的GPU来进行计算处理的,一般WPF 系统定义了三个呈现层:呈现层 0 无图形硬件加速。DirectX 版本级别低于 7.0;呈现层 1 部分图形硬件加速。DirectX 版本级别高于或等于 7.0 且低于 9.0。视频 RAM必须大于或等于30MB。多纹理单元单元数必须大于或等于 2(显卡AGP速率2X);
呈现层 2 大多数图形功能都使用图形硬件加速。DirectX 版本级别高于或等于 9.0。视频 RAM必须大于或等于120MB。多纹理单元单元数必须大于或等于 4(显卡AGP速率4X或更高8X、16X)。
二、三维模型材质的使用
一般三维模型材质的使用,多数会用到Brush,但不同的Brush材质呈现的速度也不同,SolidColorBrush(直接给模型添加固有色) 、LinearGradientBrush 相对于ImageBrush、VisualBrush等运算速度要快得多,已缓存的Brush比未缓存的Brush快。
三、模型的创建
在三维场景中我们尽量创建GeometryModel3D三角面片小于60.000个,顶点小于20.000个,尽量重复使用外形变化不大的模型,除非有新形状需要从新创建模型,尽量在一个viewport3D中创建子模型不要创建多个viewport3D。
四、关于3d抗锯齿
wpf中的3d抗锯齿,只适合于vista系统,如果想在xp系统下实现抗锯齿,可以在注册表中设置最大多级采样值 HKEY_CURRENT_USER/SOFTWARE/Microsoft/Avalon.Graphics/MaxMultisampleType 值类型为DWORD一般设为4 根据显卡的性能进行合适的调整。(不过建议最好不使用这种方法,使用修改注册表可以实现抗锯齿,但同时也可能会产生新的呈现问题,比如:三维模型体贴与其他对象重叠产生图形边缘出现虚线等,不过通过设置显卡的代替像素中心功能可以解决虚线问题,但同时也会带来其他不可预知的不稳定因素)
所以根据自己对三维呈现的实际展现要求可以灵活选择优化设置的方法,目的只要一个就是要保证具有稳定、优良的性能又有很好的三维呈现效果。