WPF 3D При отдалении камеры OrthographicCamera от объекта, объект не уменьшается. При PerspectiveCamera объект уменьшается с расстоянием

Как сделать так чтобы при ортографической камере можно было приближать и отдалять камеру от объекта?

введите сюда описание изображения

введите сюда описание изображения

<Window x:Class="OrthographicCameraNotWork.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:OrthographicCameraNotWork"
        mc:Ignorable="d"
        Title="MainWindow" Height="600" Width="1200">
    <Grid Margin="10">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="auto"/>
                <RowDefinition Height="1*"/>
                <RowDefinition Height="auto"/>
            </Grid.RowDefinitions>
            <StackPanel Grid.Row="0" Orientation="Horizontal">
                <TextBlock Text="Camera Distance:" Margin="5 0 0 0"/>
                <Slider x:Name="mySlider" Minimum="0" Maximum="30" Value="0" Width="200" ValueChanged="mySlider_ValueChanged" Margin="5 0 0 0"/>
                <TextBlock x:Name="mySliderText" Text="0" Margin="5 0 0 0"/>
            </StackPanel>
            <Grid Grid.Row="1">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="1*"/>
                    <ColumnDefinition Width="1*"/>
                </Grid.ColumnDefinitions>
                <Viewport3D Grid.Column="0">
                    <Viewport3D.Camera>
                        <PerspectiveCamera x:Name="perspectiveCamera" Position="0, 1, 2" LookDirection="0, -1, -2" NearPlaneDistance="0.01" />
                    </Viewport3D.Camera>
                    <Viewport3D.Children>
                        <ModelVisual3D>
                            <ModelVisual3D.Content>
                                <DirectionalLight Color="White" Direction="-1,-1,-1" />
                            </ModelVisual3D.Content>
                        </ModelVisual3D>
                        <ModelVisual3D>
                            <ModelVisual3D.Content>
                                <Model3DGroup>
                                    <GeometryModel3D>
                                        <GeometryModel3D.Geometry>
                                            <MeshGeometry3D 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"
     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"/>
                                        </GeometryModel3D.Geometry>
                                        <GeometryModel3D.Material>
                                            <DiffuseMaterial Brush="#5F5FFF"/>
                                        </GeometryModel3D.Material>
                                    </GeometryModel3D>
                                </Model3DGroup>
                            </ModelVisual3D.Content>
                        </ModelVisual3D>
                    </Viewport3D.Children>
                </Viewport3D>
                <Viewport3D Grid.Column="1">
                    <Viewport3D.Camera>
                        <OrthographicCamera x:Name="orthographicCamera" Position="0, 1, 2" LookDirection="0, -1, -2" NearPlaneDistance="0.01" />
                    </Viewport3D.Camera>
                    <Viewport3D.Children>
                        <ModelVisual3D>
                            <ModelVisual3D.Content>
                                <DirectionalLight Color="White" Direction="-1,-1,-1" />
                            </ModelVisual3D.Content>
                        </ModelVisual3D>
                        <ModelVisual3D>
                            <ModelVisual3D.Content>
                                <Model3DGroup>
                                    <GeometryModel3D>
                                        <GeometryModel3D.Geometry>
                                            <MeshGeometry3D 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"
     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"/>
                                        </GeometryModel3D.Geometry>
                                        <GeometryModel3D.Material>
                                            <DiffuseMaterial Brush="#5F5FFF"/>
                                        </GeometryModel3D.Material>
                                    </GeometryModel3D>
                                </Model3DGroup>
                            </ModelVisual3D.Content>
                        </ModelVisual3D>
                    </Viewport3D.Children>
                </Viewport3D>
            </Grid>
            <Grid Grid.Row="2">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="1*"/>
                    <ColumnDefinition Width="1*"/>
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="PerspectiveCamera" HorizontalAlignment="Center" FontSize="16"/>
                <TextBlock Grid.Column="1" Text="OrthographicCamera" HorizontalAlignment="Center" FontSize="16"/>
            </Grid>
        </Grid>
    </Grid>
</Window>
private void mySlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    mySliderText.Text = mySlider.Value.ToString();

    perspectiveCamera.Position = new Point3D(mySlider.Value, 1, 2);
    perspectiveCamera.LookDirection = new Vector3D(-perspectiveCamera.Position.X, -perspectiveCamera.Position.Y, -perspectiveCamera.Position.Z);

    orthographicCamera.Position = new Point3D(mySlider.Value, 1, 2);
    orthographicCamera.LookDirection = new Vector3D(-orthographicCamera.Position.X, -orthographicCamera.Position.Y, -orthographicCamera.Position.Z);
}

Ответы (1 шт):

Автор решения: Laukhin Andrey

При ортогональной проекции сцены, в которой не применяется перспектива, предметы сохраняют свои размеры. Для реализации приближения/отдаления обычно пересчитывают просматриваемую область (ширину обзора). В WPF для OrthographicCamera для этого служит свойство Width.

В вашем случае, будет работать простое решение:

private void mySlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    mySliderText.Text = mySlider.Value.ToString();

    perspectiveCamera.Position = new Point3D(mySlider.Value, 1, 2);
    perspectiveCamera.LookDirection = -1 * (Vector3D)perspectiveCamera.Position;

    orthographicCamera.Position = new Point3D(mySlider.Value, 1, 2);
    orthographicCamera.LookDirection = -1 * (Vector3D)orthographicCamera.Position;

    orthographicCamera.Width = 2 + mySlider.Value;
}

P.S. Вместо mySliderText.Text = mySlider.Value.ToString() лучше использовать Binding в XAML.

→ Ссылка