Windows Presentation Foundation, Viewport3D

Published 28 July 06 01:39 PM | hiroyuk 

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

Attachment(s): teapot.xaml

Comments

# vixar said on September 6, 2006 3:03 PM:
xamlの3Dアニメーションについて質問があります。

Storyboardの移動やスケールはXYZに分かれてアニメーションできるのに、回転アニメーションRotation3DAnimationUsingKeyFramesだけは、一つの軸でしか回転できません。

回転はどうやればXYZ全部できるでしょうか?
# vixar said on September 6, 2006 3:05 PM:
xamlの3Dアニメーションについて質問があります。

Storyboardの移動やスケールはXYZに分かれてアニメーションできるのに、回転アニメーションRotation3DAnimationUsingKeyFramesだけは、一つの軸でしか回転できません。

回転はどうやればXYZ全部できるでしょうか?
# hiroyuk said on September 8, 2006 10:42 AM:
<a href="http://windowssdk.msdn.microsoft.com/en-us/library/system.windows.media.animation.rotation3danimationusingkeyframes.keyframes.aspx">AxisAngleRotation3D</a> を使いましょう。
# vixar said on September 9, 2006 5:08 AM:
あまり正確ではないですが、クォータニオンを使ってできました。
# vixar said on September 10, 2006 1:22 PM:
前回はありがとうございました。

ところでまた質問があるのですが、Pivot(中心点ですよね?)は、xamlでどのように記述すればいいのでしょうか?
# hiroyuk said on September 15, 2006 6:04 AM:
RotateTransform3DならCenterX,CenterY,CenterZというプロパティが使えます。
# vixar said on September 15, 2006 11:08 AM:
何度もありがとうございました。

中心点がわかったので、3Dアニメーションツールからxaml形式にエクスポートできるようになりました。
http://tool.cyberdelia.net/
# vixar said on September 17, 2006 12:32 PM:
MeshGeometry3Dで、法線Normalsを省略しても、勝手に法線を計算してくれているようですが、スムージング角度を指定したりできますか?

それとも、見た感じ、陰影が少ないのですが、法線は関係なくて、必要もないのでしょうか?

何度もすみませんが、川西さんしか日本で質問できる人がいないので。
# hiroyuk said on September 21, 2006 1:31 AM:
SDKドキュメントhttp://windowssdk.msdn.microsoft.com/en-us/library/ms747437.aspx によると、"Though the Windows Presentation Foundation can determine default normal vectors by using the position coordinates, you can also specify different normal vectors to approximate the appearance of curved surfaces." なので、 自動的に生成してくれるようですが、しっくりこないときは明示的に入れたほうがよいでしょう。
ちなみにデフォルト テクスチャ座標も自動生成してくれるようです。"As with the Normals property, the graphics system can calculate default texture coordinates, but you might choose to set different texture coordinates to control the mapping of a texture that includes part of a repeating pattern, for example."
# vixar said on September 23, 2006 11:10 AM:
川西さん、ありがとうございます。

どちらも、書き出すか書き出さないか選択できるようにしました。
Anonymous comments are disabled

About hiroyuk

マイクロソフト㈱エバンジェリスト。北海道大学理学部物理学科卒。リアルタイム3Dグラフィックスを専門とし、グラフィックスやシェーダに関する技術文章を執筆・講演。 DirectX SDK日本語ドキュメントの開発に携わるとともに、Windows Presentation Foundation プログラミング(オーム社)、Game Programming Gemsシリーズ、リアルタイム レンダリング第2版(ボーンデジタル)、Texturing & Modeling, A Procedural Approach などを翻訳・監修、XAMLプログラミング(ソフトバンク クリエイティブ)を執筆。趣味は薪割り。

Search

This Blog

DirectX 情報

Silverlight 情報

Windows 情報

WPF 情報

並列コンピューティング情報

著書

Syndication

Page view tracker