首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

UWP 3d模型加载

在 UWP(Universal Windows Platform)应用中加载和显示 3D 模型可以使用 Windows.UI.Xaml.Controls 命名空间中的 Model3DViewport3D 控件。以下是一个基本的示例,展示如何在 UWP 应用中加载和显示 3D 模型。

前提条件

  1. 安装 Visual Studio:确保你已经安装了支持 UWP 开发的 Visual Studio。
  2. 创建 UWP 项目:创建一个新的 UWP 项目。

步骤 1: 添加 3D 模型文件

将你的 3D 模型文件(例如 .obj.fbx 等)添加到项目中。你可以将文件放在项目的 Assets 文件夹中。

步骤 2: 配置 XAML 文件

MainPage.xaml 中添加 SwapChainPanelViewport3D 控件,用于显示 3D 模型。

代码语言:javascript
复制
<Page
    x:Class="YourNamespace.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:YourNamespace"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <SwapChainPanel x:Name="swapChainPanel" />
    </Grid>
</Page>

步骤 3: 配置 C# 代码

MainPage.xaml.cs 中编写代码,加载和显示 3D 模型。

代码语言:javascript
复制
using System;
using System.Numerics;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
using Microsoft.Graphics.Canvas;
using Microsoft.Graphics.Canvas.UI.Composition;
using Microsoft.Graphics.Canvas.UI.Xaml;
using Windows.UI.Composition;
using Windows.UI.Xaml.Hosting;

namespace YourNamespace
{
    public sealed partial class MainPage : Page
    {
        private Compositor _compositor;
        private ContainerVisual _root;
        private CompositionTarget _target;
        private CanvasDevice _device;
        private CompositionGraphicsDevice _compositionGraphicsDevice;
        private CanvasSwapChain _swapChain;

        public MainPage()
        {
            this.InitializeComponent();
            this.Loaded += MainPage_Loaded;
        }

        private void MainPage_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
        {
            _compositor = Window.Current.Compositor;
            _root = _compositor.CreateContainerVisual();
            _target = ElementCompositionPreview.GetElementVisual(swapChainPanel);
            _target.Children.InsertAtTop(_root);

            _device = CanvasDevice.GetSharedDevice();
            _compositionGraphicsDevice = CanvasComposition.CreateCompositionGraphicsDevice(_compositor, _device);

            _swapChain = new CanvasSwapChain(_device, (float)swapChainPanel.ActualWidth, (float)swapChainPanel.ActualHeight, 96);
            var swapChainBrush = _compositor.CreateSurfaceBrush(CanvasComposition.CreateCompositionSurfaceForSwapChain(_compositor, _swapChain));
            var spriteVisual = _compositor.CreateSpriteVisual();
            spriteVisual.Brush = swapChainBrush;
            spriteVisual.Size = new Vector2((float)swapChainPanel.ActualWidth, (float)swapChainPanel.ActualHeight);
            _root.Children.InsertAtTop(spriteVisual);

            Load3DModel();
        }

        private async void Load3DModel()
        {
            // 加载 3D 模型
            var loader = new Windows.ApplicationModel.Resources.Core.ResourceLoader();
            var uri = new Uri(loader.GetString("ms-appx:///Assets/YourModel.fbx"));
            var storageFile = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(uri);

            var device = CanvasDevice.GetSharedDevice();
            var model = await CanvasModel.LoadAsync(device, storageFile);

            // 渲染 3D 模型
            using (var ds = _swapChain.CreateDrawingSession(Windows.UI.Colors.Transparent))
            {
                ds.Clear(Windows.UI.Colors.Transparent);
                ds.DrawModel(model, new Vector3(0, 0, 0), new Vector3(1, 1, 1), Quaternion.Identity);
            }

            _swapChain.Present();
        }
    }
}

解释

  1. SwapChainPanel:用于显示 3D 内容的面板。
  2. Compositor:用于创建和管理视觉效果的对象。
  3. CanvasDevice:表示用于绘制的设备。
  4. CanvasSwapChain:用于呈现内容的交换链。
  5. CanvasModel:表示 3D 模型。

注意事项

  • 模型格式:确保你的 3D 模型格式是 UWP 支持的格式(例如 .fbx)。
  • 模型路径:确保模型文件路径正确。
  • 性能优化:对于复杂的 3D 模型和场景,可能需要进行性能优化。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

OpenGL 3D 模型加载和渲染

这时候就可以使用 OpenGL 来加载 3D 模型。先使用 3D 建模工具构建物体,然后再将物体导出成特定的文件格式,最终通过 OpenGL 渲染模型。 例如如下的 3D 模型文件图像: ?...Obj 模型文件 obj 模型文件是众多 3D 模型文件中的一种,它的格式比较简单,本质上就是文本文件,只是格式固定了格式。...加载 Obj 模型文件 明白了 Obj 模型文件代表的含义,接下来把它加载并用 OpenGL 进行渲染。...Obj 模型文件实质上也就是文本文件了,通过读取每一行来进行加载即可,假设加载的模型文件只有顶点坐标,实际代码如下: 1 // 加载所有的顶点坐标数据,把 List 容器的 index...最后,加载 3D 模型就先了解到这了,如果想要加载更多效果,倒是可以继续深挖,只是没有 MAC 版本的 3ds Max 软件,却是少了一些乐趣~~ 具体代码详情,可以参考我的 Github 项目: https

