none
WPF 3D RotateTransform3D помогите разобраться, как делать вращение по нескольким осям последовательно RRS feed

  • Вопрос

  • Помогите, пожалуйста!

     

    Если перемещать кубик только по осям X и Y, то все работает нормально.

    Если перемещать только по оси Z, то тоже все работает нормально.

    Но, если переместить кубик по оси Z, а потом начать перемещать по осям X или Y, то получится вранье (перемещение по осям X и Y путается и меняется местами).

     

    Например, если сдвинуть кубик на 90 градусов по оси Z, то X и Y поменяются местами при вращении их ползунками.

     

    Как сделать, что бы каждый ползунок управлял вращением кубика относительно системы координат? Т.е. что бы перемещение по Z не влияло на направления перемещений по X и Y.

     

    <Window x:Class="Вращение_кубика_вокруг_осей_v._6.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="Вращение кубика вокруг осей v.6" Height="350" Width="500" WindowStartupLocation="CenterScreen" WindowState="Maximized">
        <Window.Resources>
            
            <Model3DGroup x:Key="cube">
                <!-- front -->
                <GeometryModel3D>
                    <GeometryModel3D.Geometry>
                        <MeshGeometry3D Positions="-1,-1,-1 1,-1,-1 -1,1,-1 1,1,-1 
                                                               -1,-1, 1 1,-1, 1 -1,1, 1 1,1,1"
                                        
                                                    TriangleIndices="0,2,1 1,2,3 4,6,0 2,0,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"
                                                    TextureCoordinates="1,1 0,1 1,0 0,0
                                                                        0,1 1,1 0,0 1,0"/>
                    </GeometryModel3D.Geometry>
    
                    <GeometryModel3D.Material>
                        <MaterialGroup>
                            <DiffuseMaterial Brush="LightBlue" />
                            <DiffuseMaterial>
                                <DiffuseMaterial.Brush>
                                    <ImageBrush ImageSource="cat.jpg" />
                                    <!--<ImageBrush ImageSource="http://social.msdn.microsoft.com/Forums/getfile/304999" />-->
                                </DiffuseMaterial.Brush>
                            </DiffuseMaterial>
                            <EmissiveMaterial Brush="DarkBlue" />
                        </MaterialGroup>
                    </GeometryModel3D.Material>
                </GeometryModel3D>
    
                
            </Model3DGroup>
    
            <Model3DGroup x:Key="axis">
                <!--ось X-->
                <GeometryModel3D>
                    <GeometryModel3D.Geometry>
                        <MeshGeometry3D
                                                Positions="-2,0.05,0   -2,-0.05,0   2,-0.05,0   2,0.05,0
                                                2,0.1,0   2.25,0,0   2,-0.1,0"
                                                TriangleIndices="0 1 2 2 3 0
                                                6 5 4"
                                            />
                    </GeometryModel3D.Geometry>
    
                    <GeometryModel3D.Material>
                        <MaterialGroup>
                            <DiffuseMaterial Brush="Aqua" />
                        </MaterialGroup>
                    </GeometryModel3D.Material>
                </GeometryModel3D>
    
                <!--ось Z-->
                <GeometryModel3D>
                    <GeometryModel3D.Geometry>
                        <MeshGeometry3D
                                                Positions="-0.05,2,0   -0.05,-2,0   0.05,-2,0   0.05,2,0
                                                -0.1,2,0   0,2.25,0   0.1,2,0"
                                                TriangleIndices="0 1 2 2 3 0
                                                6 5 4"
                                            />
                    </GeometryModel3D.Geometry>
    
                    <GeometryModel3D.Material>
                        <MaterialGroup>
                            <DiffuseMaterial Brush="Aqua" />
                        </MaterialGroup>
                    </GeometryModel3D.Material>
                </GeometryModel3D>
    
                <!--ось Y-->
                <GeometryModel3D>
                    <GeometryModel3D.Geometry>
                        <MeshGeometry3D
                                                Positions="0,0.06,-2   0,-0.06,-2   0,-0.06,2   0,0.06,2
                                                0,0.11,-2   0,0,-2.6   0,-0.11,-2"
                                                TriangleIndices="0 3 2 2 1 0
                                                6 5 4"
                                            />
                    </GeometryModel3D.Geometry>
    
                    <GeometryModel3D.Material>
                        <MaterialGroup>
                            <DiffuseMaterial Brush="Aqua" />
                        </MaterialGroup>
                    </GeometryModel3D.Material>
                </GeometryModel3D>
            </Model3DGroup>
        </Window.Resources>
        
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"></ColumnDefinition>
                <ColumnDefinition Width="3*"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <GridSplitter Grid.Column="0" VerticalAlignment="Stretch" Width="5"></GridSplitter>
    
            <Label Grid.Column="0" Content="шаг 90 градусов" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="5,0,0,0" FontSize="14"/>
            <Label Grid.Column="0" Content="x" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="20,25,0,0" FontSize="14"/>
            <Label Grid.Column="0" Content="y" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="20,50,0,0" FontSize="14"/>
            <Label Grid.Column="0" Content="z" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="20,75,0,0" FontSize="14"/>
    
            <Slider Grid.Column="0" Height="25" VerticalAlignment="Top" Maximum="360" TickPlacement="BottomRight" TickFrequency="90" LargeChange="90" Value="{Binding ElementName=rotate_x, Path= Angle}" Margin="40,28,10,0" SmallChange="1" />
            <Slider Grid.Column="0" Height="25" VerticalAlignment="Top" Maximum="360" TickPlacement="BottomRight" TickFrequency="90" LargeChange="90" Value="{Binding ElementName=rotate_y, Path= Angle}" Margin="40,53,10,0" SmallChange="1" />
            <Slider Grid.Column="0" Height="25" VerticalAlignment="Top" Maximum="360" TickPlacement="BottomRight" TickFrequency="90" LargeChange="90" Value="{Binding ElementName=rotate_z, Path= Angle}" Margin="40,78,10,0" SmallChange="1" />
    
            <Image Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="10,123,10,10" Source="Координаты.gif"/>
    
            <Viewport3D Grid.Column="1" >
                <Viewport3D.Camera>
                    <!--Установка камеры - перспективная проекция-->
                    <PerspectiveCamera Position="4, 4, 4" LookDirection="-1, -1, -1" />
                </Viewport3D.Camera>
    
                <ModelVisual3D>
                    <ModelVisual3D.Content>
                        <!--Установка освещения -->
                        <Model3DGroup>
                            <AmbientLight Color="#404040" />
                            <DirectionalLight Color="#C0C0C0" Direction="-2 -4 -2" />
                        </Model3DGroup>
                    </ModelVisual3D.Content>
                </ModelVisual3D>
    
                <!-- Add models. -->
                <ModelVisual3D Content="{StaticResource cube}">
                    <!--<ModelVisual3D.Content>-->
                    <ModelVisual3D.Transform>
                        <Transform3DGroup>
                            <RotateTransform3D CenterX="0" CenterY="0" CenterZ="0">
                                <RotateTransform3D.Rotation> 
                                    <AxisAngleRotation3D x:Name="rotate_x" Axis="1 0 0" />
                                </RotateTransform3D.Rotation>
                            </RotateTransform3D>
                            <RotateTransform3D CenterX="0" CenterY="0" CenterZ="0">
                                <RotateTransform3D.Rotation>
                                    <AxisAngleRotation3D x:Name="rotate_y" Axis="0 0 -1" />
                                </RotateTransform3D.Rotation>
                            </RotateTransform3D>
                            <RotateTransform3D CenterX="0" CenterY="0" CenterZ="0">
                                <RotateTransform3D.Rotation>
                                    <AxisAngleRotation3D x:Name="rotate_z" Axis="0 1 0" />
                                </RotateTransform3D.Rotation>
                            </RotateTransform3D>
                        </Transform3DGroup>
                    </ModelVisual3D.Transform>
                </ModelVisual3D>
    
                <!--оси X,Y,Z-->
                <ModelVisual3D Content="{StaticResource axis}">
                </ModelVisual3D>
    
            </Viewport3D>
        </Grid>
    </Window>
    

    17 июля 2013 г. 19:40

Все ответы