使用 .NET MAUI 和 Evergine 构建 3D 应用程序和内容

news2024/11/24 16:18:27

作者:Jorge Canton Ferrero
排版:Alan Wang

这是来自 Plain Concepts 的 Jorge Canton 的客座博客文章。Jorge 是技术初创公司 Syderis 的联合创始人,12 年来一直致力于计算机图形、游戏引擎和图形工具领域的开发。目前,他担任 Plain Concepts 的研究总监,积极参与 Evergine 的开发,Evergine 是一款专为行业应用量身定制的尖端 3D 图形引擎。

在这里插入图片描述
您在使用电子商务平台的时候,曾产生过希望能够使用 3D 图像而不是静态图像展示并从任何角度查看产品的想法吗?您曾经在查看大型购物中心的地图的时候,是否有过如果可以用可探索的 3D 地图,导航会更容易的念头?在本文中,我们将学习如何使用 .NET MAUI 实现所有这些以及更多的功能。

什么是 Evergine?

Evergine 是一款于 2012 年用 C# 开发的跨平台 3D 引擎。Evergine 因无缝集成功能而闻名并成为工业项目的首选。它可以轻松地集成到现有项目中,也可以与其他技术配合使用。借助 Evergine,您可以制作与各种平台兼容的应用程序,包括 Windows、Linux、Android、iOS、Hololens、Meta Quest/Quest2/Quest Pro、Pico 和 Web。

Evergine 还拥有与各种 UI 技术的无缝集成,包括 WPF、Forms、SDL、UWP、Html/Javascript、WinUI,现在甚至还包括 .NET MAUI。我们致力于跟踪最新的 .NET 版本和工具,为我们的客户提供最佳的体验。
在这里插入图片描述
Evergine 的主要功能包括:
在这里插入图片描述
Evergine 的使用是完全免费的,没有许可费和版税,适用于商业和非商业项目。Evergine 的商业模式是围绕其提供的附加服务进行收费,例如:

  • 优先支持——我们提供 72 小时 SLA 为您在项目中使用 Evergine 时可能遇到的任何问题提供帮助和技术支持。
  • 源代码访问——我们授予您访问 Evergine 源代码的全部权限。
  • 专业服务——您可以根据您的需求参加培训课程、一对一课程、概念验证和新功能。

价格可在官方网站上查询。

Evergine 如何与 .NET .NET MAUI 一起使用

在最新的 Evergine 版本中,引入了新的 .NET MAUI 项目模板。有了这个模板,Evergine 可以让您创建一个标准的 .NET MAUI 项目,其中包含 EvergineView 控件,该控件可以无缝集成到应用程序的任何视图中。EvergineView 控件充当 Evergine 生成的 3D 场景的画布,您可以使用 Evergine Studio 配置它。
在这里插入图片描述
EvergineView 是一个抽象的自定义 .NET MAUI 控件,使您能够跨 Windows、Android 和 iOS 平台无缝工作。

public class EvergineView : View
 {
     public static readonly BindableProperty ApplicationProperty =
         BindableProperty.Create(nameof(Application), typeof(EvergineApplication), typeof(EvergineView), null);

     public static readonly BindableProperty DisplayNameProperty =
         BindableProperty.Create(nameof(DisplayName), typeof(string), typeof(EvergineView), string.Empty);

     public EvergineApplication Application
     {
         get { return (EvergineApplication)this.GetValue(ApplicationProperty); }
         set { this.SetValue(ApplicationProperty, value); }
     }

     public string DisplayName
     {
         get { return (string)this.GetValue(DisplayNameProperty); }
         set { this.SetValue(DisplayNameProperty, value); }
     }

     public event EventHandler PointerPressed;

     public event EventHandler PointerMoved;

     public event EventHandler PointerReleased;

     internal void StartInteraction() => this.PointerPressed?.Invoke(this, EventArgs.Empty);

     internal void MovedInteraction() => this.PointerMoved?.Invoke(this, EventArgs.Empty);

     internal void EndInteraction() => this.PointerReleased?.Invoke(this, EventArgs.Empty);
 }

