2009-08-13 16 views
2

in flash10 I canイメージは、その中心を中心に3D空間で簡単に回転できます。WPFで3D変換を実行するにはどうすればよいですか?

私が持っているflash10の例では、私はWPFにポートこの例をしたいhttp://jsc.sourceforge.net/examples/web/MatrixStuffExample/Application.htm alt text http://jsc.sourceforge.net/examples/web/MatrixStuffExample/assets/MatrixStuffExample/Preview.png

です。

XAMLを使用せずにC#内で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

+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

+0

私はこれを実行することはできません。誰もプロジェックを持っていますか?サンプルをダウンロードできますか? – amok

関連する問題