羽铉

导航

 

最基本的3D代码对照

xaml代码

<Viewport3D>
            <Viewport3D.Camera>
                <PerspectiveCamera Position="0, 0, 4"/>
            </Viewport3D.Camera>

            <!-- Button on 3D -->
            <Viewport2DVisual3D>
                <!-- Give the plane a slight rotation -->
                <Viewport2DVisual3D.Transform>
                    <RotateTransform3D>
                        <RotateTransform3D.Rotation>
                            <AxisAngleRotation3D Angle="40" Axis="0, 1, 0" />
                        </RotateTransform3D.Rotation>
                    </RotateTransform3D>
                </Viewport2DVisual3D.Transform>

                <!-- The Geometry, Material, and Visual for the Viewport2DVisual3D -->
                <Viewport2DVisual3D.Geometry>
                    <MeshGeometry3D Positions="-1,1,0 -1,-1,0 1,-1,0 1,1,0"
                                    TextureCoordinates="0,0 0,1 1,1 1,0" TriangleIndices="0 1 2 0 2 3"/>
                </Viewport2DVisual3D.Geometry>

                <Viewport2DVisual3D.Material>
                    <DiffuseMaterial Viewport2DVisual3D.IsVisualHostMaterial="True" Brush="White"/>
                </Viewport2DVisual3D.Material>

                <Button>Hello, 3D</Button>
            </Viewport2DVisual3D>

            <!-- Lights -->
            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <DirectionalLight Color="#FFFFFFFF" Direction="0,0,-1"/>
                </ModelVisual3D.Content>
            </ModelVisual3D>
        </Viewport3D>

cs后台对照写法

private void Init_Draw()
        {
            Viewport3D viewport3D = new Viewport3D();
            PerspectiveCamera perspectiveCamera = new PerspectiveCamera()
            {
                Position = new Point3D(0, 0, 4),
            };
            viewport3D.Camera = perspectiveCamera;

            Viewport2DVisual3D viewport2DVisual3D = new Viewport2DVisual3D();
            RotateTransform3D rotateTransform3D = new RotateTransform3D();
            AxisAngleRotation3D axisAngleRotation3D = new AxisAngleRotation3D()
            {
                Angle = 40,
                Axis = new Vector3D(0, 1, 0),
            };
            rotateTransform3D.Rotation = axisAngleRotation3D;
            viewport2DVisual3D.Transform = rotateTransform3D;

            MeshGeometry3D meshGeometry3D = new MeshGeometry3D()
            {
                Positions = new Point3DCollection(new Point3D[] { new Point3D(-1, 1, 0), new Point3D(-1, -1, 0), new Point3D(1, -1, 0), new Point3D(1, 1, 0) }),
                TextureCoordinates = new PointCollection { new Point(0, 0), new Point(0, 1), new Point(1, 1), new Point(1, 0) },
                TriangleIndices = new Int32Collection(new int[] { 0, 1, 2, 0, 2, 3 }),
            };
            viewport2DVisual3D.Geometry = meshGeometry3D;

            DiffuseMaterial diffuseMaterial = new DiffuseMaterial();
            Viewport2DVisual3D.SetIsVisualHostMaterial(diffuseMaterial, true);
            viewport2DVisual3D.Material = diffuseMaterial;


            Button button = new Button()
            {
                Content = "Hello,3D",
          Direction = new Vector3D(0, 0, -1), }; viewport2DVisual3D.Visual
= button; ModelVisual3D modelVisual3D = new ModelVisual3D(); DirectionalLight directionalLight = new DirectionalLight() { Color = Color.FromRgb(255, 255, 255),
Direction = new Vector3D(0, 0, -1), }; modelVisual3D.Content
= directionalLight; viewport3D.Children.Add(viewport2DVisual3D); viewport3D.Children.Add(modelVisual3D); Grid组件.Children.Add(viewport3D); }

 引伸一下,按照1:1大小显示原始组件,写入原始宽度和高度。显示出来的是原始UserControl的大小

private void Init_Draw(FrameworkElement element,double width,double height)
        {
            double Mesh_Width = width / 2;
            double Mesh_Height = height / 2;

            Viewport3D viewport3D = new Viewport3D();
            viewport3D.Width = width * 2;

            PerspectiveCamera perspectiveCamera = new PerspectiveCamera();
            double fieldOfViewInRadians = perspectiveCamera.FieldOfView * (Math.PI / 180.0);
            var z = (0.5 * viewport3D.Width) / Math.Tan(0.5 * fieldOfViewInRadians);
            perspectiveCamera.Position = new Point3D(0, 0, z);

            perspectiveCamera.LookDirection = new Vector3D(0, 0, -1);
            viewport3D.Camera = perspectiveCamera;

            Viewport2DVisual3D viewport2DVisual3D = new Viewport2DVisual3D();
            RotateTransform3D rotateTransform3D = new RotateTransform3D();
            axisAngleRotation3D = new AxisAngleRotation3D()
            {
                Angle = 40,
                Axis = new Vector3D(0, 1, 0),
            };
            rotateTransform3D.Rotation = axisAngleRotation3D;
            viewport2DVisual3D.Transform = rotateTransform3D;

            MeshGeometry3D meshGeometry3D = new MeshGeometry3D()
            {
                Positions = new Point3DCollection(new Point3D[] { 
                        new Point3D(-Mesh_Width, Mesh_Height, 0),
                        new Point3D(-Mesh_Width, -Mesh_Height, 0),
                        new Point3D(Mesh_Width, -Mesh_Height, 0),
                        new Point3D(Mesh_Width, Mesh_Height, 0)
                    }
                ),
                TextureCoordinates = new PointCollection { new Point(0, 0), new Point(0, 1), new Point(1, 1), new Point(1, 0) },
                TriangleIndices = new Int32Collection(new int[] { 0, 1, 2, 0, 2, 3 }),
            };
            viewport2DVisual3D.Geometry = meshGeometry3D;

            DiffuseMaterial diffuseMaterial = new DiffuseMaterial();
            Viewport2DVisual3D.SetIsVisualHostMaterial(diffuseMaterial, true);
            viewport2DVisual3D.Material = diffuseMaterial;

            viewport2DVisual3D.Visual = element;
            element.MouseDown += Element_MouseDown;

            ModelVisual3D modelVisual3D = new ModelVisual3D();
            DirectionalLight directionalLight = new DirectionalLight()
            {
                Color = Color.FromRgb(255, 255, 255),
                Direction = new Vector3D(0, 0, -1),
            };
            modelVisual3D.Content = directionalLight;

            viewport3D.Children.Add(viewport2DVisual3D);
            viewport3D.Children.Add(modelVisual3D);

            MainGrid.Children.Add(viewport3D);
        }

 

posted on 2019-10-13 08:36  羽铉  阅读(921)  评论(0编辑  收藏  举报