2009-08-13 81 views
2

In flash10 I can在3D空間中輕鬆旋轉圖像的中心。如何在WPF中進行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。

是否有一個示例如何在C#中不使用XAML的情況下在WPF中執行此類3D轉換?

在silverlight 3中,您將使用Matrix3DProjection。你將如何在WPF中實現?

回答

6

我已經設置了一個基本的薄立方體並旋轉它,這樣就可以看到如何通過C#進行轉換。

設置你的視口在XAML

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 

     <Viewport3D Name="mainViewport" ClipToBounds="True" HorizontalAlignment="Stretch" Height="300"> 
      <Viewport3D.Camera> 
       <PerspectiveCamera 
         LookDirection="0,0,-20" 
         UpDirection="0,1,0" 
         Position="0,0,50" 
         /> 
      </Viewport3D.Camera> 
      <ModelVisual3D> 
       <ModelVisual3D.Content> 
        <Model3DGroup x:Name="group3d"> 

         <SpotLight Position="10,10,10" x:Name="mySpotLight" Color="Yellow" InnerConeAngle="15" OuterConeAngle="100" Range="100" /> 
        </Model3DGroup> 
       </ModelVisual3D.Content> 

      </ModelVisual3D> 
     </Viewport3D> 

    </StackPanel> 
</Window> 

而且繼承人後面的代碼,改造的最後一個方法......希望這有助於...給我留言,如果你想了解更多信息!

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<double>(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; 

    } 


} 
+0

看起來像Silverlight 3具有我後,但它不是在WPF中可用的功能。 DOC: http://msdn.microsoft.com/en-us/library/system.windows.media.planeprojection%28VS.96%29.aspx 例如: http://www.gleblanc.eu /Blog/post/PlaneTransform.aspx – zproxy 2009-08-13 11:28:55

+0

Matrix3DProjection不是WPF的一部分... http://msdn.microsoft.com/en-us/library/system.windows.media.matrix3dprojection%28VS.95 %29.aspx MSFT聲明:WPF確實不提供非仿射變換 http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/b2d3ba94-82f6-4356-ab78- 9c70cc8b26fd :( – zproxy 2009-08-13 11:41:31

+0

我不能得到這個運行。有沒有人有項目我可以下載樣本嗎? – amok 2013-09-10 23:08:15