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