另一方面,渲染实现是使用每个平台的自定义处理程序创建的。以下代码是 Android 处理程序的示例。

public partial class EvergineViewHandler : ViewHandler<EvergineView, AndroidSurfaceView>
  {
      private AndroidSurface androidSurface;
      private AndroidWindowsSystem windowsSystem;

      public EvergineViewHandler(IPropertyMapper mapper, CommandMapper commandMapper = null)
         : base(mapper, commandMapper)
      { }

      public static void MapApplication(EvergineViewHandler handler, EvergineView evergineView)
      {
          handler.UpdateApplication(evergineView, evergineView.DisplayName);
      }

      internal void UpdateApplication(EvergineView view, string displayName)
      {
          if (view.Application is null) { return; }

          // Register Windows system
          view.Application.Container.RegisterInstance(this.windowsSystem);

          // Creates XAudio device
          var xaudio = new global::Evergine.OpenAL.ALAudioDevice();
          view.Application.Container.RegisterInstance(xaudio);

          System.Diagnostics.Stopwatch clockTimer = System.Diagnostics.Stopwatch.StartNew();
          this.windowsSystem.Run(
          () =>
          {
              this.ConfigureGraphicsContext(view.Application as SneakerApp.MyApplication, this.androidSurface);
              view.Application.Initialize();
          },
          () =>
          {
              var gameTime = clockTimer.Elapsed;
              clockTimer.Restart();

              view.Application.UpdateFrame(gameTime);
              view.Application.DrawFrame(gameTime);
          });
      }

      protected override AndroidSurfaceView CreatePlatformView()
      {
          this.windowsSystem = new AndroidWindowsSystem(this.Context);
          this.androidSurface = this.windowsSystem.CreateSurface(0, 0) as AndroidSurface;
          return this.androidSurface.NativeSurface;
      }

      private void ConfigureGraphicsContext(MyApplication application, Surface surface)
      {
          var graphicsContext = new VKGraphicsContext();
          graphicsContext.CreateDevice();
          SwapChainDescription swapChainDescription = new SwapChainDescription()
          {
              SurfaceInfo = surface.SurfaceInfo,
              Width = surface.Width,
              Height = surface.Height,
              ColorTargetFormat = PixelFormat.R8G8B8A8_UNorm,
              ColorTargetFlags = TextureFlags.RenderTarget | TextureFlags.ShaderResource,
              DepthStencilTargetFormat = PixelFormat.D24_UNorm_S8_UInt,
              DepthStencilTargetFlags = TextureFlags.DepthStencil,
              SampleCount = TextureSampleCount.None,
              IsWindowed = true,
              RefreshRate = 60,
          };
          var swapChain = graphicsContext.CreateSwapChain(swapChainDescription);
          swapChain.VerticalSync = true;

          var graphicsPresenter = application.Container.Resolve<GraphicsPresenter>();
          var firstDisplay = new global::Evergine.Framework.Graphics.Display(surface, swapChain);
          graphicsPresenter.AddDisplay("DefaultDisplay", firstDisplay);

          application.Container.RegisterInstance(graphicsContext);

          surface.OnScreenSizeChanged += (_, args) =>
          {
              swapChain.ResizeSwapChain(args.Height, args.Width);
          };
      }
  }

此外,Evergine 自定义处理程序的注册是在项目的 MauiProgram.cs 文件中执行的。

public static class .NET MAUIProgram
    {
        public static .NET MAUIApp CreateMauiApp()
        {
            var builder = .NET MAUIApp.CreateBuilder();
            builder
                .UseMauiApp<App>()
                .UseMauiEvergine()
                .ConfigureFonts(fonts =>
                {
                    fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                    fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
                });

#if DEBUG
        builder.Logging.AddDebug();
#endif

            return builder.Build();
        }
    }

