如何在WPF中进行3D转换?

在flash10中, 我可以轻松地在3D空间中围绕其中心旋转图像。

我的flash10示例位于http://jsc.sourceforge.net/examples/web/MatrixStuffExample/Application.htm alt text http://jsc.sourceforge.net/examples/web/MatrixStuffExample/assets/MatrixStuffExample/Preview。 PNG

我想将此示例移植到WPF。

有没有一个例子如何在没有XAML的情况下在C#中的WPF中进行这样的3D转换?

在silverlight 3中,您将使用Matrix3DProjection。 你将如何在WPF中实现?

我已经设置了一个基本的薄立方体并将其旋转,以便您可以通过C#看到变换的工作原理。

在xaml中设置您的视口

                

并且接下来的代码,转换是最后一种方法…希望这有帮助……如果你想了解更多信息,请给我一个大喊!

 public partial class Window1 : Window { public Window1() { InitializeComponent(); Init(); } private Timer _timer; private ModelVisual3D _model = new ModelVisual3D(); private double _angle = 0; public void Init() { _model = GetCube(GetSurfaceMaterial(Colors.Red), new Point3D(10, 10, 1), new Point3D(-10,-10,-1)); mainViewport.Children.Add(_model); _timer = new Timer(10); _timer.Elapsed += TimerElapsed; _timer.Enabled = true; } void TimerElapsed(object sender, ElapsedEventArgs e) { Dispatcher.Invoke(DispatcherPriority.Normal, new Action(Transform), 0.5d); } public MaterialGroup GetSurfaceMaterial(Color colour) { var materialGroup = new MaterialGroup(); var emmMat = new EmissiveMaterial(new SolidColorBrush(colour)); materialGroup.Children.Add(emmMat); materialGroup.Children.Add(new DiffuseMaterial(new SolidColorBrush(colour))); var specMat = new SpecularMaterial(new SolidColorBrush(Colors.White), 30); materialGroup.Children.Add(specMat); return materialGroup; } public ModelVisual3D GetCube(MaterialGroup materialGroup, Point3D nearPoint, Point3D farPoint) { var cube = new Model3DGroup(); var p0 = new Point3D(farPoint.X, farPoint.Y, farPoint.Z); var p1 = new Point3D(nearPoint.X, farPoint.Y, farPoint.Z); var p2 = new Point3D(nearPoint.X, farPoint.Y, nearPoint.Z); var p3 = new Point3D(farPoint.X, farPoint.Y, nearPoint.Z); var p4 = new Point3D(farPoint.X, nearPoint.Y, farPoint.Z); var p5 = new Point3D(nearPoint.X, nearPoint.Y, farPoint.Z); var p6 = new Point3D(nearPoint.X, nearPoint.Y, nearPoint.Z); var p7 = new Point3D(farPoint.X, nearPoint.Y, nearPoint.Z); //front side triangles cube.Children.Add(CreateTriangleModel(materialGroup, p3, p2, p6)); cube.Children.Add(CreateTriangleModel(materialGroup, p3, p6, p7)); //right side triangles cube.Children.Add(CreateTriangleModel(materialGroup, p2, p1, p5)); cube.Children.Add(CreateTriangleModel(materialGroup, p2, p5, p6)); //back side triangles cube.Children.Add(CreateTriangleModel(materialGroup, p1, p0, p4)); cube.Children.Add(CreateTriangleModel(materialGroup, p1, p4, p5)); //left side triangles cube.Children.Add(CreateTriangleModel(materialGroup, p0, p3, p7)); cube.Children.Add(CreateTriangleModel(materialGroup, p0, p7, p4)); //top side triangles cube.Children.Add(CreateTriangleModel(materialGroup, p7, p6, p5)); cube.Children.Add(CreateTriangleModel(materialGroup, p7, p5, p4)); //bottom side triangles cube.Children.Add(CreateTriangleModel(materialGroup, p2, p3, p0)); cube.Children.Add(CreateTriangleModel(materialGroup, p2, p0, p1)); var model = new ModelVisual3D(); model.Content = cube; return model; } private Model3DGroup CreateTriangleModel(Material material, Point3D p0, Point3D p1, Point3D p2) { var mesh = new MeshGeometry3D(); mesh.Positions.Add(p0); mesh.Positions.Add(p1); mesh.Positions.Add(p2); mesh.TriangleIndices.Add(0); mesh.TriangleIndices.Add(1); mesh.TriangleIndices.Add(2); var normal = CalculateNormal(p0, p1, p2); mesh.Normals.Add(normal); mesh.Normals.Add(normal); mesh.Normals.Add(normal); var model = new GeometryModel3D(mesh, material); var group = new Model3DGroup(); group.Children.Add(model); return group; } private Vector3D CalculateNormal(Point3D p0, Point3D p1, Point3D p2) { var v0 = new Vector3D(p1.X - p0.X, p1.Y - p0.Y, p1.Z - p0.Z); var v1 = new Vector3D(p2.X - p1.X, p2.Y - p1.Y, p2.Z - p1.Z); return Vector3D.CrossProduct(v0, v1); } void Transform(double adjustBy) { _angle += adjustBy; var rotateTransform3D = new RotateTransform3D {CenterX = 0, CenterZ = 0}; var axisAngleRotation3D = new AxisAngleRotation3D {Axis = new Vector3D(0, 1, 0), Angle = _angle}; rotateTransform3D.Rotation = axisAngleRotation3D; var myTransform3DGroup = new Transform3DGroup(); myTransform3DGroup.Children.Add(rotateTransform3D); _model.Transform = myTransform3DGroup; } }