WPF动态加载3D 放大-旋转-平移

简介: 原文:WPF动态加载3D 放大-旋转-平移 WavefrontObjLoader.cs   第二步:ModelVisual3DWithName.cs public class ModelVisual3DWithName:ModelVisual3D     {         p...
原文: WPF动态加载3D 放大-旋转-平移

WavefrontObjLoader.cs

 

第二步:ModelVisual3DWithName.cs

public class ModelVisual3DWithName:ModelVisual3D
    {
        public string Name { get; set; }

        public object Tag { get; set; }

    }

第三步:MainWindow.xmal

<Grid x:Name="lay">
     <Viewport3D x:Name="vp" Margin="0">
      <Viewport3D.Camera>
       <PerspectiveCamera FieldOfView="45" FarPlaneDistance="100" LookDirection="0,0,-3.4142135623731" NearPlaneDistance="0.1" Position="0,0,3.4142135623731" UpDirection="0,3,0"/>
      </Viewport3D.Camera>
        </Viewport3D>
        <Slider Height="23" HorizontalAlignment="Left" Margin="220,288,0,0" Name="slider1" VerticalAlignment="Top" Width="100" Maximum="2000" />
        <Slider Height="23" HorizontalAlignment="Left" Margin="49,288,0,0" Name="slider2" VerticalAlignment="Top" Width="100" Maximum="1000" />
        <Slider Height="23" HorizontalAlignment="Left" Margin="367,288,0,0" Name="slider3" VerticalAlignment="Top" Width="100" Minimum="200" Maximum="2000" />
        <Slider Height="23" HorizontalAlignment="Left" Margin="567,288,0,0" Name="slider4" VerticalAlignment="Top" Width="100" Minimum="200" Maximum="2000" />
    </Grid>

第四步:MainWindow.xmal

PerspectiveCamera myPCamera;
        DirectionalLight myDirectionalLight;
        Model3DGroup myModel3DGroup;
        WavefrontObjLoader wfl;
        ModelVisual3DWithName mv3dw;
        public MainWindow()
        {
            InitializeComponent();
            wfl = new WavefrontObjLoader();            slider1.ValueChanged += new RoutedPropertyChangedEventHandler<double>(slider1_ValueChanged);
            slider2.ValueChanged += new RoutedPropertyChangedEventHandler<double>(slider2_ValueChanged);
            slider3.ValueChanged += new RoutedPropertyChangedEventHandler<double>(slider3_ValueChanged);
            slider4.ValueChanged += new RoutedPropertyChangedEventHandler<double>(slider4_ValueChanged);            
            createCamera();
            createLight();
            createModel3D();
            create360();
            //createAnimation();
        }
        #region //光源
        private void createLight()
        {
            myDirectionalLight = new DirectionalLight();
            myDirectionalLight.Color = Colors.White;
            myDirectionalLight.Direction = new Vector3D(-0.61, -0.5, -0.61);
        }
        #endregion
        #region //摄像机
        private void createCamera()
        {
            myPCamera = new PerspectiveCamera();
            //myPCamera.Position = new Point3D(0,-1743,-4000);//看的方向
            myPCamera.Position = new Point3D(0, 0, 1000);
            myPCamera.LookDirection = new Vector3D(0,0,-1000);//摄影机看的方向
            myPCamera.UpDirection = new Vector3D(0, 1, -0);
            myPCamera.FieldOfView = 45;//法向量 摄影机上下颠倒,左转右转            myPCamera.NearPlaneDistance = 0.1;
            myPCamera.FarPlaneDistance = 11050;

            vp.Camera = myPCamera;
        }
        #endregion
        #region //模型
        private void createModel3D()
        {
            myModel3DGroup = new Model3DGroup();
            myModel3DGroup.Children.Add(myDirectionalLight);

            var m = wfl.LoadObjFile(@"C:/Users/Adminstrator/Desktop/3D动态加载/WpfApplication2/xx.obj");
            m.Content = myModel3DGroup;

            vp.Children.Add(m);
        }
        #endregion
        #region //360旋转动作
        RotateTransform3D rtf3D;
        AxisAngleRotation3D aar;
        private void create360()
        {
            rtf3D = new RotateTransform3D();           
            aar = new AxisAngleRotation3D();
            this.RegisterName("myAngleRotation", aar);
            aar.Angle = 0;
            aar.Axis = new Vector3D(0, 3, 0);
            rtf3D.Rotation = aar;
            myModel3DGroup.Transform = rtf3D;
            myPCamera.Transform = rtf3D;
        }
        Storyboard sbd;
        DoubleAnimation dan;
        private void createAnimation()
        {
            sbd = new Storyboard();
            dan = new DoubleAnimation(0,360,new Duration(TimeSpan.FromSeconds(10)));
            dan.RepeatBehavior = RepeatBehavior.Forever;
            Storyboard.SetTargetName(dan,"myAngleRotation");
            Storyboard.SetTargetProperty(dan, new PropertyPath(AxisAngleRotation3D.AngleProperty));
            sbd.Children.Add(dan);
            sbd.BeginTime = TimeSpan.FromSeconds(5);//开始时间
            sbd.Begin(this);
        }
        #endregion
        void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            myPCamera.Position = new Point3D(slider1.Value , slider2.Value, slider3.Value);
        }
        void slider2_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            myPCamera.Position = new Point3D(slider1.Value, slider2.Value, slider3.Value);
        }
        void slider3_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            myPCamera.Position = new Point3D(slider1.Value, slider2.Value, slider3.Value);
        }
        void slider4_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            aar.Angle = slider4.Value;
        }

 

