0

私は数日間この問題と戦ってきましたが、解決したり、Web でサポートを見つけたりすることができませんでした。基本的に、ビジュアル要素としてキャンバスを使用して VisualBrush を作成しようとしています。このキャンバスに複数の線を描画できるようにしたいと考えており、最終的には 3D サーフェス (長方形を形成する 2 つの平行な三角形) にマッピングします。テクスチャ座標を設定し、ImageBrush などを使用するだけですべてが機能することを確認できます。私が抱えている問題は、キャンバスがそのサイズを維持することを拒否し、その中のコンテンツに基づいて常にスケーリングされることです. たとえば、キャンバスが 100x100 で、その中に (0, 0) から (50, 50) までの 1 行がある場合、キャンバスは、コンテンツを含む 50x50 の部分のみがテクスチャ座標と 3D サーフェスにマップされるようにスケーリングされます。Viewport/Viewbox/StretchMode/Alignment/etc の多くの組み合わせを試しましたが、これが起こらないようにするものは何も見つかりません。キャンバスの幅と高さのプロパティを設定しているので、グリッドや他のレイアウト コンテナーに単純に追加した場合と、VisualBrush でのパフォーマンスが異なる理由がわかりません。

問題を説明するのに役立つコードを次に示します。

        // create the canvas for the VisualBrush
        Canvas drawCanvas = new Canvas();
        drawCanvas.Background = Brushes.Transparent; // transparent canvas background so only content is rendered
        drawCanvas.Width = 100;
        drawCanvas.Height = 100;

        // add a line to the canvas
        Line l = new Line();
        l.X1 = 0;
        l.Y1 = 0;
        l.X2 = 50;
        l.Y2 = 50;
        l.Stroke = Brushes.Red;
        l.StrokeThickness = 2;
        drawCanvas.Children.Add(l);

        // create rectangular surface mesh
        MeshGeometry3D TableMesh = new MeshGeometry3D();
        CreateRectangleModel(
            new Point3D(0, 0, 0),
            new Point3D(0, 0, 100),
            new Point3D(100, 0, 100),
            TableMesh);

        // need to include texture coordinates for our table mesh to map canvas to 3D model
        TableMesh.TextureCoordinates = new PointCollection { 
            new Point(0, 0), new Point(0, 1), new Point(1, 1),
            new Point(1, 1), new Point(0, 1), new Point(0, 0),
            new Point(1, 1), new Point(1, 0), new Point(0, 0),
            new Point(0, 0), new Point(1, 0), new Point(1, 1)
        };

        // finally make our visual brush with the canvas we have created
        VisualBrush vb = new VisualBrush();
        vb.Visual = drawCanvas;
        Material TableMaterial = new DiffuseMaterial(vb);

        // add our new model to the scene
        GeometryModel3D geometry = new GeometryModel3D(TableMesh, TableMaterial);
        Model3DGroup group = new Model3DGroup();
        group.Children.Add(geometry);
        ModelVisual3D previewTable = new ModelVisual3D();
        previewTable.Content = group;
        MainViewport.Children.Add(previewTable);

そして、私が参照した1つの関数は

    private void CreateRectangleModel(Point3D pStart, Point3D pCorner1, Point3D pEnd, MeshGeometry3D mesh)
    {
        //  pCorner -> O--O <- pEnd
        //             | /|
        //             |/ |
        //   pStart -> O--O <- pCorner2

        // find the remaining point for our rectangle
        Point3D pCorner2 = new Point3D(
            pStart.X + (pEnd.X - pCorner1.X),
            pStart.Y + (pEnd.Y - pCorner1.Y),
            pStart.Z + (pEnd.Z - pCorner1.Z));

        // add necessary triangles to our group (we create 2 facing up, 2 facing down)
        CreateTriangleModel(pStart, pCorner1, pEnd, mesh);
        CreateTriangleModel(pEnd, pCorner1, pStart, mesh);
        CreateTriangleModel(pEnd, pCorner2, pStart, mesh);
        CreateTriangleModel(pStart, pCorner2, pEnd, mesh);
    }

子コンテンツがこれらの極限まで行かない限り、キャンバスの設定サイズを 100x100 に維持することはできません。私の目的では、線の座標はキャンバス内のどこにでもある可能性があり、コンテンツに関係なく目的の形状を維持する必要があります。

どんなアドバイスでも大歓迎です!

4

1 に答える 1

0

試してみるいくつかのこと:

  • 手動で 100x100 ピクセルの画像ファイルを作成し、それを ImageBrush に入れ、そのブラシを DiffuseMaterial で使用します。これは、テクスチャ座標などが正しく設定されていることを確認するためです。

  • キャンバスで透明な背景色を使用する代わりに、緑を試してください (これは、透明なピクセルに基づいてテクスチャがトリミングされているかどうかを確認するためです)。

  • テクスチャのトリミングが行われている場合 (透明度が原因)...次に、テクスチャを希望する寸法でキャンバスに長方形を配置してみてください...おそらく何かが変わるでしょう。

  • または、RenderTargetBitmap を使用して Canvas ビジュアルから画像を作成してみてください...次に、その画像を ImageBrush 内で使用します。(その後、画像が 100x100 の予想される領域であることを確認できます)。

  • 最後に、Canvas+VisualBrush を使用してテクスチャを作成する代わりに、DrawingBrush+DrawingGroup+GeometryDrawing を使用してブラシを作成してみてください。

于 2012-08-19T01:37:16.753 に答える