当前位置:网站首页 / WPF / 正文

[Aaronyang] 写给自己的WPF4.5 笔记21 [3d课 2/4]

时间:2015年03月16日 | 作者 : aaronyang | 分类 : WPF | 浏览: 3580次 | 评论 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,目前主maui

招聘合肥一枚WPF工程师,跟我一个开发组,10-15K,欢迎打扰

目前在合肥市企迈科技就职

AYUI8全源码 Github地址:前往获取

杨洋(AaronYang简称AY,安徽六安人)AY唯一QQ:875556003和AY交流

高中学历,2010年开始web开发,2015年1月17日开始学习WPF

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

标签列表