概要
cscの作法、調べてみた。
wpf3d、やってみた。
練習問題やってみた。
練習問題
timerで、箱を回転させよ。
写真
サンプルコード
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
using System.Windows.Media.Media3D;
class Main3d: Window {
ModelVisual3D cubeModel;
private System.Windows.Threading.DispatcherTimer timer = new System.Windows.Threading.DispatcherTimer();
private Matrix3D matrix = Matrix3D.Identity;
private MatrixTransform3D matrixTransform3D;
const double AngleDelta = 5.0;
static readonly Dictionary<string, Vector3D> Axes = new Dictionary<string, Vector3D> {
{ "-x", Vector3D.Parse("-1,0,0") },
{ "+x", Vector3D.Parse("1,0,0") },
{ "-y", Vector3D.Parse("0,-1,0") },
{ "+y", Vector3D.Parse("0,1,0") },
{ "-z", Vector3D.Parse("0,0,-1") },
{ "+z", Vector3D.Parse("0,0,1") },
};
public Main3d() {
var point0 = new Point3D(0, -0.2, -0.2);
var point1 = new Point3D(0.2, -0.2, -0.2);
var point2 = new Point3D(0.2, -0.2, 0.2);
var point3 = new Point3D(0, -0.2, 0.2);
var point4 = new Point3D(0, 0.2, -0.2);
var point5 = new Point3D(0.2, 0.2, -0.2);
var point6 = new Point3D(0.2, 0.2, 0.2);
var point7 = new Point3D(0, 0.2, 0.2);
var cubeGroup = new Model3DGroup();
var cubeMaterial = new DiffuseMaterial(new SolidColorBrush(Colors.Blue));
cubeGroup.Children.Add(new GeometryModel3D(CreateMesh(point7, point6, point2, point3), cubeMaterial));
cubeGroup.Children.Add(new GeometryModel3D(CreateMesh(point6, point5, point1, point2), cubeMaterial));
cubeGroup.Children.Add(new GeometryModel3D(CreateMesh(point5, point4, point0, point1), cubeMaterial));
cubeGroup.Children.Add(new GeometryModel3D(CreateMesh(point4, point7, point3, point0), cubeMaterial));
cubeGroup.Children.Add(new GeometryModel3D(CreateMesh(point1, point0, point3, point2), cubeMaterial));
cubeGroup.Children.Add(new GeometryModel3D(CreateMesh(point4, point5, point6, point7), cubeMaterial));
cubeModel = new ModelVisual3D();
cubeModel.Content = cubeGroup;
var trans = new Transform3DGroup();
trans.Children.Add(new RotateTransform3D());
trans.Children.Add(new TranslateTransform3D(-1, 1, -1));
cubeModel.Transform = trans;
var light = new DirectionalLight();
var cam = new PerspectiveCamera();
cam.Position = new Point3D(0, 0, 2);
var vp3d = new Viewport3D();
vp3d.Camera = cam;
vp3d.Children.Add(cubeModel);
vp3d.Children.Add(new ModelVisual3D() {
Content = light
});
Width = 400;
Height = 400;
Content = vp3d;
timer.Interval = TimeSpan.FromMilliseconds(100);
timer.Tick += TimerOnTick;
timer.Start();
}
private void TimerOnTick(Object sender, EventArgs args) {
matrix.Rotate(new Quaternion(Axes["-z"], AngleDelta));
matrix.Rotate(new Quaternion(Axes["-y"], AngleDelta));
matrixTransform3D = new MatrixTransform3D(matrix);
//Console.WriteLine("ok");
cubeModel.Transform = matrixTransform3D;
}
private static MeshGeometry3D CreateMesh(Point3D p0, Point3D p1, Point3D p2, Point3D p3) {
var mesh = new MeshGeometry3D();
mesh.Positions = new Point3DCollection(new Point3D[] {
p0,
p1,
p2,
p3
});
mesh.TriangleIndices = new Int32Collection(new int[] {
0,
2,
1,
0,
3,
2
});
mesh.TextureCoordinates = new PointCollection(new Point[] {
new Point(0, 0),
new Point(1, 0),
new Point(1, 1),
new Point(0, 1)
});
return mesh;
}
[STAThread]
static void Main() {
var wnd = new Main3d();
wnd.ShowDialog();
}
}
以上。
