Share via


Windows Presentation Foundation, Viewport3D

Windows Presentation Foundation (WPF) の売りの1つは、2Dも3Dもビデオもテキストも同じように扱えることです。これまでですと、3DはDirect3D、ビデオはDirctShow、2DはGDIなどと、それぞれ異なるプログラミングモデルとアーキテクチャを使わざるを得ませんでした。WPFでは描画としてどれも同じように使えます、たとえば描画したいところにテキストを書きたければ、 <TEXTBLOCK>World</TEXTBLOCK>と書けばよいし、画像を表示させたければ、<Image Source="follow.jpg" />に入れ替えるだけです。

3Dを描画したい場合には、Viewport3D を使います。ただし3Dを描画するにはカメラやジオメトリオブジェクト、マテリアル、座標変換などを設定しなければならないので、1行というわけにはいきません。ここでは、よく使われるティーポットを回転させる例をXAMLで紹介します。

まず、カメラの視点位置、向き、視野角などを設定します。

  <DockPanel Background="DarkBlue">
    <Viewport3D Name="myViewport">
      <!--カメラ-->
      <Viewport3D.Camera>
<PerspectiveCamera FarPlaneDistance="20" LookDirection="5,-2,-3"
UpDirection="0,1,0" NearPlaneDistance="0" Position="-5,2,3" FieldOfView="45" />
</Viewport3D.Camera>

次に光源です、ここでは白のディフューズ平行光源と、暗い灰色のアンビエント光を設定します。
      <!--ライトとモデル-->
      <ModelVisual3D x:Name="topModelVisual3D">
<ModelVisual3D.Children>
          <!--アンビエント光-->
          <ModelVisual3D>
<ModelVisual3D.Content>
<AmbientLight Color="#333333" />
</ModelVisual3D.Content>
</ModelVisual3D>
          <!--ディフューズ光の平行光-->
          <ModelVisual3D>
<ModelVisual3D.Content>
<DirectionalLight Color="#FFFFFFFF" Direction="-0,-0,-5" />
</ModelVisual3D.Content>
</ModelVisual3D>

そして、モデルの定義です、ここではジオメトリデータをリソースを使って定義しています。マテリアルとしてはやはり白を SolidColorBrush で設定しています。ご想像通り、ここで画像やテキストを設定すれば、テクスチャとして3Dモデルに貼り付けられます。
          <!--モデル-->
          <ModelVisual3D>
<ModelVisual3D.Content>
              <!--ジオメトリデータ-->
              <GeometryModel3D Geometry="{StaticResource myTeapot}">
                <!--マテリアル-->
                <GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush Color="White" Opacity="1.0" />
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>

最後に座標変換です、ここではStoryBoard (省略) を使って回転のアニメーションを設定しています。
                <!--座標変換-->
                <GeometryModel3D.Transform>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D x:Name="myAngleRotation" Axis="0,3,0" Angle="1" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content>
</ModelVisual3D>
</ModelVisual3D.Children>
</ModelVisual3D>

      <!--アニメーション-->
      <Viewport3D.Triggers>
<EventTrigger RoutedEvent="Viewport3D.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="myAngleRotation"
Storyboard.TargetProperty="Angle" From="0" To="360"
Duration="0:0:10" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Viewport3D.Triggers>
</Viewport3D>
</DockPanel>

決して簡単ではありませんが、3Dグラフィックスの基本を知っていれば、何のことはありません、お決まりの設定ばかりです。(.IE上で動作するXAMLファイルを添付しましたのでトライしてみてください。ただし動作させるには、NET Framework 3.0 ランタイムをインストールする必要があります。

teapot.xaml