WPFで3D

■ その2 3Dモデルをコードから追加する        【

・動的なモデルの追加
整理後のXAML記述を見ればお分かりになるとおり、ContainerUIElement3D要素にModelUIElement3Dを動的に追加します。

-- MainWindow.xaml.cs --
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軸に設定しています。

-- MainWindow.xaml --
<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空間を感じるおもしろい表現が可能です。

戻る <<  2 

最新号はこちらから