モデルジオメトリとは
3Dモデルを使用するために、 OpenGLとDirectXという特別な処理パイプラインを使用します。 コンベヤーが画像を作成するとき、それらは情報を使用します:
- モデルについて-その材料、ジオメトリ、およびテクスチャ、
- シーンについて-照明とカメラの設定。
モデルはすべてジオメトリから始まります。 モデルのジオメトリは、3次元空間内のポイントのセットと、これらのポイントからの三角形のセットです。 三角形は同一平面上にあります-通常、平面上にない多数の点を持つ図形とは対照的に、平面上にあります。
境界線を囲むように三角形を設定すると、向きのある三角形になります。 3次元空間内の方向付けられた三角形は、内側と外側を区別できます。 境界を迂回する方向では、各三角形の唯一の法線方向ベクトルも決定します。 そのため、ポイントと三角形に加えて、モデルジオメトリには各三角形の法線のセットが含まれます。 モデルを表示するとき、モデルポイントはポイントに対応し、モデルの三角形は面に対応します。
この例では、モデルのジオメトリに注目し、残りは必要に応じて使用します。 モデルの例として、以下のドルフィンが非常に適しています。

WPFテクノロジのおかげで、インタラクティブなアプリケーションインターフェイスを作成し、3Dグラフィックスを操作できます。 この例では、 WPFアーキテクチャの標準機能を使用します。データをバインドし、それに基づいてデータモデルとデータ表現( MVVM )を分離します。
WPFライブラリで3Dコンテンツを表示するための主要な要素はViewport3Dです。 たとえば、 Cameraプロパティはカメラを設定し、シーンが表示されます。 Viewport3Dの2番目の必須プロパティは、 Visual3D抽象型の要素のコレクションであるChildrenです。 このクラスの具体的な実装はModelVisual3Dクラスです。これを使用するには、抽象型Model3Dの Contentプロパティを指定する必要があります。
Contentプロパティを設定するための主要なクラス:
- GeometryModel3D -1つのモデルを表示し、
- ライト -光源モデル、
- Model3DGroup-さまざまなマテリアルでモデルを作成するのに役立ちます。
バインドによって必要なプロパティを設定します。
MVVMデータモデル
広い意味では、どのアプリケーションも特定の問題を解決します。 モデルは、アプリケーションによって解決された問題のデータを完全に反映する必要があります。 例を簡略化し、法線を除外します-それらはデフォルトで決定されます。 法線は、照明を計算するときにテクスチャまたは塗りつぶしを表示するために重要です。
MVVMデータモデルのエンティティとそれらの関係を定義するメインインターフェイスを選択します。
interface IModel3DSet { string Description { get; set; } ICollection<IModel3D> Models { get; } } interface IModel3D { string Description { get; set; } ICollection<IPoint3D> Points { get; } ICollection<ITriangle3D> Triangles { get; } } interface IPoint3D { double X { get; set; } double Y { get; set; } double Z { get; set; } string Coordinates { get; } IVector3D DistanceTo(IPoint3D endPoint); } interface ITriangle3D { IModel3D Model3D { get; } IPoint3D Point1 { get; set; } IPoint3D Point2 { get; set; } IPoint3D Point3 { get; set; } } interface IVector3D { double X { get; set; } double Y { get; set; } double Z { get; set; } double Norm { get; } IVector3D Add(IVector3D vector); IVector3D Subtract(IVector3D vector); IVector3D Multiply(double factor); IVector3D CrossProduct(IVector3D vector); double DotProduct(IVector3D vector); }
特定の実装は簡単です。 プロパティの変更について警告するために、使い慣れたINotifyPropertyChangedを使用します。
ViewModel
ViewModelの基本クラスとして、次を使用します。
public abstract class BaseVm<TModel> : Notifier { TModel _model; public TModel Model { get { return _model; } set { _model = value; NotifyWithCallerPropName(); } } } public abstract class BaseVm<TModel, TParentVM> : BaseVm<TModel> { public BaseVm(TModel model = default(TModel), TParentVM parentVM = default(TParentVM)) { Model = model; Parent = parentVM; } public TParentVM Parent { get; } }
この構造は、バインディングでViewModel階層を移動できるため便利です。 Vector3D 、 Triangle3D 、 Point3Dクラスは単純なので、それらのViewModelを作成する必要はありません。 したがって、2つのViewModelクラス-Model3DSetVmおよびModel3DVmのみが必要です 。
視聴回数
ビューを作成するには、リソースディクショナリでDataTemplateを宣言するときに、 DataType = "{x:Type local:Type}"属性を使用したWPF置換を使用します 。 それ以外の場合、実装は標準です。 デモアプリケーションは次のようになります。

他に何を知る必要がありますか
- WPFでは、 TriangleIndicesプロパティはオプションです。 指定されていない場合、デフォルトでは、ポイントのトリプルごとに三角形が作成されます。 このため、三角形が空であっても、面が表示されます。
- モデルのコレクションのバインディングを作成するには、この例のバインディングを使用できますが、 GeometryModel3Dの代わりにModel3DGroupのインスタンスを置き換えます。 これには、 Children Viewport3Dプロパティへのバインディングを使用できません。
- ジオメトリまたは回転軸を変更すると、モデルが再構築され、画像が痙攣します-アニメーションが再び開始されます。 プロセスが中断しないようにするには、モデルの中間値を保存し、それらにアニメーションを適用します。
例のあるプロジェクトはここにあります...
記事が何らかの形であなたを助けてくれたら嬉しいです...