目录
相关文章
|
C#
WPF 界面实现多语言支持 中英文切换 动态加载资源字典
原文:WPF 界面实现多语言支持 中英文切换 动态加载资源字典 1、使用资源字典,首先新建两个字典文件en-us.xaml、zh-cn.xaml。定义中英文的字符串在这里面【注意:添加xmlns:s="clr-namespace:System;assembly=mscorlib】 zh-cn.
3573 0
|
C# 前端开发
WPF中Style文件的引用——使用xaml代码或者C#代码动态加载
原文:WPF中Style文件的引用——使用xaml代码或者C#代码动态加载   WPF中控件拥有很多依赖属性(Dependency Property),我们可以通过编写自定义Style文件来控制控件的外观和行为,如同CSS代码一般。
5108 0
WPF控件和窗体一起放大一起缩小
WPF控件和窗体一起放大一起缩小
378 0
|
算法 C# 图形学
WPF绘制深度不同颜色的3D模型填充图和线框图
原文:WPF绘制深度不同颜色的3D模型填充图和线框图 在机械测量过程中,测量的数据需要进行软件处理。通常测量一个零件之后,需要重建零件的3D模型,便于观察测量结果是否与所测工件一致。
3635 2
|
C# 图形学 传感器
WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化
原文:WPF在3D Cad模型中利用TextureCoordinates实现颜色渐变显示偏差值的变化 注:最近在做3D机械模型重建方面的软件,需要根据光栅传感器采集的数据绘制3D图形,并显示出色差以及填充和线框图。
1194 2
|
前端开发 C#
WPF多点触摸放大缩小旋转
原文:WPF多点触摸放大缩小旋转 版权声明:本文为博主原创文章,需要转载尽管转载。 https://blog.csdn.net/z5976749/article/details/40118437 如果要方法缩小一个canvas,或图片: 只要在控件中添加    就可以拉伸改控件。
1705 0
|
C# 索引
好玩的WPF第四弹:用Viewport2DVisual3D实现3D旋转效果
原文:好玩的WPF第四弹:用Viewport2DVisual3D实现3D旋转效果 版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/46567895 效果呢就是这么个效果,但是大家要发挥想象力,比如做成一个可以旋转的按钮等等。
1081 0
|
C# Windows 图形学
优化WPF 3D性能
原文:优化WPF 3D性能 Maximize WPF 3D Performance .NET Framework 4.5   As you use the Windows Presentation Foundation (WPF) to build 3D contr...
1495 0
|
C# 小程序
WPF 3D变换应用
原文:WPF 3D变换应用  WPF可以提供的3D模型使我们可以轻松地创建3D实体,虽然目前来看还很有一些性能上的问题,不过对于一些简单的3D应用应该是可取的,毕竟其开发效率高,而且也容易上手。         下面给大家演示的是使用在WPF 3D上实现视角变换,通过鼠标拖动来变换观察视角,通过滚轮来放缩视距。
856 0
|
C#
WPF特效-实现3D足球效果
原文:WPF特效-实现3D足球效果 WPF 实现 3D足球效果,效果图如下:  每个面加载不同贴图。                                                          ...
1014 0