5

Viewport3Dを使用して幾何学的計算を行うという唯一の目的のためにが必要Petzold.Media3D.ViewportInfoです。に配置しWindowたり、レンダリングしたりする必要はありません。

Viewport3D次のC#メソッドを使用して、をインスタンス化し、いくつかのプロパティを設定することで、これを実現しようとしています。

private Viewport3D CreateViewport(MainSettings settings)
{
    var cameraPosition = new Point3D(0, 0, settings.CameraHeight);
    var cameraLookDirection = new Vector3D(0, 0, -1);
    var cameraUpDirection = new Vector3D(0, 1, 0);
    var camera = new PerspectiveCamera
    {
        Position = cameraPosition,
        LookDirection = cameraLookDirection,
        UpDirection = cameraUpDirection
    };
    var viewport = new Viewport3D
    {
        Camera = camera,
        Width = settings.ViewportWidth,
        Height = settings.ViewportHeight
    };
    return viewport;
}

後で、このビューポートを使用して、次の方法を使用してマウスの位置を3Dの位置に変換しようとしています。

public Point3D? Point2dToPoint3d(Point point)
{
    var range = new LineRange();
    var isValid = ViewportInfo.Point2DtoPoint3D(_viewport, point, out range);
    if (isValid)
        return range.PointFromZ(0);
    else
        return null;
}

残念ながら、それは機能していません。ActualWidthその理由は、ビューポートのとが両方ともゼロであるためだと思いActualHeightます(これらは読み取り専用のプロパティであるため、手動で設定することはできません)。(注:実際のレンダリングでまったく同じメソッドをテストしましたが、Viewport3D正常に機能したため、コンバーターメソッドに問題がないことはわかっています。)

と設定に基づいてコントロールのActualWidthとをWPFに割り当てる方法はありますか?ActualHeightWidthHeight

とをそれぞれHorizontalAlignmentVerticalAlignmentに設定してみましたが、ともいじりましたが、これらのプロパティはいずれもまたはに影響を与えませんでした。LeftTopMinWidthMinHeightActualWidthActualHeight

4

1 に答える 1

5

ActualWidthプロパティのMSDNトピックから:

このプロパティは、他の幅の入力とレイアウトシステムに基づいて計算された値です。値は、実際のレンダリングパスに基づいてレイアウトシステム自体によって設定されるため、入力変更の基礎となる幅などのプロパティの設定値よりもわずかに遅れる場合があります。

したがって、これは、プロパティを設定するためにレンダリングパスが必要であるように聞こえます。ただし、呼び出しMeasure(Size)Arrange(Rect)からレイアウトプロセスをシミュレートすることはできます。多分これはすでに十分です。

于 2010-06-01T07:47:24.213 に答える