0

私は 3d グラフィックスと wpf が初めてで、現在のプロジェクトでこれら 2 つを組み合わせる必要があります。ポイントと法線をMeshGeometry3Dに追加MeshGeometry3Dし、 に追加しGeometryModel3Dます。次に に追加GeometryModel3DModelVisual3D、最後に に追加ModelVisual3DViewPort3Dます。回転する必要がある場合は、GeometryModel3D または ModelVisual3D で必要な変換を実行し、最後に ViewPort3D に再度追加します。問題が発生しています:

objViewPort3D.Remove(objModelVisual3D);
objGeometryModel3D.Transform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), angle += 15));
objModelVisual3D.Content = objGeometryModel3D;
objViewPort3D.Children.Add(objModelVisual3D);

毎回 15 度ずつ回転させるには、なぜだけでなく、何angle += 15をしなければならないの15ですか? 格納されたモデルはTransform操作では変形せず、 で表示するときだけ変形がかかるようViewPort3Dです。保存された MeshGeometry3D オブジェクトの座標を変換で実際に変更して、次に変換を行うときに、元のモデルではなく、以前に変換されたモデルで行うようにしたいのです。この動作を取得するにはどうすればよいですか?

4

3 に答える 3

1

アニメーションを使用できると思います

いくつかの擬似コード:

angle = 0 function onClick: new_angle = angle + 30 Animate(angle, new_angle) angle = new_angle

于 2012-11-06T07:36:52.103 に答える
0

毎回新しいRotateTransform3Dを適用するため、角度+=15を実行する必要があります。

これは役立つかもしれません:

public RotateTransform3D MyRotationTransform { get; set; }
...
//constructor
public MyClass()
{
     MyRotationTransform = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), 0));

}

//in your method
MyRotationTransform.Rotation += 15;
objGeometryModel3D.Transform = MyRotationTransform;
于 2013-03-04T14:59:39.390 に答える
0

正しい、メッシュの位置は「変形」操作によって変形されません。代わりに、Transform プロパティは、レンダリング中のメッシュのワールド トランスフォームを定義します。

3D グラフィックスでは、ワールド トランスフォームは、オブジェクトのレンダリング中にメッシュのポイントをオブジェクト空間からワールド空間に変換します。

オブジェクト空間からワールド空間へのダイアグラム

( World、View、および Projection Matrix Unveiled の画像)

必要に応じてメッシュの各頂点を変換するよりも、ワールド トランスフォームを設定してレンダラーに 1 回のトランスフォームでメッシュを描画させる方がはるかに高速です。

于 2012-11-06T08:19:05.197 に答える