标题:WPF 纹理的映射及基本旋转
只看楼主
qq2889577966
Rank: 4
等 级:业余侠客
威 望:5
帖 子:57
专家分:267
注 册:2021-4-14
结帖率:100%
 问题点数:0 回复次数:0 
WPF 纹理的映射及基本旋转
学习wpf时候总结地,也发在了其他一些网站,这里也发上和大家交流。
习惯写后台代码,前台就放了几个按钮。前台代码有时候我看不明白,写后台一步一步的写,便于理解。
映射时方向确定比较麻烦,需要3D每个面映射都为正确的方向,在baidu上找了很多,映射基本是乱的。
通过归纳测试,有了准确的参数,需要的可参考使用,不必再费劲计算。
里面注销掉的部分,可以恢复并注销调自动转动部分,为手动点击对象转动。
通过VisualBrush写入的 image可以换为UserControl等组件,可以搞成界面的旋转。
自己添加图像0.jpg....5.jpg,建立个Images文件夹,放进去图像,把文件夹拖到项目里。
这个搞清楚了wpf的旋转就不麻烦了,代码不长,就100多行,够简易了吧。
前台代码:MainWindow.xaml
程序代码:
<Window x:Class="Test3.MainWindow"
        xmlns="http://schemas."
        xmlns:x="http://schemas."
        xmlns:d="http://schemas."
        xmlns:mc="http://schemas."
        mc:Ignorable="d"
        Title="MainWindow" Height="768" Width="1024">
    <Grid x:Name="main">
        <Button Content="纵向" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
        <Button Content="横向" HorizontalAlignment="Left" Margin="10,48,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
        <Button Content="纵横" HorizontalAlignment="Left" Margin="10,85.74,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_2"/>
        <Button Content="横纵" HorizontalAlignment="Left" Margin="10,124.5,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_3"/>

 
    </Grid>
</Window>


