1

に表示する必要がある次の画像があります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。

4

2 に答える 2