3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Perspectiveで簡単WPF3Dモデリング!2

Last updated at Posted at 2014-08-27

3Dモデリングの基本は三角形ということで、今回は三角形を描画しようと思います。
その前に注意点ですが、前回描画した軸を見ますと、左下方向にx軸、上方向に y軸、右下方向に z軸 が伸びているのが分かります。数学で習う軸の向きとはやや異なるため、注意が必要です。

まずは三角形ですが、以下のコードで描画を行います(MainWindow.xamlは前回と同じ)。

public partial class MainWindow : Window
{
	public MainWindow()
	{
		InitializeComponent();
		axis3DViewport.Children.Add(new XyzAxis3D() { Length = 4, Radius = 0.03 });
		var triangle = CreateTriangleModel(new Point3D(0, 1, 0), new Point3D(0, 0, 1), new Point3D(1, 0, 0), Brushes.Red);
		axis3DViewport.Children.Add(new ModelVisual3D() { Content = triangle });
	}

	// 右ねじの方向が表、裏には何も表示されない
	public static Model3DGroup CreateTriangleModel(Point3D p0, Point3D p1, Point3D p2, SolidColorBrush brush = null)
	{
		var pointsList = new List<Point3D>() { p0, p1, p2 };
		var triangleMesh = new MeshGeometry3D();
		// Set each edge positions of triangle
		triangleMesh.Positions = new Point3DCollection(pointsList);
		var normal = CalculateNormals(p0, p1, p2);
		triangleMesh.Normals = new Vector3DCollection(new List<Vector3D>() { normal, normal, normal });
		var material = new DiffuseMaterial(brush != null ? brush : Brushes.White);
		var model = new GeometryModel3D(triangleMesh, material);
		var model3Dgroup = new Model3DGroup();
		model3Dgroup.Children.Add(model);
		return model3Dgroup;
	}

	// 外積の計算
	public static Vector3D CalculateNormals(Point3D p0, Point3D p1, Point3D p2)
	{
		return Vector3D.CrossProduct(p1 - p0, p2 - p1);
	}
}

実行結果は以下のようになります。

キャプチャ.PNG

二つ目の注意点ですが、メッシュは表からしか見ることができません。試しにPerspectiveCameraの向きを変えてみましょう。
MainWindow.xamlのViewPort3DのプロパティであるViewPort3D.Cameraを以下のように変更します。

<Viewport3D.Camera>
	<PerspectiveCamera FieldOfView="60"
				   LookDirection="1,1,1"
				   Position="-3,-3,-3"
				   UpDirection="0,1,0" />
</Viewport3D.Camera>

実行結果は以下のようになります。

キャプチャ2.PNG

ちょっと分かりづらいですが、これまでCameraは(5,5,5)の地点から原点を見ていたのですが、それを(-3,-3,-3)の地点から原点を見るように変更しました。実行結果を見ますと、描画されているはずの三角形が消えたように見えます。
とても基本的なことなのですが、Cameraの視点や方向 と同様、描画したはずなのに見えない現象に陥りやすいので、細心の注意を払ってください。

上のコードですと、三角形はp1を中心として、p0からp2へ右ねじを回した時の親指方向にあるCameraから見えるようになっています。

右ねじ.png

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?