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.