最后,3D 场景可能非常复杂,可能包含各种资源,例如纹理、材质和模型等。Evergine 可以方便地将所有 3D 场景资源打包并传输到设备上。为了实现这一目标,Evergine 模板包含了特定的目标,将 3D 内容标记为 MauiAsset ,并将其注入到 .NET MAUI 目标管道中。
在这里插入图片描述

入门指南

从官方网站下载并安装 Evergine 后,您首先要了解 Evergine 启动器。它使您能够管理不同的版本、使用各种项目模板创建新项目、访问示例项目以及查找支持和文档的链接。
在这里插入图片描述
如果您想要从 Evergine 启动器启动新项目,请导航至“My Projects”部分,然后单击“Add New Project”按钮
在这里插入图片描述
此时项目配置窗口就会打开,允许您选择项目名称、项目的磁盘位置以及所需的 Evergine 版本。此外,您还可以选择新的 .NET MAUI 模板。
在这里插入图片描述
单击“Create”按钮后,Evergine Studio 就会打开。然后,您可以将任何基本对象添加到场景中,并附加一个 Spinner 组件,其值为{x:1, y:2, z:3},以实现对基本对象的旋转。
在这里插入图片描述
如果您想要访问 .NET MAUI 解决方案,只需从 Evergine Studio 中的“File”菜单将其打开即可。
在这里插入图片描述
当您在 Visual Studio 中启动 .NET MAUI 解决方案时,您会发现该解决方案中有两个集成项目。第一个项目是您在所有模板之间共享的 Evergine 项目,第二个是 .NET MAUI 项目,它引用了 Evergine 项目。
在这里插入图片描述
在 .NET MAUI 项目中,您将会找到 Platform 文件夹,其中包含特定于平台的资源,例如 Android Manifest 和 Info.plist 文件。在 Evergine 文件夹中,您将看到 EvergineView 控件。该控件可以轻松集成到您的 XAML 页面中,使您能够包含 Evergine 画布来渲染 3D 场景。
在这里插入图片描述
如果您想要在各种平台上部署您的项目,请使用 Visual Studio 中的“Run/Deploy”按钮。请注意,对于 iOS 部署,您需要在 Visual Studio 和 Mac 之间建立连接,并将 iOS 设备(iPad 或 iPhone)链接到您的 Mac。
在这里插入图片描述
在 .NET MAUI 解决方案中成功部署项目后,您将获得类似于上述示例的结果。下图展示了 .NET MAUI 中的基本 XAML 页面,其中包含一个 Label 和一个 EvergineView。这只是一个示例,但您可以自由地利用最新的 .NET 技术和 Evergine 来制作出色的项目。
在这里插入图片描述
您可以探索我们的展示应用程序,它演示了如何将移动应用程序 UI 与 3D 内容无缝融合,并有效地在 Evergine 和 .NET MAUI UI 之间进行通信。

EverSneaks 展示应用程序

存储库:https://github.com/EvergineTeam/EverSneaks
在这里插入图片描述

CarRental展示应用程序(作者:@Javier Suarez)

存储库:https://github.com/jsuarezruiz/netmaui-carrental-app-challenge
在这里插入图片描述

Evergine 主要资源

在 Evergine 官方网站中,您可以找到很多有关入门 Evergine 的有趣资源,以下是最重要的资源。

  • Evergine 文档
  • 示例工程存储库
  • 视频教程
  • Youtube 频道
  • 反馈
  • 联系方式

展望未来

目前 .NET MAUI 模板使用 .NET 7稳定版。在11 月份 .NET 8 稳定版发布后,为了使用最新的改进和功能,我们会将 .NET MAUI 模板更新为 .NET 8 稳定版。

我们坚信社区可以利用这些技术打造出极具吸引力的应用程序。我们迫不及待地想要见证您将 3D 与 .NET MAUI 相结合,从而创造出令人激动的作品的过程!

