WinUI(WASDK)使用HelixToolkit加载3D模型并进行项目实践

这篇具有很好参考价值的文章主要介绍了WinUI(WASDK)使用HelixToolkit加载3D模型并进行项目实践。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本人之前开发了一个叫电子脑壳的上位机应用,给稚晖君ElectronBot开源机器人提供一些功能,但是由于是结合硬件才能使用的软件,如果拥有硬件的人员太少,就会导致我的软件没什么人用,于是我就想着能不能将机器人硬件的模型加载到软件里,这样用户就可以不使用硬件也可以使用我的软件了。于是就有了在WinUI(WASDK)里使用3D模型的需求。

最终效果如下:
WinUI(WASDK)使用HelixToolkit加载3D模型并进行项目实践

先来个B站复刻机器人的开箱视频吧。(如果感觉无聊可以直接拖到代码讲解部分)

WinUI(WASDK)使用HelixToolkit加载3D模型并进行项目实践

库选择的纠结过程

在选择库的过程中其实并不是一帆风顺,因为WinUI(WASDK)是个比较新的框架,框架本身也没有提供3D模型加载的功能,于是我就在想到底选择什么样的办法加载,之前有看到一些UWP加载模型的demo,但是基本上就是封装的c++的库,对于我这c++垃圾的人来说还是很痛苦的,我的要求就是不能有c++代码。

要满足模型的加载,模型的旋转变换平移,模型材质的更换,在经过筛选以后,备选方案有three.js,HelixToolkit。

  • three.js

    GitHub Copilot: three.js 是一个基于 JavaScript 的 3D 图形库,它使用 WebGL 技术在浏览器中渲染 3D 图形。它提供了一组易于使用的 API,使用户可以创建高度可定制的 3D 场景,包括模型、纹理、光源和相机等部分。此外,three.js 还支持动画、物理模拟和粒子系统等功能,使用户可以创建逼真的 3D 动画效果。three.js 可以在多种浏览器和设备上运行,并且有一个庞大的社区支持和贡献。

    由于要和前端框架进行互操作,所以这个我也不是优先考虑了。

  • HelixToolkit(基于SharpDX再次封装的)

所用框架和库介绍

1. WASDK

这个框架是微软最新的UI框架,我主要是用来开发程序的主体,做一些交互和功能的承载,本质上和wpf,uwp这类程序没什么太大的区别,区别就是一些工具链的不同。

2. HelixToolkit

GitHub Copilot: HelixToolkit是一个面向.NET开发人员的3D图形库。它提供了一组控件和辅助类,用于在WPF和WinForms应用程序中创建和渲染3D场景。HelixToolkit支持多种3D文件格式,包括OBJ、STL和FBX,并包括照明、材质、纹理和动画等功能。它还支持高级渲染技术,如阴影、反射和透明度。HelixToolkit是开源的,可以从GitHub下载。

代码讲解

1. Demo项目介绍

demo项目地址

项目结构如下图:
WinUI(WASDK)使用HelixToolkit加载3D模型并进行项目实践

处理过程

=>加载器加载模型=>将模型加载到模型组=>初始化相机=>进行数据到控件的绑定

2. 核心代码讲解

预备知识

  • SharpDX的坐标系是左手坐标系

    GitHub Copilot: DirectX使用左手坐标系来描述3D空间中的对象位置和方向。在左手坐标系中,x轴向右,y轴向上,z轴向外(屏幕外)。这与右手坐标系的z轴方向相反。左手坐标系在计算机图形学中广泛使用,因为它与人眼的观察方式相符合。

WinUI(WASDK)使用HelixToolkit加载3D模型并进行项目实践

  • 3D场景下的模型变换(平移 旋转 缩放)

模型加载完成以后,就需要让模型动起来,这样才能算是完整的过程了。

核心旋转代码如下:

WinUI(WASDK)使用HelixToolkit加载3D模型并进行项目实践

场景是将模型绕手臂点进行旋转,需要将手臂模型组移动到原点,旋转完成之后再移动到原来的位置。

3. 实际项目使用

下载电子脑壳源码

WinUI(WASDK)使用HelixToolkit加载3D模型并进行项目实践

