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 ランタイムをインストールする必要があります。