Viewport2DVisual3D

ひとつ前の投稿の続きで、Viewport2DVisual3Dについて簡単に紹介します。


Viewport2DVisual3Dは、3D Toolsを試されたことがある方であれば、なじみのあるものだと思います。3D Toolsに含まれるInteractive3DDecoratorとInteractiveVisual3Dで実現する機能が標準で対応されたものと捉えて良いかと思います。


コントロールなどの2DオブジェクトをVisualBrushを使って3Dのマテリアルを塗りつぶすことで、3Dオブジェクト上に2Dオブジェクトを描画することができました。ですが、これは単純に2Dオブジェクトの外観の通りに3Dオブジェクトを塗りつぶしているだけですので、たとえ3Dオブジェクト上にButtonを描画させたとしても、そのButtonを押すことはできません。


Viewport2DVisual3Dは、疑似的にではあるものの3Dオブジェクト上に2Dオブジェクトであるコントロールを描画し、なおかつキーボードやマウスなどの操作を可能にしてくれるオブジェクトです。ただし、3D Toolsと同様、ComboBoxのドロップダウンなど、Popupを利用している部分については通常の2Dと同じ表示になってしまいますので、その点は注意が必要です。


XAML

<Window x:Class="Window1"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <MeshGeometry3D x:Key="mGeometry" TriangleIndices="0,1,2 3,4,5" Positions="-1,-1,2 1,-1,2 1,1,2 1,1,2 -1,1,2 -1,-1,2 "
        TextureCoordinates="0,1 1,1 1,0 1,0, 0,0 0,1"/>
    </Window.Resources>
 
    <DockPanel>
        <Viewport3D HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
 
            <Viewport3D.Camera>
                <PerspectiveCamera LookDirection="3,-3,-2" NearPlaneDistance="0.1" Position="-3,3,4" UpDirection="0.5,0.5,-0.5"/>
            </Viewport3D.Camera>
 
            <ModelVisual3D >
                <ModelVisual3D.Content>
                    <AmbientLight Color="#FFFFFFFF"/>
                </ModelVisual3D.Content>
            </ModelVisual3D>
 
            <Viewport2DVisual3D Geometry="{StaticResource mGeometry}">
                <Viewport2DVisual3D.Visual>
                    <TextBox/>
                </Viewport2DVisual3D.Visual>
                <Viewport2DVisual3D.Material>
                    <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="true"/>
                </Viewport2DVisual3D.Material>
            </Viewport2DVisual3D>
 
        </Viewport3D>
    </DockPanel>
 
</Window>