后台代码:MainWindow.xaml.cs
程序代码:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;

 
namespace Test3
{
    public partial class MainWindow : Window
    {
        private AxisAngleRotation3D axisAngleRotation3D;

 
        public MainWindow()
        {
            InitializeComponent();
            main.MouseDown += Main_MouseDown;

 
            init_draw();
        }

 
        public void init_draw()
        {
            Point3DCollection[] positions = new Point3DCollection[6]
            {
                new Point3DCollection(new Point3D[] {
                    new Point3D(0.5, 0.5, -0.5), new Point3D(- 0.5, 0.5, -0.5), new Point3D(- 0.5, 0.5, 0.5),
                    new Point3D(- 0.5, 0.5, 0.5),new Point3D(0.5, 0.5, 0.5), new Point3D(0.5, 0.5, -0.5)
                }),
                new Point3DCollection(new Point3D[] {
                    new Point3D(-0.5,0.5,-0.5),new Point3D(-0.5,-0.5,-0.5), new Point3D(-0.5,-0.5,0.5),
                    new Point3D(-0.5,-0.5,0.5),new Point3D(-0.5,0.5,0.5),new Point3D(-0.5,0.5,-0.5)
                }),
                new Point3DCollection(new Point3D[] {
                    new Point3D(-0.5,-0.5,0.5),new Point3D(0.5,-0.5,0.5),new Point3D(0.5,0.5,0.5),
                    new Point3D(0.5,0.5,0.5),new Point3D(-0.5,0.5,0.5), new Point3D(-0.5,-0.5,0.5)
                }),
                new Point3DCollection( new Point3D[] {
                    new Point3D(-0.5,-0.5,-0.5),new Point3D(-0.5,0.5,-0.5),new Point3D(0.5,0.5,-0.5),
                    new Point3D(0.5,0.5,-0.5), new Point3D(0.5,-0.5,-0.5),new Point3D(-0.5,-0.5,-0.5)
                }),
                new Point3DCollection( new Point3D[] {
                    new Point3D(-0.5,-0.5,-0.5), new Point3D(0.5,-0.5,-0.5), new Point3D(0.5,-0.5,0.5),
                    new Point3D(0.5,-0.5,0.5),new Point3D(-0.5,-0.5,0.5), new Point3D(-0.5,-0.5,-0.5)
                }),
                new Point3DCollection( new Point3D[] {
                    new Point3D(0.5,-0.5,-0.5),new Point3D(0.5,0.5,-0.5),new Point3D(0.5,0.5,0.5),
                    new Point3D(0.5,0.5,0.5), new Point3D(0.5,-0.5,0.5), new Point3D(0.5,-0.5,-0.5)
                })
            };
             
            PointCollection[] texturepoints = new PointCollection[6]
            {
                new PointCollection {new Point(1,0), new Point(0,0), new Point(0,1), new Point(0,1), new Point(1,1),new Point(1,0) },
                new PointCollection { new Point(0,0),new Point(0,1),new Point(1,1),  new Point(1,1),new Point(1,0),new Point(0,0) },
                new PointCollection { new Point(0,1), new Point(1,1),new Point(1,0), new Point(1,0),new Point(0,0),new Point(0,1) },
                new PointCollection { new Point(1,1), new Point(1,0),new Point(0,0), new Point(0,0), new Point(0,1), new Point(1,1) },
                new PointCollection { new Point(0,1), new Point(1,1), new Point(1,0),new Point(1,0), new Point(0,0), new Point(0,1)},
                new PointCollection{ new Point(1,1), new Point(1,0),new Point(0,0),new Point(0,0), new Point(0,1),new Point(1,1)}
            };

 
            string[] filename = new string[6] //430251
            {
                "pack://application:,,,/Images/4.jpg",
                "pack://application:,,,/Images/3.jpg",
                "pack://application:,,,/Images/0.jpg",
                "pack://application:,,,/Images/2.jpg",
                "pack://application:,,,/Images/5.jpg",
                "pack://application:,,,/Images/1.jpg"
            };

 
            Viewport3D viewport3D = new Viewport3D();
             
            PerspectiveCamera perspectiveCamera = new PerspectiveCamera()
            {
                Position = new Point3D(0, 0, 3),
                LookDirection = new Vector3D(0, 0, -3),
                FieldOfView = 50,
                UpDirection = new Vector3D(0, 1, 0),
                FarPlaneDistance = 20,
                NearPlaneDistance = 0,
            };
            viewport3D.Camera = perspectiveCamera;

 
            ModelVisual3D modelVisual3D = new ModelVisual3D();
            Model3DGroup model3DGroup = new Model3DGroup();

 
            for (int i = 0; i < 6; i++)
            {
                GeometryModel3D geometryModel3D = new GeometryModel3D();

 
                DiffuseMaterial diffuse = new DiffuseMaterial();
                VisualBrush visualBrush = new VisualBrush();
                Image image = new Image();
                image.Source = new BitmapImage(new Uri(filename[i]));
                visualBrush.Visual = image;
                diffuse.Brush = visualBrush;
                geometryModel3D.Material = diffuse;

 
                MeshGeometry3D meshGeometry3D = new MeshGeometry3D()
                {
                    Positions = positions[i],
                    TextureCoordinates = texturepoints[i],
                };
                geometryModel3D.Geometry = meshGeometry3D;
                model3DGroup.Children.Add(geometryModel3D);
            }
            AmbientLight ambientLight = new AmbientLight();
            model3DGroup.Children.Add(ambientLight);

 
            modelVisual3D.Content = model3DGroup;
            viewport3D.Children.Add(modelVisual3D);

 
            main.Children.Add(viewport3D);

 
            /*
            axisAngleRotation3D = new AxisAngleRotation3D(new Vector3D(1, 1, 0), 0);
            RotateTransform3D rotateTransform3D = new RotateTransform3D(axisAngleRotation3D);
            rotateTransform3D.Rotation = axisAngleRotation3D;
            modelVisual3D.Transform = rotateTransform3D;
            */
            // 如恢复上面,以下可以注销
            axisAngleRotation3D = new AxisAngleRotation3D(new Vector3D(0, 1, 0), 0);
            RotateTransform3D rotate = new RotateTransform3D(axisAngleRotation3D);
            modelVisual3D.Transform = rotate;
            DoubleAnimation animation = new DoubleAnimation();
            animation.From = 0;
            animation.To = 360;
            animation.Duration = new Duration(TimeSpan.FromSeconds(10.0));
            animation.RepeatBehavior = RepeatBehavior.Forever;
            NameScope.SetNameScope(main, new NameScope());
            main.RegisterName("cubeaxis", axisAngleRotation3D);
            Storyboard.SetTargetName(animation, "cubeaxis");
            Storyboard.SetTargetProperty(animation, new PropertyPath(AxisAngleRotation3D.AngleProperty));
            Storyboard RotCube = new Storyboard();
            RotCube.Children.Add(animation);
            RotCube.Begin(main);
        }

 
        double tmp = 0;

 
        private void Main_MouseDown(object sender, MouseButtonEventArgs e)
        {
            // 点击对象手动转动
            /*
            tmp = axisAngleRotation3D.Angle;
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                tmp -= 5;
            }
            if (e.RightButton == MouseButtonState.Pressed)
            {
                tmp += 5;
            }
            axisAngleRotation3D.Angle = tmp;
            */
        }

 
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            axisAngleRotation3D.Axis = new Vector3D(1,0,0);
            axisAngleRotation3D.Angle = 0;
        }

 
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            axisAngleRotation3D.Axis = new Vector3D(0,1,0);
            axisAngleRotation3D.Angle = 0;
        }

 
        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            axisAngleRotation3D.Axis = new Vector3D(1, 1, 0);
            axisAngleRotation3D.Angle = 0;
        }

 
        private void Button_Click_3(object sender, RoutedEventArgs e)
        {
            axisAngleRotation3D.Axis = new Vector3D(0, 1, 1);
            axisAngleRotation3D.Angle = 0;
        }
    }
}


[此贴子已经被作者于2021-8-10 12:07编辑过]

搜索更多相关主题的帖子: jpg Point new using System 
2021-08-10 12:04



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-506469-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.238180 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved