に表示する必要がある次の画像がありますViewport3D
。
画像テクスチャの中心は (0,0) で、その角の座標は (-1,-1,0)、(1,-1,0)、(-1,1,0)、(1,1,0) です。 )。
PerspectiveCamera
固定視野で使用しているため、画像全体を表示するのに十分な距離を計算する必要があります。
画像は青い線で表され、wは画像の幅 (w=2) です。
カメラの位置は (0,0,d) であるため、三角形が形成されます。
tan(fov/2) = (w/2) / d
d = (w/2) / tan(fov/2)
次に、3D モデル用の XAML コードと、カメラ距離を計算するためのコード ビヒングをまとめます。
XAML
<Window x:Class="Render3DTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="256" Width="256" Loaded="Window_Loaded">
<Grid>
<Viewport3D Name="viewport">
<Viewport3D.Camera>
<PerspectiveCamera Position="0,0,1" LookDirection="0,0,-1" FieldOfView="90" />
</Viewport3D.Camera>
<ModelVisual3D>
<ModelVisual3D.Content>
<AmbientLight/>
</ModelVisual3D.Content>
</ModelVisual3D>
<ModelVisual3D>
<ModelVisual3D.Content>
<GeometryModel3D>
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<ImageBrush ImageSource="image.jpg"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
<GeometryModel3D.Geometry>
<MeshGeometry3D Positions="-1,1,0 -1,-1,0 1,-1,0 1,1,0" TextureCoordinates="0,0 0,1 1,1 1,0" TriangleIndices="0 1 2, 0 2 3" />
</GeometryModel3D.Geometry>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</Viewport3D>
</Grid>
</Window>
コードビハインド
private void Window_Loaded(object sender, RoutedEventArgs e)
{
PerspectiveCamera camera = (PerspectiveCamera)this.viewport.Camera;
double d = (1.0 / Math.Tan(camera.FieldOfView / 2.0));
camera.Position = new Point3D(0.0, 0.0, d);
}
ただし、 はViewport3D
イメージ全体を表示しません。
役割を果たしている他の要因はありますか?計算に微調整やファッジ要素を使用したくありません。
ウィンドウのサイズを変更しても、ビューの水平範囲はカメラ FOV とその距離によって決定されるため、影響を受けないことに注意してください。したがって、この問題はコントロール サイズとは関係ありません。これは、WPF が 3D からポイントを投影する方法に関連しています。 2D。