我们非常期待您的反馈。祝您在使用 Evergine 和 .NET MAUI 编码时愉快!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1163076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工作事项太多如何合理安排事项?

不论您所从事的时哪个行业&#xff1f;每天总是会有很多事情需要处理&#xff0c;很多人在职场中都是忙得焦头烂额&#xff0c;甚至有时候还会因工作的交叉性出现不能按时完成重要的工作任务&#xff0c;这时候大家就需要合理安排工作事项&#xff0c;并借助一些工具督促工作任…

ChatGPT AI工具盘点:国内外推荐的AI人工智能聊天机器人工具

Chatgpt作为一个重要的人工智能对话工具&#xff0c;给人们的日常生活和工作带来了很多便利和创新&#xff0c;现在更是被应用于各种领域&#xff0c;从2015年12月Openai公司成立&#xff0c;直到2022年12年GPT-3的正式发布&#xff0c;Chatgpt才正式进入大众的视野&#xff0c…

【MySQL数据库】 三

本文主要介绍了mysql的数据增加操作和查询操作. SQL最核心的就是增删改查(CRUD) * c create * r read * u update * d delete 一.新增 1.往数据表中插入一条数据 insert into 表名 values( 值 ,值 , ….) ; 2.插入中文 3.指定列插入 4.一次插…

十分钟设置免费海外远程桌面 | 使用Amazon Lightsail服务的免费套餐轻松搭建远程桌面

目录 使用Amazon Lightsail服务的免费套餐轻松搭建远程桌面 1. 启动Amazon Lightsail实例 2. 配置远程桌面 3. 启动远程桌面 4. 使用远程桌面 使用Amazon Lightsail服务的免费套餐轻松搭建远程桌面 前言 ①本教程将向您介绍如何使用Amazon Lightsail服务的免费套餐轻松搭…

使用工具+迅雷解决ESP32配置下载问题

因为一些原因下载git上内容相当缓慢或都根本无法下载所以写了一个工具获取链接并使用迅雷下载。 工具下载&#xff1a;【免费】使用迅雷下载开发板工具资源-CSDN文库

【STM32】基于HAL库建立自己的低功耗模式配置库(STM32L4系列低功耗所有配置汇总)

【STM32】基于HAL库建立自己的低功耗模式配置库&#xff08;STM32L4系列低功耗所有配置汇总&#xff09; 文章目录 低功耗模式&#xff08;此章节可直接跳过&#xff09;低功耗模式简介睡眠模式停止模式待机模式 建立自己的低功耗模式配置库通过结构体的方式来进行传参RTC配置…

高等数学啃书汇总重难点(十二)无穷级数

同济高数的最后一张&#xff0c;重点是各种审敛法&#xff0c;至于后面的傅里叶级数和泰勒级数等&#xff0c;期末考试一般不会考&#xff08;很多学校都不学&#xff09;&#xff0c;奈何数学一的考纲里面有&#xff0c;就捎带提一嘴。。。学会判别特定级数的敛散性是这一章的…

面试算法51:节点值之和最大的路径

题目 在二叉树中将路径定义为顺着节点之间的连接从任意一个节点开始到达任意一个节点所经过的所有节点。路径中至少包含一个节点&#xff0c;不一定经过二叉树的根节点&#xff0c;也不一定经过叶节点。给定非空的一棵二叉树&#xff0c;请求出二叉树所有路径上节点值之和的最…

机器学习 - 加油站数据分析

一、实验数据 数据集&#xff1a;“加油站数据.xls” 数据集介绍&#xff1a;该表记录了用户在11月和12月一天24小时内的加油信息&#xff0c;包括&#xff1a;持卡人标识&#xff08;cardholder&#xff09;、卡号&#xff08;cardno&#xff09;、加油站网点号&#xff08;n…

React Native 样式及其布局

