时间:2015年03月16日 | 作者 : aaronyang | 分类 : WPF | 浏览: 3733次 | 评论 0 人
1. 当然复杂的3d模型我们是可以通过更专业的工具做出来,然后导入项目中,我们只是方便演示,选择简单的图形。
Tip: 关于摄像机的NearPlaneDistance和FarPlaneDistance属性用来设置盲区。比NearPlaneDistance更近的对象根本不会显示,比FarPlaneDistance更远的对象是不会显示的。改变这些值以防出现渲染伪影。最常见的例子当复杂的网格离摄像机非常近时,可能会导致z-fighting问题(拼接问题)。
我们上节课说了三角形,这节课我们复习下上节的步骤。
1. 摄像机
2.MeshGeometry3D的数据
3.添加模型材质
4.光源设置,关于光的MSDN讲解:https://msdn.microsoft.com/zh-cn/library/office/jj171024.aspx
5.可选的辅助工具
<Window x:Class="ay3dDemo.Window3" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:tools="clr-namespace:_3DTools;assembly=3DTools" Title="Window3" Height="400" Width="600"> <Grid> <Viewport3D> <Viewport3D.Camera> <PerspectiveCamera FarPlaneDistance="100" LookDirection="2,-1,-1" UpDirection="0,1,0" NearPlaneDistance="1" Position="-20,15,15" FieldOfView="60" > </PerspectiveCamera> </Viewport3D.Camera> <ModelVisual3D> <ModelVisual3D.Content> <DirectionalLight Color="White" Direction="-2,-3,-1" /> </ModelVisual3D.Content> </ModelVisual3D> <ModelVisual3D> <ModelVisual3D.Content> <DirectionalLight Color="White" Direction="2,3,1" /> </ModelVisual3D.Content> </ModelVisual3D> <ModelVisual3D> <ModelVisual3D.Content> <GeometryModel3D x:Name="cubeGeometry"> <GeometryModel3D.Geometry> <MeshGeometry3D Positions="0,0,0 10,0,0 0,10,0 10,10,0 0,0,10 10,0,10 0,10,10 10,10,10" TriangleIndices="0,2,1 1,2,3 0,4,2 2,4,6 0,1,4 1,5,4 1,7,5 1,3,7 4,5,6 7,6,5 2,6,3 3,6,7" Normals="0,1,0 0,1,0 1,0,0 1,0,0 0,1,0 0,1,0 1,0,0 1,0,0" /> </GeometryModel3D.Geometry> <GeometryModel3D.Material> <DiffuseMaterial Brush="LightBlue" /> </GeometryModel3D.Material> </GeometryModel3D> </ModelVisual3D.Content> <ModelVisual3D.Transform> <RotateTransform3D> <RotateTransform3D.Rotation> <AxisAngleRotation3D x:Name="rotate" Axis="0 1 0" /> </RotateTransform3D.Rotation> </RotateTransform3D> </ModelVisual3D.Transform> </ModelVisual3D> <tools:ScreenSpaceLines3D Points="0,-20,0 0,20,0" Thickness="1" Color="Red"> </tools:ScreenSpaceLines3D> <tools:ScreenSpaceLines3D Points="-20,0,0 20,0,0" Thickness="1" Color="Red"> </tools:ScreenSpaceLines3D> <tools:ScreenSpaceLines3D Points="0,0,-20 0,0,20" Thickness="1" Color="Red"> </tools:ScreenSpaceLines3D> </Viewport3D> </Grid> </Window>
如上是个正方体:有时候太纠结细节,会学的很累,这里我们跳过吧,在企业开发中,MeshGeometry3D一般都是美工提供的模型。这里不要太纠结。
=============潇洒的版权线==========www.ayjs.net===== Aaronyang ========= AY =========== 安徽 六安 杨洋 ========== 未经允许不许转载 =========
Model3DGroup
当使用复杂的3D场景时,通常安排多个对象。一个Viewport3D包含多个Visual3D,每个Visual3D对象使用不同的网格。然而,通过创建尽可能少的网格,并将尽可能多的内容组合进每个网格,可极大的提高性能。
意思就是不要使用多个ModelVisual3D对象,直接一个对象,然后里面用Model3DGroup组合对象
如果是组合,就可以进行命中测试、变换、以及动态的显示每一个部分。
Model3DGroup,GeometryModel3D,Light类都是继承Model3D类。
关于复杂模型制作工具:推荐 ZAM 3D工具,这里有个系列教程就是和WPF,SL为例子写的。http://www.cnblogs.com/alexis/category/284156.html
生成xaml代码很好,这样你就可以控制3d后的xaml中的某个Model3DGroup了。当然你也可以导入3DS MAX工具导出的obj文件
也可以使用blender软件。
接下来,我们来看下其他材质的效果,我也没有做过3d模型,算了,假设你有3d模型了。
比如MeshGeometry3D对象你有了。接着你要指定材质,DiffuseMaterial,EmissiveMaterial,SpecularMaterial,下面有个简单的代码,方便参考
<DiffuseMaterial x:Key="diffuse" Brush="DarkBlue"/> <EmissiveMaterial Brush="DarkRed" x:Key="emissive"/> <SpecularMaterial SpecularPower="24" x:Key="specular"> <SpecularMaterial.Brush> <SolidColorBrush Color="LightBlue" Opacity="1.000000"/> </SpecularMaterial.Brush> </SpecularMaterial>
如何切换材质,我们需要给MateriaGroup设置个名字。这里Material都设置到了window.resources去了。
<GeometryModel3D.Material> <MaterialGroup x:Name="materialsGroup"> <StaticResource ResourceKey="diffuse"></StaticResource> <StaticResource ResourceKey="specular"></StaticResource> </MaterialGroup> </GeometryModel3D.Material>
materialsGroup.Children.Add((Material)FindResource("diffuse"));
然后在该组中加入材质对象即可。
纹理映射,在3d表面上放上元素。
我们打开上面那个正方体的窗口,找到一张图片。
设置下Brush的画刷为ImageBrush,然后设置MeshGeometry3D的TextureCoordinates
接下来我们添加一个slider,绑定ModelVisual3D的Transform下的AxisAngleRotation3D的Angle属性
<ModelVisual3D.Transform> <RotateTransform3D> <RotateTransform3D.Rotation> <AxisAngleRotation3D x:Name="rotate" Axis="0 1 0" /> </RotateTransform3D.Rotation> </RotateTransform3D> </ModelVisual3D.Transform>
<Slider Margin="3" Grid.Row="1" Minimum="0" Maximum="360" Orientation="Horizontal" Value="{Binding ElementName=rotate, Path=Angle}" ></Slider>
其他画刷 VisualBrush播放视屏
思路:指定画刷为 VisualBrush,指定Visual属性为MediaElement,一边播放一边旋转镜头
<GeometryModel3D.Material> <DiffuseMaterial> <DiffuseMaterial.Brush> <!--<ImageBrush ImageSource="o_33.jpg"></ImageBrush>--> <VisualBrush> <VisualBrush.Visual> <MediaElement> <MediaElement.Triggers> <EventTrigger SourceName="MediaElement.Loaded"> <EventTrigger.Actions> <BeginStoryboard> <Storyboard> <MediaTimeline Source="av.mp4"/> <DoubleAnimation Storyboard.TargetName="rotate" Storyboard.TargetProperty="Angle" To="360" Duration="0:0:5" RepeatBehavior="Forever"/> </Storyboard> </BeginStoryboard> </EventTrigger.Actions> </EventTrigger> </MediaElement.Triggers> </MediaElement> </VisualBrush.Visual> </VisualBrush> </DiffuseMaterial.Brush> </DiffuseMaterial> </GeometryModel3D.Material>
OK,下篇文章,我们讲3d中的交互和动画,比如命中测试,3d表面上的控件。
=============潇洒的版权线==========www.ayjs.net===== Aaronyang ========= AY =========== 安徽 六安 杨洋 ========== 未经允许不许转载 =========
推荐您阅读更多有关于“WPF4.5,”的文章
抖音:wpfui 工作wpf
目前在合肥企迈科技公司上班,加我QQ私聊
2023年11月网站停运,将搬到CSDN上
AYUI8全源码 Github地址:前往获取
杨洋(AaronYang简称AY,安徽六安人)和AY交流
高中学历,2010年开始web开发,2015年1月17日开始学习WPF
声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费
查看捐赠AYUI7.X MVC教程 更新如下:
第一课 第二课 程序加密教程
额 本文暂时没人评论 来添加一个吧
发表评论