如何使立方体在x轴上连续旋转,保持x和z轴在wpf中恒定?

时间:2013-03-01 08:05:56

标签: wpf 3d rotation

如何使三维立方体在y轴上连续旋转,使x和z轴在wpf ??

中保持不变

1 个答案:

答案 0 :(得分:0)

您可以在UserControl

中使用此代码
 <Viewport3D x:Name="CubeLogo"
            Height="400" Width="400" OpacityMask="#FF000000">
    <Viewport3D.Camera>
        <PerspectiveCamera x:Name="Camara"
                           FarPlaneDistance="20"
                           NearPlaneDistance="1"
                           LookDirection="0,-0.65,-1"
                           UpDirection="0.220607433377356,0.678217480739237,-0.440841362480504"
                           Position="0,1.6,2.6" FieldOfView="40" />
    </Viewport3D.Camera>

    <Viewport3D.Triggers>
        <EventTrigger RoutedEvent="FrameworkElement.Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation From="0" To="360" Duration="0:0:6"
                            Storyboard.TargetName="LogoRotation3D"
                            Storyboard.TargetProperty="Angle" RepeatBehavior="Forever" x:Name="Animacion"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Viewport3D.Triggers>

    <ModelVisual3D>
        <ModelVisual3D.Content>
            <Model3DGroup>
                <AmbientLight Color="White"/>

                <GeometryModel3D ScrollViewer.IsDeferredScrollingEnabled="False">
                    <GeometryModel3D.Geometry>
                                <MeshGeometry3D TriangleIndices="0,1,2 3,4,5 6,7,8 9,10,11 12,13,14 15,16,17 18,19,20 21,22,23 24,25,26 27,28,29 30,31,32 33,34,35 "
                                        Normals="0,0,-1 0,0,-1 0,0,-1 0,0,-1 0,0,-1 0,0,-1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,0,1 0,-1,0 0,-1,0 0,-1,0 0,-1,0 0,-1,0 0,-1,0 1,0,0 1,0,0 1,0,0 1,0,0 1,0,0 1,0,0 0,1,0 0,1,0 0,1,0 0,1,0 0,1,0 0,1,0 -1,0,0 -1,0,0 -1,0,0 -1,0,0 -1,0,0 -1,0,0"
                                        TextureCoordinates="1,1 1,0 0,0 0,0 0,1 1,1 0,1 1,1 1,0 1,0 0,0 0,1 0,1 1,1 1,0 1,0 0,0 0,1 1,1 1,0 0,0 0,0 0,1 1,1 1,0 0,0 0,1 0,1 1,1 1,0 0,0 0,1 1,1 1,1 1,0 0,0"
                                        Positions="-0.5,-0.5,-0.5 -0.5,0.5,-0.5 0.5,0.5,-0.5 0.5,0.5,-0.5 0.5,-0.5,-0.5 -0.5,-0.5,-0.5 -0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,0.5 -0.5,-0.5,-0.5 0.5,-0.5,-0.5 0.5,-0.5,0.5 0.5,-0.5,0.5 -0.5,-0.5,0.5 -0.5,-0.5,-0.5 0.5,-0.5,-0.5 0.5,0.5,-0.5 0.5,0.5,0.5 0.5,0.5,0.5 0.5,-0.5,0.5 0.5,-0.5,-0.5 0.5,0.5,-0.5 -0.5,0.5,-0.5 -0.5,0.5,0.5 -0.5,0.5,0.5 0.5,0.5,0.5 0.5,0.5,-0.5 -0.5,0.5,-0.5 -0.5,-0.5,-0.5 -0.5,-0.5,0.5 -0.5,-0.5,0.5 -0.5,0.5,0.5 -0.5,0.5,-0.5"/>
                    </GeometryModel3D.Geometry>

                    <GeometryModel3D.Transform>
                        <RotateTransform3D>
                            <RotateTransform3D.Rotation>
                                <AxisAngleRotation3D x:Name="LogoRotation3D"
                                                     Angle="35"
                                                     Axis="1 1 1"/>
                            </RotateTransform3D.Rotation>
                        </RotateTransform3D>
                    </GeometryModel3D.Transform>

                    <!-- Background color of the cube -->
                    <GeometryModel3D.BackMaterial>
                        <DiffuseMaterial Brush="WhiteSmoke"/>
                    </GeometryModel3D.BackMaterial>

                    <!-- Content of the cube -->
                    <GeometryModel3D.Material>
                        <DiffuseMaterial>
                            <DiffuseMaterial.Brush>
                                <VisualBrush>
                                    <VisualBrush.Visual>
                                        <Image x:Name="Logo" />
                                    </VisualBrush.Visual>
                                </VisualBrush>
                            </DiffuseMaterial.Brush>
                        </DiffuseMaterial>
                    </GeometryModel3D.Material>
                </GeometryModel3D>
            </Model3DGroup>

        </ModelVisual3D.Content>
    </ModelVisual3D>

</Viewport3D>

然后在另一个XAML中调用它:

xmlns:local="clr-namespace:RotatoryCube"

<local:RotatoryCube x:Name="RotatoryCubeInterface"></local:RotatoryCube>

而不是DoubleAnimation表示轮播将持续多长时间,以及FromTo角度。另请注意AxisRotation3D说明哪个Axis要旋转以及哪个角度。