0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

cscの作法 その602

Posted at

概要

cscの作法、調べてみた。
wpf3d、やってみた。
練習問題やってみた。

練習問題

timerで、箱を回転させよ。

写真

image.png

サンプルコード


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();
	}
}





以上。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?