public static void Pan(this PerspectiveCamera camera, PanDirection direction) { var vecLeft = Vector3D.CrossProduct(camera.LookDirection, camera.UpDirection); TranslateTransform3D xTrans; switch (direction) { case PanDirection.Left: xTrans = new TranslateTransform3D(vecLeft * panFactor); camera.Position = xTrans.Transform(camera.Position); break; case PanDirection.Right: xTrans = new TranslateTransform3D(-vecLeft * panFactor); camera.Position = xTrans.Transform(camera.Position); break; case PanDirection.Up: xTrans = new TranslateTransform3D(-camera.UpDirection * panFactor); camera.Position = xTrans.Transform(camera.Position); break; case PanDirection.Down: xTrans = new TranslateTransform3D(camera.UpDirection * panFactor); camera.Position = xTrans.Transform(camera.Position); break; case PanDirection.None: break; default: throw new ArgumentOutOfRangeException(nameof(direction), direction, null); } }
public static Point3D GetTarget(this PerspectiveCamera camera) { TranslateTransform3D xTrans = new TranslateTransform3D(camera.LookDirection * 5); return(xTrans.Transform(camera.Position)); //return new Point3D(0, 0, 0); }
public void TransformPointLight(Vector3D pointLightVector, Vector3D changeVector) { // Transform light vector. TranslateTransform3D pointLightTransform = new TranslateTransform3D(); pointLightTransform.OffsetX = pointLightVector.X; pointLightTransform.OffsetY = pointLightVector.Y; pointLightTransform.OffsetZ = pointLightVector.Z; _ptLight.Position = pointLightTransform.Transform(_ptLight.Position); }
// Define the model. private void DefineModel(Model3DGroup group) { // Define a polygon in the XZ plane. Point3D center = new Point3D(0, 0, 4.5); Point3D[] polygon = G3.MakePolygonPoints(6, center, new Vector3D(1, 0, 0), new Vector3D(0, 0, -1)); // Make a transform to move the polygon in the -Z direction. TranslateTransform3D translate = new TranslateTransform3D(0, 0, -3); // Make a right pyramid. MeshGeometry3D mesh1 = new MeshGeometry3D(); mesh1.AddPyramid(center, polygon, new Vector3D(0, 3, 0)); group.Children.Add(mesh1.MakeModel(Brushes.Pink)); // Make a skewed pyramid. translate.Transform(polygon); center = translate.Transform(center); MeshGeometry3D mesh2 = new MeshGeometry3D(); mesh2.AddPyramid(center, polygon, new Vector3D(0, 3, 2)); group.Children.Add(mesh2.MakeModel(Brushes.LightBlue)); // Make a frustum with cutting plane parallel to the base. translate.Transform(polygon); center = translate.Transform(center); MeshGeometry3D mesh3 = new MeshGeometry3D(); mesh3.AddFrustum(center, polygon, new Vector3D(0, 4, 0), 2); group.Children.Add(mesh3.MakeModel(Brushes.LightGreen)); // Make a frustum with cutting plane not parallel to the base. translate.Transform(polygon); center = translate.Transform(center); MeshGeometry3D mesh4 = new MeshGeometry3D(); Point3D planePt = center + new Vector3D(0, 2, 0); Vector3D planeN = new Vector3D(1, 1, 1); mesh4.AddFrustum(center, polygon, new Vector3D(0, 4, 0), planePt, planeN); group.Children.Add(mesh4.MakeModel(Brushes.Orange)); // Show the axes. MeshExtensions.AddAxes(group); }
// Define the model. private void DefineModel(Model3DGroup group) { // Make the initial surface. int numX = 40; int numZ = 40; Point3D[,] surface = G3.InitSurface(0, numX, -3, 3, numZ, -3, 3); // Add some craters. AddCrater(surface, -1, 0, 1.5, 0.3); AddCrater(surface, 1.6, -1.5, 0.5, 0.4); AddCrater(surface, 1.5, 1.5, 0.75, 0.3); AddCrater(surface, 0.5, -0.6, 1.25, 0.1); // Add some relatively large-scale randomness to random points. Random rand = new Random(0); for (int i = 0; i < 10; i++) { int ix = rand.Next(0, numX); int iz = rand.Next(0, numZ); surface[ix, iz].Y += rand.NextDouble(-0.1, 0.1); } // Fractalize. surface = G3.FractalizeSurface(surface, 2, 1, -0.05, 0.05); // Translate to center better. TranslateTransform3D trans = new TranslateTransform3D(0, 1, 0); numX = surface.GetUpperBound(0) + 1; numZ = surface.GetUpperBound(1) + 1; for (int ix = 0; ix < numX; ix++) { for (int iz = 0; iz < numZ; iz++) { surface[ix, iz] = trans.Transform(surface[ix, iz]); } } // Make the mesh. MeshGeometry3D mesh1 = new MeshGeometry3D(); mesh1.AddSurface(surface); // Apply a height map. double minY = surface[0, 0].Y; double maxY = minY; foreach (Point3D point in surface) { if (minY > point.Y) { minY = point.Y; } if (maxY < point.Y) { maxY = point.Y; } } mesh1.ApplyHeightMap(0, 1, minY, maxY); GradientStopCollection stops = new GradientStopCollection(); stops.Add(new GradientStop(Colors.Gray, 0)); stops.Add(new GradientStop(Colors.LightGray, 0.25)); stops.Add(new GradientStop(Colors.LightGray, 0.75)); stops.Add(new GradientStop(Colors.White, 1)); LinearGradientBrush brush = new LinearGradientBrush(stops, new Point(0, 0), new Point(1, 1)); group.Children.Add(mesh1.MakeModel(brush)); }
public Node translate_by(TranslateTransform3D translator) { point = translator.Transform(point); return(this); }
private void Viewport_OnMouseWheel(object sender, MouseWheelEventArgs e) { var xTrans = new TranslateTransform3D(_camera.LookDirection * e.Delta / 360D); _camera.Position = xTrans.Transform(_camera.Position); }
// Define the model. private void DefineModel(Model3DGroup group) { // Define a polygon in the XZ plane. Point3D center = new Point3D(0, -1.5, 2); Point3D[] polygon = G3.MakePolygonPoints(20, center, new Vector3D(0.5, 0, 0), new Vector3D(0, 0, -0.5)); // Transform to move the polygon. TranslateTransform3D xTranslate = new TranslateTransform3D(-2, 0, 0); // Make a transform to move the polygon in the -Z direction. TranslateTransform3D xzTranslate = new TranslateTransform3D(2, 0, -2); // Make a smooth skewed cylinder. MeshGeometry3D mesh1 = new MeshGeometry3D(); mesh1.AddCylinder(polygon, new Vector3D(0, 2, -1), true); group.Children.Add(mesh1.MakeModel(Brushes.Pink)); // Make a skewed cylinder. MeshGeometry3D mesh2 = new MeshGeometry3D(); xTranslate.Transform(polygon); mesh2.AddCylinder(polygon, new Vector3D(0, 3, -1)); group.Children.Add(mesh2.MakeModel(Brushes.Pink)); // Make a smooth right cylinder. MeshGeometry3D mesh3 = new MeshGeometry3D(); xzTranslate.Transform(polygon); mesh3.AddCylinder(polygon, new Vector3D(0, 2, 0), true); group.Children.Add(mesh3.MakeModel(Brushes.LightGreen)); // Make a right cylinder. MeshGeometry3D mesh4 = new MeshGeometry3D(); xTranslate.Transform(polygon); mesh4.AddCylinder(polygon, new Vector3D(0, 3, 0)); group.Children.Add(mesh4.MakeModel(Brushes.LightGreen)); // Make a cylinder defined by cutting planes. MeshGeometry3D mesh5 = new MeshGeometry3D(); xzTranslate.Transform(polygon); mesh5.AddCylinder(polygon, new Vector3D(0, 3, 0), center + new Vector3D(0, 1, 0), new Vector3D(0, 2, 1), center + new Vector3D(0, -0.5, 0), new Vector3D(1, -1, 0), true); group.Children.Add(mesh5.MakeModel(Brushes.LightBlue)); // Make a smooth cylinder defined by cutting planes. MeshGeometry3D mesh6 = new MeshGeometry3D(); xTranslate.Transform(polygon); mesh6.AddCylinder(polygon, new Vector3D(0, 3, 0), center + new Vector3D(0, 2, 0), new Vector3D(0, 2, 1), center + new Vector3D(0, -0.5, 0), new Vector3D(1, -1, 0)); group.Children.Add(mesh6.MakeModel(Brushes.LightBlue)); // Show the axes. MeshExtensions.AddAxes(group); }