动作序列以及表情帧数据处理实际代码如下:

 private void Instance_ModelActionFrame(object? sender, Verdure.ElectronBot.Core.Models.ModelActionFrame e)
    {
        BodyModel.HxTransform3D = _bodyMt * Matrix.RotationY(MathUtil.DegreesToRadians((e.J6)));

        Material = new DiffuseMaterial()
        {
            EnableUnLit = false,
            DiffuseMap = LoadTextureByStream(e.FrameStream)
        };


        var nodeList = HeadModel.GroupNode;

        foreach (var itemMode in nodeList.Items)
        {
            if (itemMode.Name == "Head3.obj")
            {
                foreach (var node in itemMode.Traverse())
                {
                    if (node is MeshNode meshNode)
                    {
                        meshNode.Material = Material;
                    }
                }
            }
        }

        var rightList = RightShoulderBoundingBox.GetCorners();

        var rightAverage = new SharpDX.Vector3(
            (rightList[1].X + rightList[5].X) / 2f,
            ((rightList[1].Y + rightList[5].Y) / 2f) - 8f,
            (rightList[1].Z + rightList[5].Z) / 2f);

        var leftList = LeftShoulderBoundingBox.GetCorners();

        var leftAverage = new SharpDX.Vector3(
            (leftList[0].X + leftList[4].X) / 2f,
            ((leftList[0].Y + leftList[4].Y) / 2f) - 8f,
            (leftList[0].Z + leftList[4].Z) / 2f);

        var translationMatrix = Matrix.Translation(-rightAverage.X, -rightAverage.Y, -rightAverage.Z);

        var tr2 = _rightArmMt * translationMatrix;

        var tr3 = tr2 * Matrix.RotationZ(MathUtil.DegreesToRadians(-(e.J2)));
        var tr4 = tr3 * Matrix.RotationX(MathUtil.DegreesToRadians(-(e.J3)));

        var tr5 = tr4 * Matrix.Translation(rightAverage.X, rightAverage.Y, rightAverage.Z);


        var tr6 = tr5 * Matrix.RotationY(MathUtil.DegreesToRadians((e.J6)));

        RightArmModel.HxTransform3D = tr6;


        var leftMatrix = Matrix.Translation(-leftAverage.X, -leftAverage.Y, -leftAverage.Z);

        var leftTr2 = _leftArmMt * leftMatrix;

        var leftTr3 = leftTr2 * Matrix.RotationZ(MathUtil.DegreesToRadians((e.J4)));
        var leftTr4 = leftTr3 * Matrix.RotationX(MathUtil.DegreesToRadians(-(e.J5)));

        var leftTr5 = leftTr4 * Matrix.Translation(leftAverage.X, leftAverage.Y, leftAverage.Z);


        var leftTr6 = leftTr5 * Matrix.RotationY(MathUtil.DegreesToRadians((e.J6)));

        LeftArmModel.HxTransform3D = leftTr6;

        var headMatrix = Matrix.Translation(-HeadModelCentroidPoint.X, -HeadModelCentroidPoint.Y, -HeadModelCentroidPoint.Z);

        var headTr2 = _headMt * headMatrix;

        var headTr3 = headTr2 * Matrix.RotationX(MathUtil.DegreesToRadians(-(e.J1)));

        var headTr4 = headTr3 * Matrix.Translation(HeadModelCentroidPoint.X, HeadModelCentroidPoint.Y, HeadModelCentroidPoint.Z);


        var headTr5 = headTr4 * Matrix.RotationY(MathUtil.DegreesToRadians((e.J6)));

        HeadModel.HxTransform3D = headTr5;
    }

最终效果如下:
WinUI(WASDK)使用HelixToolkit加载3D模型并进行项目实践

个人感悟

通过模型加载的这个过程的学习,最大的感悟就是编程开发其实只是运用工具实现自己的想法,这个过程中我们对于工具的使用可能比较熟悉了,但是如果我们的领域知识不够丰富,那基本上也是做不了什么的,所以学习一些东西的时候我们的相关知识也要进行学习才好。

我也是在这个过程中才学习了什么是左手坐标系,以及4x4矩阵的变换和相机视角。这些东西都是和框架无关的知识,假如我们都学精通了,用什么框架实现我们的想法其实都不是问题了。

总结,还是要努力学习呀。

参考推荐文档项目如下

demo地址

电子脑壳

WASDK文档地址

ElectronBot

HelixToolkit文章来源地址https://www.toymoban.com/news/detail-473786.html

