我有以下图像,我需要在 a 中显示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 投影到二维。