WPF项目中使用3D模型和动画


wpf使用Viewport3D创建3D模型,该对象包含了Camera摄像头,ModelVisual3D模型详细配置,包括填充的纹理。运用3D模型和动画,可以创建非常炫酷的3D效果,wpf这么强大,怎么就没发扬壮大<- _ ->!!

创建思路:

 

  1. 先创建一个3D模型(太专业了,从网上copy别人的模型,加以改造)
  2. 创建panel模板用来填充模型,也可以使用图片
  3. 创建动画使模型动起来(其实改变的是摄像头的角度)

创建模型
<Viewport3D>
            <Viewport3D.Camera>
                <PerspectiveCamera
                          Position = "1.75, 2.75, 2.75"
                          LookDirection = "-1.75, -2.75, -2.75"
                          UpDirection = "0, 1, 0"
                          FieldOfView = "60">
                    <PerspectiveCamera.Transform>
                        <Transform3DGroup>
                            <RotateTransform3D>
                                <RotateTransform3D.Rotation>
                                    <AxisAngleRotation3D Axis="0 1 0" x:Name="hr"/>
                                </RotateTransform3D.Rotation>
                            </RotateTransform3D>
                            <RotateTransform3D>
                                <RotateTransform3D.Rotation>
                                    <AxisAngleRotation3D Axis="1 0 0" x:Name="vr"/>
                                </RotateTransform3D.Rotation>
                            </RotateTransform3D>
                        </Transform3DGroup>
                    </PerspectiveCamera.Transform>
                </PerspectiveCamera>
            </Viewport3D.Camera>
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <Model3DGroup >
                        <!-- Lights -->
                        <AmbientLight Color="Transparent"/>
                        <DirectionalLight Color="Gainsboro" Direction="1,-2,-3" />
                        <DirectionalLight Color="Gainsboro" Direction="-1,2,3" />
                        <!-- Top -->
                        <GeometryModel3D>
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D 
                                            Positions = "-1,1,1 1,1,1 1,1,-1 -1,1,-1"
                                            TriangleIndices = "0 1 2     2,3,0"
                                            TextureCoordinates="0,1 1,1 1,0 0,0"
                                        />
                            </GeometryModel3D.Geometry>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial>
                                    <DiffuseMaterial.Brush>
                                        <VisualBrush Viewport="0,0,.5,.25" TileMode="Tile" Visual="{Binding ElementName=cubebg}"/>
                                    </DiffuseMaterial.Brush>
                                </DiffuseMaterial>
                            </GeometryModel3D.Material>
                        </GeometryModel3D>
                        <!-- Front -->
                        <GeometryModel3D>
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D
                                            Positions = "-1,-1,1 1,-1,1 1,1,1 -1,1,1"
                                            TriangleIndices = "0 1 2     2,3,0"
                                            TextureCoordinates="0,1 1,1 1,0 0,0"
                                        />
                            </GeometryModel3D.Geometry>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial>
                                    <DiffuseMaterial.Brush>
                                        <VisualBrush Viewport="0,0,.5,.25" TileMode="Tile" Visual="{Binding ElementName=cubebg}"/>
                                    </DiffuseMaterial.Brush>
                                </DiffuseMaterial>
                            </GeometryModel3D.Material>
                        </GeometryModel3D>

                        <!-- Right -->
                        <GeometryModel3D>
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D
                                            Positions = "1,-1,1 1,-1,-1 1,1,-1 1,1,1"
                                            TriangleIndices = "0 1 2     2,3,0"
                                            TextureCoordinates="0,1 1,1 1,0 0,0"
                                        />
                            </GeometryModel3D.Geometry>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial>
                                    <DiffuseMaterial.Brush>
                                        <VisualBrush Viewport="0,0,.5,.25" TileMode="Tile" Visual="{Binding ElementName=cubebg}"/>
                                    </DiffuseMaterial.Brush>
                                </DiffuseMaterial>
                            </GeometryModel3D.Material>
                        </GeometryModel3D>

                        <!-- Left -->
                        <GeometryModel3D>
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D
                                            Positions = "-1,-1,-1 -1,-1,1 -1,1,1 -1,1,-1"
                                            TriangleIndices = "0 1 2     2,3,0"
                                            TextureCoordinates="0,1 1,1 1,0 0,0"
                                        />
                            </GeometryModel3D.Geometry>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial>
                                    <DiffuseMaterial.Brush>
                                        <VisualBrush Viewport="0,0,.5,.25" TileMode="Tile" Visual="{Binding ElementName=cubebg}"/>
                                    </DiffuseMaterial.Brush>
                                </DiffuseMaterial>
                            </GeometryModel3D.Material>
                        </GeometryModel3D>

                        <!-- Back -->
                        <GeometryModel3D>
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D
                                            Positions = "1,-1,-1 -1,-1,-1 -1,1,-1 1,1,-1"
                                            TriangleIndices = "0 1 2     2,3,0"
                                            TextureCoordinates="0,1 1,1 1,0 0,0"
                                        />
                            </GeometryModel3D.Geometry>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial>
                                    <DiffuseMaterial.Brush>
                                        <VisualBrush Viewport="0,0,.5,.25" TileMode="Tile" Visual="{Binding ElementName=cubebg}"/>
                                    </DiffuseMaterial.Brush>
                                </DiffuseMaterial>
                            </GeometryModel3D.Material>
                        </GeometryModel3D>

                        <!-- Bottom -->
                        <GeometryModel3D>
                            <GeometryModel3D.Geometry>
                                <MeshGeometry3D
                                            Positions = "-1,-1,-1 1,-1,-1 1,-1,1 -1,-1,1"
                                            TriangleIndices = "0 1 2     2,3,0"
                                            TextureCoordinates="0,1 1,1 1,0 0,0"
                                        />
                            </GeometryModel3D.Geometry>
                            <GeometryModel3D.Material>
                                <DiffuseMaterial>
                                    <DiffuseMaterial.Brush>
                                        <VisualBrush Viewport="0,0,.5,.25" TileMode="Tile" Visual="{Binding ElementName=cubebg}"/>
                                    </DiffuseMaterial.Brush>
                                </DiffuseMaterial>
                            </GeometryModel3D.Material>
                        </GeometryModel3D>
                    </Model3DGroup>
                </ModelVisual3D.Content>
            </ModelVisual3D>
        </Viewport3D>
