• WPF使用HelixToolkit加载obj格式模型


    1 加载模型

    HelixToolkit是一个WPF下的3D开发框架;

    VS2015;先新建一个WPF项目;

    从NuGet里面安装;需要安装搜出来的前2项;

     安装出现一些问题;把net版本改为4.0;HelixToolkit的最新稳定版本是23.0;

    安装不了;

     看一下HelixToolkit的描述的底部有一个.NetStandard=V2.0;这个应该不是说要把net版本改为2.0;

     23.0可能是和VS2019搭配;使用一个HelixToolkit的早一些的版本,2.15.0,安装上了;

     安装前面2项;

     安装完后看一下引用;

     然后写代码;

    XAML里面需要加入 xmlns:hv="http://helix-toolkit.org/wpf" ,HelixToolkit的命名空间;

    然后使用 作为3D模型的显示的容器;

    XAML先从网上拷一点代码来,我还没细看;

    C#后端,先需要加入2个命名空间,

        using HelixToolkit.Wpf;
        using System.Windows.Media.Media3D;

    加载的代码大体如下;

                string modelPath1 = "Z:\\test\\venusm.obj";
                ModelImporter import = new ModelImporter();
                var initGroup1 = import.Load(modelPath1);

                ModelVisual3D modelVisual3d1 = new ModelVisual3D();
                modelVisual3d1.Content = initGroup1;
                viewPort3D.Children.Add(modelVisual3d1);

    然后运行一下,加载了一个模型;如下图;

     使用一个OBJ模型查看器,看一下原来的模型如下;

     全部的代码;

    1. <Window x:Class="test1.MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:test1"
    7. xmlns:hv="http://helix-toolkit.org/wpf"
    8. mc:Ignorable="d"
    9. Title="MainWindow" Height="350" Width="525">
    10. <Grid>
    11. <hv:HelixViewport3D Name="viewPort3D" ZoomExtentsWhenLoaded="True"
    12. ShowViewCube="false" ShowCoordinateSystem="True"
    13. CoordinateSystemLabelForeground="White"
    14. CoordinateSystemVerticalPosition="Center"
    15. CoordinateSystemHorizontalPosition="Right"
    16. CoordinateSystemHeight="50"
    17. CoordinateSystemWidth="50"
    18. RenderOptions.EdgeMode="Unspecified"
    19. BorderBrush="White"
    20. BorderThickness="0"
    21. ShowFrameRate="False"
    22. ShowCameraInfo="True"
    23. IsManipulationEnabled="True"
    24. Background="Transparent"
    25. >
    26. <hv:HelixViewport3D.DefaultCamera>
    27. <PerspectiveCamera LookDirection="-587.475,-330.619,-229.365" Position="587.475,330.619,256.278" UpDirection="-0.248,-0.139,0.959" FieldOfView="45" NearPlaneDistance="0.1"/>
    28. hv:HelixViewport3D.DefaultCamera>
    29. <hv:SunLight/>
    30. <hv:GridLinesVisual3D Width="1000" Length="1000" MinorDistance="50" MajorDistance="50" Thickness="1" Fill="#E5CFCECE"/>
    31. hv:HelixViewport3D>
    32. Grid>
    33. Window>
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using System.Windows;
    7. using System.Windows.Controls;
    8. using System.Windows.Data;
    9. using System.Windows.Documents;
    10. using System.Windows.Input;
    11. using System.Windows.Media;
    12. using System.Windows.Media.Imaging;
    13. using System.Windows.Navigation;
    14. using System.Windows.Shapes;
    15. using HelixToolkit.Wpf;
    16. using System.Windows.Media.Media3D;
    17. namespace test1
    18. {
    19. ///
    20. /// MainWindow.xaml 的交互逻辑
    21. ///
    22. public partial class MainWindow : Window
    23. {
    24. public MainWindow()
    25. {
    26. InitializeComponent();
    27. string modelPath1 = "Z:\\test\\venusm.obj";
    28. ModelImporter import = new ModelImporter();
    29. var initGroup1 = import.Load(modelPath1);
    30. ModelVisual3D modelVisual3d1 = new ModelVisual3D();
    31. modelVisual3d1.Content = initGroup1;
    32. viewPort3D.Children.Add(modelVisual3d1);
    33. }
    34. }
    35. }

    下回继续;

    2 HelixToolKit鼠标操作模型和场景摄像机的关系

    它的模型加载以后有默认的操作;左键按下移动好像没反应,中键按下移动是拖放模型,右键按下移动是旋转和偏转模型;看一下这些操作会引起摄像机参数的什么改变;

    添加元素的鼠标up事件函数和MouseWheel事件函数,并添加如下代码;

    1. private void HelixViewport3D_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
    2. {
    3. textBox1.Text = mycame1.Position.X.ToString();
    4. textBox2.Text = mycame1.Position.Y.ToString();
    5. textBox3.Text = mycame1.Position.Z.ToString();
    6. textBox4.Text = mycame1.LookDirection.X.ToString();
    7. textBox5.Text = mycame1.LookDirection.Y.ToString();
    8. textBox6.Text = mycame1.LookDirection.Z.ToString();
    9. textBox7.Text = mycame1.FieldOfView.ToString();
    10. }
    11. private void HelixViewport3D_MouseUp(object sender, MouseButtonEventArgs e)
    12. {
    13. textBox1.Text = mycame1.Position.X.ToString();
    14. textBox2.Text = mycame1.Position.Y.ToString();
    15. textBox3.Text = mycame1.Position.Z.ToString();
    16. textBox4.Text = mycame1.LookDirection.X.ToString();
    17. textBox5.Text = mycame1.LookDirection.Y.ToString();
    18. textBox6.Text = mycame1.LookDirection.Z.ToString();
    19. textBox7.Text = mycame1.FieldOfView.ToString();
    20. }
    21. private void HelixViewport3D_MouseWheel(object sender, MouseWheelEventArgs e)
    22. {
    23. textBox1.Text = mycame1.Position.X.ToString();
    24. textBox2.Text = mycame1.Position.Y.ToString();
    25. textBox3.Text = mycame1.Position.Z.ToString();
    26. textBox4.Text = mycame1.LookDirection.X.ToString();
    27. textBox5.Text = mycame1.LookDirection.Y.ToString();
    28. textBox6.Text = mycame1.LookDirection.Z.ToString();
    29. textBox7.Text = mycame1.FieldOfView.ToString();
    30. }

    我初步试了一下;

    按下中键拖放模型会改变摄像机的Position的X和Y参数,其他参数不会影响;对比上图和下图;

     

    如果按下右键移动鼠标,Position和LookDirection参数的X、Y、Z值均会受影响,有时候某个值只会在小数点几位有微小改变;

     

     

    有时间继续; 

  • 相关阅读:
    猿创征文 第二季| #「笔耕不辍」--生命不息,写作不止#
    分布式系统的设计原则
    海康工业相机如何提高相机帧率
    c++ - 第8节 - string类
    zabbix 自动发现
    【PyTorch深度学习项目实战100例】—— 基于ShuffleNet实现中草药识别任务 | 第32例
    分布式代理IP的优势及用途有哪些?
    shell编程
    视频批量高效剪辑,轻松翻转视频画面,支持将视频画面进行逆时针90度翻转。
    [ flex ] -- 父盒子ul为flex布局时宽度不够,子盒子li无法被撑开的问题(li的宽度被压缩)
  • 原文地址:https://blog.csdn.net/bcbobo21cn/article/details/128141536