Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在WPF中进行3D转换?_C#_Wpf_Flash_3d - Fatal编程技术网

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

C# 如何在WPF中进行3D转换?,c#,wpf,flash,3d,C#,Wpf,Flash,3d,在flash10中,在3D空间中围绕图像中心轻松旋转图像 我举的flash10例子是[ (来源:) 我想把这个例子移植到WPF 有没有一个例子可以说明如何在没有XAML的情况下在C#中的WPF中进行这样的3D转换 在silverlight 3中,您将使用Matrix3dProject。您将如何在WPF中实现?我已经设置了一个基本的精简立方体,并将其旋转,以便您可以通过C#看到变换的工作原理 在xaml中设置视口 这是后面的代码,转换是最后一种方法…希望这有帮助…如果你想要更多信息,请告诉我

在flash10中,在3D空间中围绕图像中心轻松旋转图像

我举的flash10例子是[
(来源:)

我想把这个例子移植到WPF

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


在silverlight 3中,您将使用Matrix3dProject。您将如何在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<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;

    }


}
公共部分类窗口1:窗口
{
公共窗口1()
{
初始化组件();
Init();
}
私人定时器;
私有模型Visual3D_model=新模型Visual3D();
私人双_角=0;
公共void Init()
{
_模型=GetCube(GetSurfaceMaterial(Colors.Red)、新Point3D(10,10,1)、新Point3D(-10,-10,-1));
mainViewport.Children.Add(_model);
_定时器=新定时器(10);
_timer.appeased+=timerecursed;
_timer.Enabled=true;
}
无效时间重复(对象发送方,ElapsedEventArgs e)
{
Dispatcher.Invoke(DispatcherPriority.Normal,新操作(转换),0.5d);
}
公共材料组获取表面材料(颜色)
{
var materialGroup=新材料组();
var emmMat=新的发射材料(新的SolidColorBrush(颜色));
materialGroup.Children.Add(emmMat);
materialGroup.Children.Add(新扩散材料(新SolidColorBrush(颜色)));
var specMat=新的镜面材料(新的SolidColorBrush(Colors.White),30);
materialGroup.Children.Add(specMat);
返回物料组;
}
公共模型Visual3D GetCube(材质组材质组、Point3D近点、Point3D远点)
{
var cube=new Model3DGroup();
var p0=新点3D(远点X、远点Y、远点Z);
变量p1=新点3D(近点X、远点Y、远点Z);
变量p2=新点3D(近点X、远点Y、近点Z);
var p3=新点3D(远点X、远点Y、近点Z);
var p4=新点3D(远点X、近点Y、远点Z);
var p5=新的点3d(nearPoint.X、nearPoint.Y、farPoint.Z);
var p6=新点3D(nearPoint.X、nearPoint.Y、nearPoint.Z);
var p7=新点3D(远点X、近点Y、近点Z);
//正面三角形
添加(CreateTriangleModel(materialGroup,p3,p2,p6));
添加(CreateTriangleModel(materialGroup,p3,p6,p7));
//右侧三角形
Add(CreateTriangleModel(materialGroup,p2,p1,p5));
Add(CreateTriangleModel(materialGroup,p2,p5,p6));
//背面三角形
添加(CreateTriangleModel(materialGroup,p1,p0,p4));
Add(CreateTriangleModel(materialGroup,p1,p4,p5));
//左侧三角形
cube.Children.Add(CreateTriangleModel(materialGroup,p0,p3,p7));
添加(CreateTriangleModel(materialGroup,p0,p7,p4));
//顶边三角形
Add(CreateTriangleModel(materialGroup,p7,p6,p5));
Add(CreateTriangleModel(materialGroup,p7,p5,p4));
//底部三角形
添加(CreateTriangleModel(materialGroup,p2,p3,p0));
添加(CreateTriangleModel(materialGroup,p2,p0,p1));
var模型=新模型Visual3D();
model.Content=cube;
收益模型;
}
私有模型3DGroup CreateTriangleModel(材质、点3D p0、点3D p1、点3D p2)
{
var mesh=新的MeshGeometry3D();
网目、位置、添加(p0);
网格。位置。添加(p1);
网格。位置。添加(p2);
网格。三角形索引。添加(0);
网格。三角形索引。添加(1);
网格。三角形索引。添加(2);
var正常=计算异常(p0、p1、p2);
网格。法线。添加(法线);
网格。法线。添加(法线);
网格。法线。添加(法线);
var模型=新几何模型3D(网格、材质);
var group=新模型3DGROUP();
组。子组。添加(模型);
返回组;
}
私有向量3D计算异常(点3D p0、点3D p1、点3D p2)
{
var v0=新向量3D(p1.X-p0.X,p1.Y-p0.Y,p1.Z-p0.Z);
var v1=新向量3d(p2.X-p1.X,p2.Y-p1.Y,p2.Z-p1.Z);
返回向量3d.叉积(v0,v1);
}
无效转换(双重调整)
{
_角度+=可调;
var rotateTransform3D=new rotateTransform3D{CenterX=0,CenterZ=0};
var axisAngleRotation3D=新axisAngleRotation3D{Axis=新矢量3D(0,1,0),角度=_角度};
rotateTransform3D。旋转=轴角度旋转3D;
var myTransform3DGroup=新Transform3DGroup();
myTransform3DGroup.Children.Add(rotateTransform3D);
_model.Transform=myTransform3DGroup;
}
}

看起来Silverlight 3具有我想要的功能,但在WPF中不可用。文档:示例:Matrix3dProject不是WPF的一部分,这太糟糕了…MSFT语句:WPF确实不提供非仿射转换:(我无法运行此功能。有人有我可以下载示例的项目吗?