创建模型
创建panel
<WrapPanel  Visibility="Hidden">
            <Border x:Name="cubebg"  Background="{StaticResource LGBrush}" BorderThickness="2">
                <WrapPanel  Margin="1" >
                    <Border  Width="10" Height="10" Background="AliceBlue"/>
                </WrapPanel>
            </Border>
  </WrapPanel>
View Code
创建动画
<Window.Triggers>
        <EventTrigger RoutedEvent="Viewport3D.Loaded">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <BeginStoryboard.Storyboard>
                        <Storyboard>
                            <DoubleAnimation From="0" To="180" Storyboard.TargetName="vr" Storyboard.TargetProperty="Angle"
                                             AutoReverse="True" Duration="0:0:8" RepeatBehavior="Forever"/>
                            <DoubleAnimation From="180" To="360" Storyboard.TargetName="hr" Storyboard.TargetProperty="Angle"
                                             AutoReverse="True" Duration="0:0:8" RepeatBehavior="Forever"/>
                            <DoubleAnimation From="0" To="1" Storyboard.TargetName="cubebg" Storyboard.TargetProperty="(Border.Background).(LinearGradientBrush.GradientStops)[1].(GradientStop.Offset)"
                                             AutoReverse="True" BeginTime="0:0:0" Duration="0:0:1.5" RepeatBehavior="Forever"/>
                        </Storyboard>
                    </BeginStoryboard.Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
    </Window.Triggers>
创建动画

 其它(内部颜色渐变效果)

<Window.Resources>
        <LinearGradientBrush x:Key="LGBrush" StartPoint="0,0.5" EndPoint="1,0.5">
            <GradientStop Color="White" Offset="0"/>
         <GradientStop Color="Red" Offset="0.46"/>
            <GradientStop Color="LightSkyBlue" Offset="1"/>
       </LinearGradientBrush>
</Window.Resources>


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM