1

Viewport3D にモデルがあり、その横にテキスト ボックスを描画したいのですが、そのテキスト ボックスに「通常の」コントロールを Viewport3D に追加できますか?

4

2 に答える 2

2

以下の XAML では、いくつかの 2D コントロール、テキストブロック、および水平スタック パネル内のテキスト ボックスを含む Viewport3D を作成しました。探していたコントロールは Viewport2DVisual3D であり、ジオメトリとマテリアルを記述する必要がありますが、その後ワールド空間で使用できます。

Viewport2DVisual3D コントロールの最も優れた点は、マウス アクションをワールド空間に逆投影することです。つまり、ビューポートに配置したコントロールは、2D で描画されたかのように使用できます。

<Viewport3D>

    <!-- To look in to a 3D world you need a camera just like a game.-->
    <Viewport3D.Camera>
        <!-- 
        I've positioned the camera at the center of the world and moved it back
        Along the Z axis, try changing the numbers here to see how it works.
    -->
        <PerspectiveCamera Position="0, 0, 3"/>
    </Viewport3D.Camera>

    <!-- All 3D worlds need to have a light, you can again play with the values
        here to see what they mean, Directional light is one that starts at a 
        location in the world and shines in a given direction.
-->
    <ModelVisual3D>
        <ModelVisual3D.Content>
            <DirectionalLight Color="White" Direction="0,0,-1"/>
        </ModelVisual3D.Content>
    </ModelVisual3D>

    <!-- 
    This is the wonder control that allows you to display WPF controls 
    in a 3D model.
-->
    <Viewport2DVisual3D >

        <!-- 
        The 3D model is made up of a vertex list, each grouping of 3 digits
        in the positions property is a point on a polygon, here I've used
        4 points to represent a flat square surface (2 triangles to make the square)
        and relate to a bitmap produced from your WPF controls 
        Triangle TriangleIndices map positions in to triangles, here I've got 
        1             2 imagine a triangle drawn through points 0, 1, 2
                        and another drawn from 0, 2 and 3 

        0             3
        The texture coords tell the 3D viewport how to map your controls visual to the 
        points in positions, texture coordinates range from 0,0 top left to 1,1 bottom right
    -->
        <Viewport2DVisual3D.Geometry>
            <MeshGeometry3D Positions="-1,1,0 -1,-1,0 1,-1,0 1,1,0" TriangleIndices="0 1 2 0 2 3" TextureCoordinates="0,0 0,1 1,1 1,0"/>
        </Viewport2DVisual3D.Geometry>
        <Viewport2DVisual3D.Material>
            <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True" Brush="White"/>
        </Viewport2DVisual3D.Material>

        <!-- Here I'm doing a transform, it's the same as simply rotating a control using it's render transform
            in WPF
    -->
        <Viewport2DVisual3D.Transform>
            <RotateTransform3D>
                <RotateTransform3D.Rotation>
                    <!-- Play around with the Axis numbers to see what they mean.-->
                    <AxisAngleRotation3D Angle="-45" Axis="1, 0, 0" />
                </RotateTransform3D.Rotation>
            </RotateTransform3D>
        </Viewport2DVisual3D.Transform>

        <!-- This is the 2D bit, inside the visual property you can place any WPF controls. -->
        <Viewport2DVisual3D.Visual>
            <StackPanel Orientation="Horizontal">

                <!-- This bit is obvious. -->
                <TextBlock Text="3D user interface!"/>
                <TextBox />
            </StackPanel>
        </Viewport2DVisual3D.Visual>
    </Viewport2DVisual3D>

</Viewport3D>
于 2012-06-18T14:58:14.757 に答える
0

Viewport3D の上にキャンバスを配置するだけです。

<Grid>
  <Viewport3D>
    [..]
  </Viewport3D>
  <Canvas>
    <TextBox />
  </Canvas>
</Grid>

それはあなたが作りたいものに依存します。

于 2015-02-07T16:04:00.850 に答える