WPFで3D
■ その2 3Dモデルをコードから追加する 1 【2】
・動的なモデルの追加
整理後のXAML記述を見ればお分かりになるとおり、ContainerUIElement3D要素にModelUIElement3Dを動的に追加します。
ModelUIElement3D element = new ModelUIElement3D(); Model3DGroup models = this.TryFindResource("starModel") as Model3DGroup; if (models != null) { element.Model = models; this.modelsCountainer.Children.Add(element); } |
ModelUIElement3D.Modelプロパティに、リソースから取得したModel3DGroupをセットします。これで指定した3Dモデルをコードから追加できました。ただし、このままでは画面の真ん中に重なって表示されてしまいます。
・モデルの移動
追加するモデルの位置を移動する処理を追加します。
ModelUIElement3D element = new ModelUIElement3D(); Model3DGroup models = this.TryFindResource("starModel") as Model3DGroup; if (models != null) { element.Model = models; element.Transform = new TranslateTransform3D(new Vector3D(0.4, 0.4, 0.8)); this.modelsCountainer.Children.Add(element); } |
ModelUIElement3D.Transformプロパティに、TranslateTransform3Dをセットします。これで、Vector3Dクラスで指定した座標へモデルが移動します。あとは移動位置をランダムにし、一連の追加処理をループします。
ModelUIElement3D.TransformプロパティにはTranslateTransform3D(移動)の他に、RotateTransform3D(回転)、ScaleTransform3D(拡大/縮小)があります。
・カメラの回転アニメーション
その1ではモデルを回転させるアニメーションを作成しましたが、今回はカメラ位置をアニメーションで動かします。
アニメーション対象となるAxisAngleRotation3Dを記述し、x:Nameディレクティブを追加します。また、Axisプロパティに"0,1,0"をセットし、回転軸をY軸に設定しています。
<PerspectiveCamera Position="0,0,2" LookDirection="0,0,-1" FieldOfView="90"> <PerspectiveCamera.Transform> <Transform3DGroup> <RotateTransform3D> <RotateTransform3D.Rotation> <AxisAngleRotation3D x:Name="cameraAngleRotationY" Axis="0,1,0"/> </RotateTransform3D.Rotation> </RotateTransform3D> </Transform3DGroup> </PerspectiveCamera.Transform> </PerspectiveCamera> |
あとは、AxisAngleRotation3D.AnglePropertyを対象に、0から360まで値を変化するDoubleAnimationを実行すれば完成です。
その2は以上となります。
今回は単一種類のモデルを扱っていますが、モデルを定義したリソースディクショナリを複数作成しておけば、様々なモデルを組み合わせて表現することができます。
また、カメラのアニメーションもY軸回転させているだけのものですが、ズームや、マウス操作と連動させたりすると、より3D空間を感じるおもしろい表現が可能です。