Floating Teapot 2

以前このBlogに書いたFloating Teapotを改造して、マウスで回転するトラックボール機能を追加します。トラックボールのコードは、Windows SDKのWPFサンプルのFlipperにあるTrackball.csを使います。このトラックボールは使い方は簡単なのですが、XAMLのデータ構造をこのコードに合わせなければなりません。

まず、Windows1.xaml.csに追加するのは、このTrackball用の名前空間(#using DemoDev)とコンストラクタへの次の初期化コードです。

_trackball = new Trackball();
_trackball.Attach(this);
_trackball.Servants.Add(myViewport3D);
_trackball.Enabled = true;

XAMLは次のように変更しています。

    <Viewport3D Focusable="True" Name="myViewport3D" ClipToBounds="True"  >
      <!--カメラ-->
      <Viewport3D.Camera>
        <PerspectiveCamera 
                    Position="-5,2,3" NearPlaneDistance="1" FarPlaneDistance="20"
                    LookDirection="5,-2,-3" UpDirection="0,1,0" FieldOfView="45" />
      </Viewport3D.Camera>
     
      <Viewport3D.Children> 
          <ModelVisual3D> 
            <!--座標変換 トラックボール用-->
            <ModelVisual3D.Transform>
              <Transform3DGroup>
                <Transform3DGroup.Children>
                  <Transform3DCollection >
                    <ScaleTransform3D ScaleX="1" ScaleY="1"  ScaleZ="1" />
                    <RotateTransform3D>
                      <RotateTransform3D.Rotation>
                        <AxisAngleRotation3D Axis="0 1 0" Angle="0" />
                      </RotateTransform3D.Rotation>
                    </RotateTransform3D>
                    <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0" />
                  </Transform3DCollection>
                </Transform3DGroup.Children>
              </Transform3DGroup>
            </ModelVisual3D.Transform>

            <ModelVisual3D.Content>
                  <!--ジオメトリデータ-->
                  <GeometryModel3D Geometry="{StaticResource myTeapot}">
                    <!--マテリアル-->
                    <GeometryModel3D.Material>
                      <DiffuseMaterial>
                        <DiffuseMaterial.Brush>
                          <SolidColorBrush Color="White" />
                        </DiffuseMaterial.Brush>
                      </DiffuseMaterial>
                    </GeometryModel3D.Material>
                  </GeometryModel3D>
            </ModelVisual3D.Content>
          </ModelVisual3D>
        <!--平行光-->
         <ModelVisual3D>
          <ModelVisual3D.Content>
            <DirectionalLight Color="#FFFFFF" Direction="0,-5,-5" />
          </ModelVisual3D.Content>
         </ModelVisual3D>
        </Viewport3D.Children>
    </Viewport3D>

あとはTrackball.csをプロジェクトに追加し、ビルドすれば、左ボタンのドラッグでティーポットが回転し、右ボタンのドラッグで平行移動し、スクロールボタンで拡大縮小します。

ところで、このティーポット アプリケーションが非常に重いことに気がついた人もいると思います。これは、ウィンドウの背景の透明化(AllowsTransparency="True")を使うと、ソフトウェアレンダリングになってしまうためです。そのため、こんなティーポットでも非常に重くなってしまいます。AllowTranspaencyをFalseにすれば、もっとサクサク動きます。

それ以外にもソフトウェア レンダリングを強制する機能には、BtmapEffectがあります。これは影を落としたり、ぼかしをかけたり便利な機能なのですが、これを使うとソフトウェア レンダリングになってしまいます。SDKドキュメントのBitmapEffectには注意として次のように記載されています。

WPF bitmap effects are software rendered. Any object that applies an effect will also be rendered in software. Bitmap effects should not be applied to large visuals or animations as this can degrade performance.

ソフトウェア レンダリングかハードウェア レンダリングかを調べるには、Perforatorというツールが使えます。このツールを起動して、Draw software rendering with purple tintのチェックをオンにすると、ソフトウェアレンダリングの部分が紫色で表示されます。詳しくはSDKドキュメントを参照してください。

Window1.xaml