Ответы с форумов MSDN

Трехмерная графика в WPF

Date: 05.05.2018 14:45:51

Используя элемент Viewport3D. Почитайте здесь: https://docs.microsoft.com/en-us/dotnet/framework/wpf/graphics-multimedia/3-d-graphics-overview

Например, следующий код позволяет отобразить трехмерную фигуру и управлять положением камеры с помощью мыши (изменяет направление взгляда при движении мыши и приближает/отдаляет при нажатии кнопок мыши):

<Window x:Class="Wpf3d.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
         WindowState="Maximized" MouseMove="Window_MouseMove" MouseDown="Window_MouseDown" MouseLeave="Window_MouseLeave">
    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
          >
        <Viewport3D Name="myViewport" HorizontalAlignment="Stretch"
                    VerticalAlignment="Stretch">

            <!-- Add a camera. -->
            <Viewport3D.Camera>
                <PerspectiveCamera 
						FarPlaneDistance="20" 
						LookDirection="0,0,1" 
						UpDirection="0,1,0" 
						NearPlaneDistance="1" 
						Position="0,0,-6" 
						FieldOfView="45" />
            </Viewport3D.Camera>

            <!-- Add models. -->
            <Viewport3D.Children>

                <ModelVisual3D>
                    <ModelVisual3D.Content>

                        <Model3DGroup >
                            <Model3DGroup.Children>

                                <!-- Lights, MeshGeometry3D and DiffuseMaterial objects are added to the ModelVisual3D. -->
                                <DirectionalLight Color="#FFFFFFFF" Direction="3,-4,5" />

                                <!-- Define a red cone. -->
                                <GeometryModel3D>

                                    <GeometryModel3D.Geometry>

                                        

                                        <MeshGeometry3D 
    Positions="0.293893 -0.5 0.404509  0.475528 -0.5 0.154509  0 0.5 0  0.475528 -0.5 0.154509  0 0.5 0  0 0.5 0  0.475528 -0.5 0.154509  0.475528 -0.5 -0.154509  0 0.5 0  0.475528 -0.5 -0.154509  0 0.5 0  0 0.5 0  0.475528 -0.5 -0.154509  0.293893 -0.5 -0.404509  0 0.5 0  0.293893 -0.5 -0.404509  0 0.5 0  0 0.5 0  0.293893 -0.5 -0.404509  0 -0.5 -0.5  0 0.5 0  0 -0.5 -0.5  0 0.5 0  0 0.5 0  0 -0.5 -0.5  -0.293893 -0.5 -0.404509  0 0.5 0  -0.293893 -0.5 -0.404509  0 0.5 0  0 0.5 0  -0.293893 -0.5 -0.404509  -0.475528 -0.5 -0.154509  0 0.5 0  -0.475528 -0.5 -0.154509  0 0.5 0  0 0.5 0  -0.475528 -0.5 -0.154509  -0.475528 -0.5 0.154509  0 0.5 0  -0.475528 -0.5 0.154509  0 0.5 0  0 0.5 0  -0.475528 -0.5 0.154509  -0.293892 -0.5 0.404509  0 0.5 0  -0.293892 -0.5 0.404509  0 0.5 0  0 0.5 0  -0.293892 -0.5 0.404509  0 -0.5 0.5  0 0.5 0  0 -0.5 0.5  0 0.5 0  0 0.5 0  0 -0.5 0.5  0.293893 -0.5 0.404509  0 0.5 0  0.293893 -0.5 0.404509  0 0.5 0  0 0.5 0  " 
    Normals="0.7236065,0.4472139,0.5257313  0.2763934,0.4472138,0.8506507  0.5308242,0.4294462,0.7306172  0.2763934,0.4472138,0.8506507  0,0.4294458,0.9030925  0.5308242,0.4294462,0.7306172  0.2763934,0.4472138,0.8506507  -0.2763934,0.4472138,0.8506507  0,0.4294458,0.9030925  -0.2763934,0.4472138,0.8506507  -0.5308242,0.4294462,0.7306172  0,0.4294458,0.9030925  -0.2763934,0.4472138,0.8506507  -0.7236065,0.4472139,0.5257313  -0.5308242,0.4294462,0.7306172  -0.7236065,0.4472139,0.5257313  -0.858892,0.429446,0.279071  -0.5308242,0.4294462,0.7306172  -0.7236065,0.4472139,0.5257313  -0.8944269,0.4472139,0  -0.858892,0.429446,0.279071  -0.8944269,0.4472139,0  -0.858892,0.429446,-0.279071  -0.858892,0.429446,0.279071  -0.8944269,0.4472139,0  -0.7236065,0.4472139,-0.5257313  -0.858892,0.429446,-0.279071  -0.7236065,0.4472139,-0.5257313  -0.5308242,0.4294462,-0.7306172  -0.858892,0.429446,-0.279071  -0.7236065,0.4472139,-0.5257313  -0.2763934,0.4472138,-0.8506507  -0.5308242,0.4294462,-0.7306172  -0.2763934,0.4472138,-0.8506507  0,0.4294458,-0.9030925  -0.5308242,0.4294462,-0.7306172  -0.2763934,0.4472138,-0.8506507  0.2763934,0.4472138,-0.8506507  0,0.4294458,-0.9030925  0.2763934,0.4472138,-0.8506507  0.5308249,0.4294459,-0.7306169  0,0.4294458,-0.9030925  0.2763934,0.4472138,-0.8506507  0.7236068,0.4472141,-0.5257306  0.5308249,0.4294459,-0.7306169  0.7236068,0.4472141,-0.5257306  0.8588922,0.4294461,-0.27907  0.5308249,0.4294459,-0.7306169  0.7236068,0.4472141,-0.5257306  0.8944269,0.4472139,0  0.8588922,0.4294461,-0.27907  0.8944269,0.4472139,0  0.858892,0.429446,0.279071  0.8588922,0.4294461,-0.27907  0.8944269,0.4472139,0  0.7236065,0.4472139,0.5257313  0.858892,0.429446,0.279071  0.7236065,0.4472139,0.5257313  0.5308242,0.4294462,0.7306172  0.858892,0.429446,0.279071  "                   TriangleIndices="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 " />
                                    </GeometryModel3D.Geometry>

                                    <GeometryModel3D.Material>
                                        <DiffuseMaterial>
                                            <DiffuseMaterial.Brush>
                                                <SolidColorBrush 
                            Color="Red" 
                            Opacity="1.0"/>
                                            </DiffuseMaterial.Brush>
                                        </DiffuseMaterial>
                                    </GeometryModel3D.Material>

                                </GeometryModel3D>

                            </Model3DGroup.Children>
                        </Model3DGroup>

                    </ModelVisual3D.Content>

                </ModelVisual3D>

            </Viewport3D.Children>

        </Viewport3D>
    </Grid>
