Floating Teapot 2

Published 27 October 06 02:36 PM | hiroyuk 

以前この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ドキュメントを参照してください。

Attachment(s): Window1.xaml

Comments

No Comments
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