3.2K21
  • win10 uwp 发布旁加载自动更新 总结

    但是做出来 UWP 应用还是需要用户能用,经过了很长的时间,和很多大佬聊了之后,终于对新的项目使用旁加载的方式,使用自己的服务器提供下载更新 本文告诉大家如何搭建一个 asp dotnet core 服务器...,将一个 UWP 程序使用旁加载发布,同时支持自动更新 首先创建一个简单的 UWP 程序,这个程序显示当前的包的版本,通过程序的包的版本就可以知道是否更新成功。...虽然旁加载对于证书不是很友好,但是因为我的应用都是预装的,本来的两大问题一个就是自动更新问题,另一个是从应用商店下载的问题,通过预装可以解决应用商店下载问题。...因为他需要先下载证书,在使用旁加载就需要手动安装证书,因为测试程序使用的证书是不可信的,点击其他链接,下载证书 ? 打开证书,然后点击安装证书,选放在本地计算机 ?...看起来自己做一个服务器让用户安装 UWP 程序还是很简单的 但是有一个问题是 UWP 如何知道可以更新了?

    1.6K30

    TensorFlow模型持久化~模型加载

    前面提到保存模型时候的变量参数是依附在计算图的结构上的,但此时我们仅仅将保存模型的变量参数加载进来,并没有加载模型的计算图,所以如果我们想要正常的加载保存模型的变量参数的话,就需要定义一个和保存模型时候一模一样的计算图结构...也就是说保存模型的时候,已经对变量进行初始化了,所以不需要在加载模型的时候进行全局变量的初始化操作了。...下面交换显示的全局初始化变量与加载模型代码交换: ?...仅加载模型中保存的变量 前面说了很多关于加载变量,下面说一说如何加载模型。如果不希望在加载模型的时候重复定义计算图,可以直接加载已经持久化的图。...对于加载模型的操作TensorFlow也提供了很方便的函数调用,我们还记得保存模型时候将计算图保存到.meta后缀的文件中。那此时只需要加载这个文件即可: ?

    76300

    WebGL加载本地模型

    前言 大部分的webgl框架,比如threejs和babylon等,都可以加载obj和gltf模型。...我们的引擎,基于three封装,同样有加载模型的loader,因此加载obj和gltf模型也是很简单就可以实现的。 不过加载文件都是在线的文件,也就是通过url的形式进行加载。...团队开发的三维可视化平台框架,需要能够上传obj和gltf等格式的模型,在上传前,需要先对模型预览,这就涉及到如何加载本地模型的问题了。 加载本地模型 本文以gltf为例,进行说明。...加载本地模型的思路是这样的: 既然引擎可以通过url的机制,加载模型。 那么如果有一种机制,可以把本地文件及其关联的资源(比如贴图)等转换成url的形式,就可以进行使用loader进行访问了。...加载本地模型 有了上述基础知识,大致的思路就出来了: 首先 加载本地文件,读取file对象(可能是多个File对象,因为一个模型可能包括多个资源文件)。

    1.9K30

    3d Tiles 加载调度原理分析

    作者:迷途的小书童 微信公众号:g0415shenweri 转载声明 3dtiles协议具备了超大规模的数据加载调度的能力。本人分析了cesium的源码,结合自己的理解总结了一下加载调度的实现。...3dtiles的数据结构 3dtiles是金字塔状的层次结构,最上层是不太精细的数据,越到下层模型数据越精细,渲染成本越高。一般根据视口离tile的远近来加载不同的层级。 ?...数据加载状态,我们通过下面几种状态来覆盖全部:只有当LoadState为ContentLoaded的时候,tile才能够被渲染出来。...tile没有被渲染,但是其child有被渲染 Unrefined:表示当前tile没有被渲染,其child也没有被渲染,其parent有被渲染 这里解释下英文:Regined表示精细的,即其有更精细的模型被渲染...UnRegined表示非精细的,即其不精细的模型被渲染,我们用来表示当前tile的parent被渲染出来。 上面4种状态,可以描述任何一个tile当前的状态情况。

    1.8K20

    PyTorch 实战(模型训练、模型加载、模型测试)

    本次将一个使用Pytorch的一个实战项目,记录流程:自定义数据集->数据加载->搭建神经网络->迁移学习->保存模型->加载模型->测试模型 自定义数据集 参考我的上一篇博客:自定义数据集处理 数据加载...shape) optimizer = optim.Adam(model.parameters(), lr=lr) criteon = nn.CrossEntropyLoss() 保存、加载模型...pytorch保存模型的方式有两种: 第一种:将整个网络都都保存下来 第二种:仅保存和加载模型参数(推荐使用这样的方法) # 保存和加载整个模型 torch.save(model_object..., 'model.pkl') model = torch.load('model.pkl') # 仅保存和加载模型参数(推荐使用) torch.save(model_object.state_dict(...model.pkl则是第一种方法保存的 [在这里插入图片描述] 测试模型 这里是训练时的情况 [在这里插入图片描述] 看这个数据准确率还是不错的,但是还是需要实际的测试这个模型,看它到底学到东西了没有

    2.5K20

    win10 uwp 通过命令行脚本开启旁加载

    在 UWP 旁加载安装,需要用户的设备上开启旁加载功能,这个功能需要点击设置,点击更新,找到开发者选项,点击开启旁加载。这对用户来说要安装一个应用需要点这么多步骤,基本上很少用户能成功。...本文告诉大家如何通过命令行或通过脚本的方式协助用户开启旁加载的功能 在 win10 的旁加载其实就是写入注册表,允许所有应用信任安装,所以只需要通过命令行写入注册表就可以 通过调用 reg 写入注册表,...New-ItemProperty -Path $registryPath -Name $name1 -Value $value1 -PropertyType DWORD -Force 上面是开启旁加载的脚本...New-ItemProperty -Path $registryPath -Name $name2 -Value $value2 -PropertyType DWORD -Force 通过命令行开启旁加载之后就可以安装旁加载应用...开启旁加载可以使用 通过win32安装UWP应用 博客说的将 UWP 应用通过win32安装包给用户,解决应用商店下载 Powershell script to Enable Sideloading

    62420

    ue4动态加载模型(unity资源加载)

    需要注意的几点: 1.调试环境下进行的资源加载方式到打包出来后不一定能够使用。.../RuntimeActor/RuntimeCameraBP.RuntimeCameraBP_C"; 2>使用UE4编辑器的Copy Reference即可,除了蓝图类要加 _C 其他的资源应该都可以加载...关于动态资源生成的几种方式 资源加载远不止我列出这几种方式,会有更多。 1>代码方式如何Spawn蓝图类?...1 如何非构造函数方式加载一个uasset(直接代码写中文以及中文图片的命名方式的习惯不好,不要学我) //静态方法, 加载uasset的资源,比如UI贴图等。...//.h中声明一下 加载一个蓝图类 UPROPERTY() TSubclassOf BP_1; //构造函数中实现, 加载一个蓝图类 BP_1 = LoadClass<AActor

    1.5K10

    ClassLoader 类加载器模型

    一、 类加载器 ClassLoader即常说的类加载器,其功能是用于从Class文件加载所需的类,主要场景用于热部署、代码热替换等场景。...throw new Error(oops); } } } sclSet = true; } } 二、双亲委派模型...ClassLoader的双亲委派模型中,各个ClassLoader之间的关系是通过组合关系来复用父加载器。...类加载器的层级查找顺序依次为:启动类加载器,扩展类加载器,系统类加载器。系统类加载器是默认的应用程序类加载器。...这样的好处是不同层次的类加载器具有不同优先级,比如所有Java对象的超级父类java.lang.Object,位于rt.jar,无论哪个类加载器加载该类,最终都是由启动类加载器进行加载,保证安全。

    43640

    PyTorch模型的保存加载

    PyTorch提供了两种主要的方法来保存和加载模型,分别是直接序列化模型对象和存储模型的网络参数。...这种方法可以方便地保存和加载整个模型,包括其结构、参数以及优化器等信息。...='cpu', pickle_module=pickle) 在使用 torch.save() 保存模型时,需要注意一些关于 CPU 和 GPU 的问题,特别是在加载模型时需要注意 : 保存和加载设备一致性...移动模型到 CPU: 如果你在 GPU 上保存了模型的 state_dict,并且想在 CPU 上加载它,你需要确保在加载 state_dict 之前将模型移动到 CPU。...移动模型到 GPU: 如果你在 CPU 上保存了模型的 state_dict,并且想在 GPU 上加载它,你需要确保在加载 state_dict 之前将模型移动到 GPU。

    32110

    模型保存,加载和使用

    [阿里DIN] 模型保存,加载和使用 0x00 摘要 Deep Interest Network(DIN)是阿里妈妈精准定向检索及基础算法团队在2017年6月提出的。...本文是系列第 12 篇 :介绍DIN模型的保存,加载和使用。 0x01 TensorFlow模型 1.1 模型文件 TensorFlow模型会保存在checkpoint相关文件中。...当某个保存的TensorFlow模型文件被删除时,这个模型所对应的文件名也会从checkpoint文件中删除。...它先加载模型文件; 提供checkpoint文件地址后,它从checkpoint文件读取权重数据初始化到模型里的权重变量; 将权重变量转换成权重常量 (因为常量能随模型一起保存在同一个文件里); 再通过指定的输出节点将没用于输出推理的...,我们在加载之后,打印出图中对应节点: graph = load_graph('.

    1.4K10
    领券