React Native 样式及其布局 参考 https://reactnative.cn/docs/flexbox 一、样式 在 React Native 中&#xff0c;你并不需要学习什么特殊的语法来定义样式。我们仍然是使用 JavaScript 来写样式。所有的核心组件都接受名为style的属性。这些样式名基本上是遵循了 web 上的 …

液滴微流控,助力国人单细胞

单细胞RNA测序&#xff08;scRNA-seq&#xff09;技术已经成为揭示单个细胞内RNA转录本的异质性和复杂性&#xff0c;以及揭示组织/器官/生物体内不同细胞类型的组成和功能的最先进的方法。迄今为止&#xff0c;单细胞RNA测序技术已经在动植物等真核细胞中取得了许多重要的发现…

【Python基础】IF、Else判断以及Whlie、for循环介绍符实例

运算符 1. if 语句体验2.逻辑运算3. if 语句进阶4.While循环4.1基本语法 5.break 和 continue6. for循环 1. if 语句体验 if 判断语句基本语法 在 Python 中&#xff0c;if 语句 就是用来进行判断的&#xff0c;格式如下&#xff1a; if 要判断的条件: 条件成立时&#xff0c;…

EasyCVR智能边缘网关用户信息泄漏漏洞

EasyCVR智能边缘网关用户信息泄漏漏洞 免责声明漏洞描述漏洞影响漏洞危害网络测绘Fofa: title"EasyCVR" 漏洞复现1. 构造poc2. 获取管理员账户密码3. 登录后台 免责声明 仅用于技术交流,目的是向相关安全人员展示漏洞利用方式,以便更好地提高网络安全意识和技术水平…

车载终端构筑智慧工厂:无人配送车的高效物流体系

​随着科技的不断进步和应用&#xff0c;智能化已经成为许多领域的关键词。在物流行业中&#xff0c;随着无人配送车的兴起和智慧工厂的崛起&#xff0c;车载终端正引领着无人配送车的科技变革之路。 文章同款&#xff1a;https://www.key-iot.com/iotlist/sv900.html 车载终端…

springboot+vue基于hive旅游数据的分析与应用【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

成本中心修改后推送其他SAP系统更新成本中心(ALE)

成本中心修改后推送给其他系统 KSH2成本中心组新增成本中心&#xff08;服务器A 400client&#xff09; KAVB 输入成本中心组、控制范围、目标系统 Y 查看&#xff08;服务器B 430client&#xff09;

ubuntu 开机进入 advanced 选项 可选择内核 kernel

Ubuntu版本为22.04 1 .首先再命令窗口&#xff0c;输入 sudo gedit /etc/default/grub 命令打开grub配置文件 2.1 具体操作&#xff1a; 将 GRUB_TIMEOUT_STYLEhidden 注释掉 将 GRUB_TIMEOUT的值改为20&#xff08;界面引导显示时间&#xff09; 将GRUB_CMDLINE_LINUX_DEFA…

S32K312 DTCM在代码中使用示例

TCM是一种被直接集成在CPU芯片中的高速缓存&#xff0c;TCM又分为ITCM&#xff08;Instruction TCM&#xff09;和DTCM&#xff08;Data TCM&#xff09;。ITCM是用来存储代码段的&#xff0c;DTCM是用来存储数据的。 为什么要使用DTCM来存储数据&#xff1f;1&#xff09;频繁…

APP攻防--签名组件权限

前言 上文说到了反编译的方式&#xff0c;这期就深入到APP内部&#xff0c;即客户端安全。 安装包签名 在Android操作系统中&#xff0c;每个应用程序&#xff08;APP&#xff09;安装包&#xff08;APK&#xff09;都必须经过数字签名&#xff0c;以确保应用的完整性和来源…

【从删库到跑路】详解MySQL数据库的视图以及相关操作

&#x1f38a;专栏【MySQL】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f970;欢迎并且感谢大家指出小吉的问题 文章目录 &#x1f384;视图介绍&#x1f384;视图特点&#x1f33a;基本操作⭐创建视图⭐查询…