</Window>

Код c#:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Media3D;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace Wpf3d
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            cam = myViewport.Camera as PerspectiveCamera;
        }

        Point pos;//предыдущее положение мыши
        bool HasPos = false;
        PerspectiveCamera cam;        

        private void Window_MouseMove(object sender, MouseEventArgs e)
        {
            Point pos2 = e.GetPosition(myViewport);//получаем положение мыши
            if (!HasPos)
            {
                pos = pos2;//если нет предыдущего положения, сохраним его и выйдем
                HasPos = true;
                return;
            }

            //найдем разницу между текущим и предыдущим положением
            double dx = pos2.X - pos.X;
            double dy = pos2.Y - pos.Y;
            pos = pos2;

            //сменим направление камеры
            var direct = cam.LookDirection;
            direct.X += 0.001 * dx;
            direct.Y += 0.001 * dy;
            if (direct.X > 0.4) direct.X = 0.4;
            if (direct.X < -0.4) direct.X = -0.4;
            if (direct.Y > 0.4) direct.Y = 0.4;
            if (direct.Y < -0.4) direct.Y = -0.4;
            cam.LookDirection = direct;
        }

        private void Window_MouseDown(object sender, MouseButtonEventArgs e)
        {
            //приближение/отдаление камеры при щелчке мыши
            var p = cam.Position;
            if (e.ChangedButton == MouseButton.Left) p.Z += 0.2;
            else p.Z -= 0.2;
            cam.Position = p;
        }

        private void Window_MouseLeave(object sender, MouseEventArgs e)
        {
            //сброс положения мыши при покидании окна
            this.HasPos = false;
            var direct = cam.LookDirection;
            direct.X = 0;
            direct.Y = 0;
            cam.LookDirection = direct;
        }
    }
}



Автор: VadimTagil

Главная страница - Список тем - Репозиторий на GitHub