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