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);
}
}
実行結果は以下のようになります。
二つ目の注意点ですが、メッシュは表からしか見ることができません。試しに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>
実行結果は以下のようになります。
ちょっと分かりづらいですが、これまでCameraは(5,5,5)の地点から原点を見ていたのですが、それを(-3,-3,-3)の地点から原点を見るように変更しました。実行結果を見ますと、描画されているはずの三角形が消えたように見えます。
とても基本的なことなのですが、Cameraの視点や方向 と同様、描画したはずなのに見えない現象に陥りやすいので、細心の注意を払ってください。
上のコードですと、三角形はp1を中心として、p0からp2へ右ねじを回した時の親指方向にあるCameraから見えるようになっています。