到了这里,关于WinUI(WASDK)使用HelixToolkit加载3D模型并进行项目实践的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • WinAppSDK / WinUI3 项目无法使用 SystemEvents 的问题

    SystemEvents 是一个开发 win32 窗口项目很常用的类,其中封装了一些常用的系统广播消息。在 WinUI3 项目中,SystemEvents 事件经常无法触发,简单排查了一下原因。 SystemEvent 内封装了一个线程和一个窗口,通过窗口消息在内部线程上调用事件,内部使用了 SystemEventInvokeInfo 对象来

    2024年03月23日
    浏览(23)
  • 基于QT使用OpenGL,加载obj模型,进行鼠标交互

    基于QT平台,使用OpenGL进行obj文件加载显示; 使用鼠标对场景进行缩放、移动、旋转交互;   OpenGL是基于C的,学习曲线比较抖,但是总的来说就是下面一幅图,   用语言简单的描述(个人理解,可能不太准确)是把 cpu里内存里的3D数据,传输到显卡的内存里,以及如何

    2024年02月04日
    浏览(36)
  • WPF编程--3D控件HelixToolkit

    目录 1. 环境 2. NuGet导入依赖 3. 编辑MainWindow.xaml.cs 4. 编辑MainWindow.xaml 源码:https://github.com/liugang198409/WpfDemo/tree/master/3DDemo  视频:WPF编程--3D Demo_哔哩哔哩_bilibili stl文件:https://download.csdn.net/download/liugang590/87426104 Visual Studio 2019 + .NET Framework 4.8.1 HelixToolkit HelixToolkit.Wpf

    2024年02月16日
    浏览(29)
  • uniApp中使用小程序XR-Frame创建3D场景(2)加载模型

    上篇文章讲述了如何将XR-Frame作为子组件集成到uniApp中使用,只完成了简单的环境搭建,这篇文章讲解如何加载3D模型。 在XR-Frame框架中,加载资源都是在wxml文件的标签中实现的。下面是wxml中完整的代码 index.wxml 上面代码中, xr-assets  标签代表要加载资源 , xr-asset-load 标签

    2024年04月28日
    浏览(25)
  • Pix4Dmapper系列教程(一):Pix4D模型成果导出OSGB并加载到CASS3D进行三维测图

    随着无人机航飞的推广,数据处理成为问题根源。3D模型使用一直困扰着一众测绘人员,虽有部分使用CC(原Smart3D)进行模型生成,但是PIX4D使用用户确一直受到模型无法加载到CASS 3D中应用问题困扰,此文彻底解决此问题。 在垂直摄影中,Pix4D也可以生成漂亮的三维模型,Pix4D生

    2024年02月06日
    浏览(197)
  • WPF 插件HelixToolkit库实现3D显示

    文章目录 前言 一、HelixToolkit安装 二、使用步骤 1.引入库 2.xmal代码设置         3.后端程序         4.3D显示 总结 3D显示、旋转、部件移动(位置获取) 开发一个可导入.stl文件,可视化3D显示模型,部件之间鼠标移动、键盘设置位置等。 WPF开发库HelixToolkit 引入库命名

    2024年02月12日
    浏览(25)
  • WPF3D关于HelixToolkit-3D呈现的交互处理

    关于HelixToolkit-这个3D呈现的交互处理推荐使用,因为功能比较强大 一个开源3D库,根据MIT许可证获得许可。MIT许可证非常宽松,允许在专有软件中使用。该库基于 .NET,目前专注于 WPF 平台。 HelixToolkit是.NET Framework的一个开源3D图形库,它主要用于创建和操作3D图形1。 HelixToo

    2024年02月08日
    浏览(47)
  • 【C#-Helixtoolkit】HelixViewport3D绘制曲线

    WPF-Helixtoolkit绘制螺旋路径 WPF-helixtoolkit绘制3D曲线路径 WinForm加载helixtoolkit 视频演示 部分代码: 一、绘制螺旋线 二、绘制3D曲线路径 三、WinForm加载Helixtoolkit控件 将WPF中上面示例的主窗体封装成WPF自定义控件public partial class MyControl : UserControl,之后引用并添加到winform窗体。缺

    2024年02月13日
    浏览(33)
  • VoxPoser:使用语言模型进行机器人操作的可组合 3D 值图

    语言是一种压缩媒介,人们通过它来提炼和传达他们对世界的知识和经验。大型语言模型(LLMs)已成为一种有前景的方法,通过将世界投影到语言空间中来捕捉这种抽象。虽然这些模型被认为在文本形式中内化了可概括的知识,但如何利用这种可概括的知识使具身代理能够在

    2024年02月03日
    浏览(31)
  • 使用Open3D进行OBJ模型三维可视化

    使用Open3D进行OBJ模型三维可视化 在三维图像处理领域,OBJ文件是一种常见的三维模型格式,而Open3D则是一个强大的开源3D计算机视觉库。本文将介绍如何使用Open3D对OBJ文件进行可视化。 首先,需要安装Open3D库。使用pip install即可: 接下来,我们可以使用Open3D提供的read_triang

    2024年02月06日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包