当前位置: 首页 > news >正文

wpf加载带材料的3D模型(下载的3D预览一样有纹理)

背景:最近真的是忙啊,累出汁水了

整体效果:

放大可以看清砖头:

1、需要自己准备好3D模型,比如我这里是下载的这里的3D Warehouse,下载Collada File格式文件

2、解压可以看到一个model.dae和材料的文件夹,如果只是使用这个3D的结构不需要图片的材料就直接导入blender然后导出.obj就拿去用就行了。但是如果想要在WPF中也加载这些材料出来就需要在导出的时候勾选材料,然后路径选择相对(好像这个相对的没有什么作用)

3、然后就可以看到导出的内容有文件和一个.obj、一个.mtl

4、关键来了,这个.mtl文件就是决定包含什么材料

        如果材料想要放到两个文件的同一个文件夹就将.mtl中的对应的两行改为

map_Kd ./__Brick-dark_grout_.jpg
map_Kd ./__Metal-floor_.jpg

        如果是想要跟我图片那样用一个文件夹存材料图片就将.mtl文件对应的两行修改为

map_Kd ./textures/__Brick-dark_grout_.jpg
map_Kd ./textures/__Metal-floor_.jpg

将这些加到项目后还需要将材料和两个文件修改为(不然运行报错)

5、然后就是正常载入这个.obj就可以看见跟下载预览一样的3D了

        xaml(有点乱,有些没相关的东西没删除):

<ht:HelixViewport3D Name="viewport" ShowCoordinateSystem="True"><!--相机--><ht:HelixViewport3D.Camera><PerspectiveCamera Position="100,100,100"LookDirection="-100,-100,-100"UpDirection="0,0,1"FieldOfView="80"></PerspectiveCamera></ht:HelixViewport3D.Camera><ht:HelixViewport3D.RotateGesture><MouseGesture MouseAction="LeftClick"/></ht:HelixViewport3D.RotateGesture><ht:HelixViewport3D.PanGesture><MouseGesture MouseAction="RightClick"/></ht:HelixViewport3D.PanGesture><!--光源--><!--<ht:DefaultLights/>--><ModelVisual3D><ModelVisual3D.Content><Model3DGroup><!--环境光:提亮整体的环境亮度--><AmbientLight Color="#999"/><!--点光源:光影层次感--><PointLight Color="#DDD" Position="100,0,100"/></Model3DGroup></ModelVisual3D.Content></ModelVisual3D><!--模型--><ModelUIElement3D Visibility="Collapsed"><ModelUIElement3D.Model><Model3DGroup><GeometryModel3D><!--模型的点线面--><GeometryModel3D.Geometry><MeshGeometry3D Positions="2,-2,4   2,2,4   2,2,0   2,-2,0-2,-2,4   -2,2,4   -2,2,0   -2,-2,0"TriangleIndices="0,2,1   0,3,24,0,1   4,1,51,2,6   1,6,55,6,7   5,7,44,7,3   4,3,03,6,2   3,7,6"/></GeometryModel3D.Geometry><GeometryModel3D.Material><DiffuseMaterial Brush="Orange"/></GeometryModel3D.Material><GeometryModel3D.BackMaterial><DiffuseMaterial Brush="Red"/></GeometryModel3D.BackMaterial></GeometryModel3D></Model3DGroup></ModelUIElement3D.Model></ModelUIElement3D><ModelUIElement3D Visibility="Collapsed"><ModelUIElement3D.Transform><TranslateTransform3D OffsetZ="4"/></ModelUIElement3D.Transform><ModelUIElement3D.Model><GeometryModel3D><GeometryModel3D.Geometry><!--Positions="1,-1,6  1,1,6  1,1,4  1,-1,4-1,-1,6  -1,1,6  -1,1,4  -1,-1,4"--><MeshGeometry3D Positions="1,-1,2  1,1,2  1,1,0  1,-1,0-1,-1,2  -1,1,2  -1,1,0  -1,-1,0"TriangleIndices="0,2,1   0,3,24,0,1   4,1,51,2,6   1,6,55,6,7   5,7,44,7,3   4,3,03,6,2   3,7,6"/></GeometryModel3D.Geometry><GeometryModel3D.Material><DiffuseMaterial Brush="LavenderBlush"/></GeometryModel3D.Material></GeometryModel3D></ModelUIElement3D.Model></ModelUIElement3D></ht:HelixViewport3D>

code_hehind:

#region 带材料的一个房屋string path = Environment.CurrentDirectory;
path = System.IO.Path.Combine(path, "3d导出", "test1.obj");path = System.IO.Path.Combine(Environment.CurrentDirectory, "3d导出", "test2.obj");ModelImporter modelImporter = new ModelImporter();Model3DGroup group = modelImporter.Load(path);// 创建Transform3D对象,沿Y轴(或Z轴)进行平移
Transform3DGroup transformGroup = new Transform3DGroup();
TranslateTransform3D translate = new TranslateTransform3D(15, 20, 26); // 调整Y轴或Z轴的数值
transformGroup.Children.Add(translate);// 旋转
RotateTransform3D rotateX = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(1, 0, 0), 90)); // 沿X轴旋转90度
//RotateTransform3D rotateY = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), 90)); // 沿Y轴旋转90度
transformGroup.Children.Add(rotateX);
//transformGroup.Children.Add(rotateY);group.Transform = transformGroup;ModelVisual3D modelVisual3D = new ModelVisual3D();
modelVisual3D.Content = group;
viewport.Children.Add(modelVisual3D);#endregion

地面的代码(有点简陋):

private void CreateGround()
{ModelUIElement3D elemet = new ModelUIElement3D();GeometryModel3D model = new GeometryModel3D();model.Material = MaterialHelper.CreateMaterial(Brushes.LightGray, null, null, 1);model.BackMaterial = MaterialHelper.CreateMaterial(Brushes.LightGray, null, null, 1);// 地平面var builder = new MeshBuilder(false, false);builder.AddQuad(new Point3D(100, 100, 0),new Point3D(-100, 100, 0),new Point3D(-100, -100, 0),new Point3D(100, -100, 0));model.Geometry = builder.ToMesh(true);elemet.Model = model;this.viewport.Children.Add(elemet);
}

相关文章:

wpf加载带材料的3D模型(下载的3D预览一样有纹理)

背景&#xff1a;最近真的是忙啊&#xff0c;累出汁水了 整体效果&#xff1a; 放大可以看清砖头&#xff1a; 1、需要自己准备好3D模型&#xff0c;比如我这里是下载的这里的3D Warehouse&#xff0c;下载Collada File格式文件 2、解压可以看到一个model.dae和材料的文件夹&…...

【k8s之深入理解调度】调度框架扩展点理解

参考自 K8s 调度框架设计与 scheduler plugins 开发部署示例&#xff08;2024&#xff09; 调度插件扩展点 等待调度阶段PreEnqueuePod 处于 ready for scheduling 的阶段。 内部工作原理&#xff1a;sig-scheduling/scheduler_queues.md。在 Pod 被放入调度队列之前执行的插…...

音视频基础理论

1. 音频基础 1.1 音频基本概念 1.1 频率&#xff1a;声波的频率&#xff0c;即声音的音调&#xff0c;人类听觉的频率(音调)范围为20Hz--20KHz 1.2 振幅&#xff1a;即声波的响度&#xff0c;通俗的讲就是声音的高低&#xff0c;一般男生的声音振幅(响度)大于女生。 1.3 波形…...

《江苏科技大学学报(自然科学版)》

《江苏科技大学学报&#xff08;自然科学版&#xff09;》&#xff08;双月刊&#xff0c;国内外公开发行&#xff09;是由江苏省教育厅主管、江苏科技大学主办的理工类学术期刊&#xff0c;1986年创刊&#xff0c;国际刊号&#xff1a;ISSN1673-4807&#xff0c;国内刊号&…...

C++初学者指南-5.标准库(第二部分)–随机数生成

C初学者指南-5.标准库(第二部分)–随机数生成 文章目录 C初学者指南-5.标准库(第二部分)–随机数生成基本概念例子统一随机数布尔值&#xff08;“抛硬币”&#xff09;正态分布具有独立概率的整数 怎么做种子引擎使用自定义生成器 shuffle算法分布类型概述通用接口均匀分布采样…...

Unity2017在安卓下获取GPS位置时闪退的解决办法

在Unity使用低功耗蓝牙通信&#xff08;BLE&#xff09;需要用到设备的位置信息。但是调用Input.location.Start()程序会闪退。 解决办法&#xff1a;调用原生安卓接口。 参见《Unity2021通过aar调用Android方法》编写一个aar插件gpsplugin&#xff0c;在插件中提供获取GPS位…...

OpenGL ES 索引缓冲区(4)

OpenGL ES 索引缓冲区(4) 简述 本节会介绍索引缓冲区&#xff0c;索引缓冲区和顶点缓冲区类似&#xff0c;也是显存上的一段内存&#xff0c;只不过上面的数据用处不同&#xff0c;索引缓冲区故名思义里面的数据是用于索引&#xff0c;主要作用是用于复用顶点缓冲区里的数据。…...

01:(寄存器开发)点亮一个LED灯

寄存器开发 1、单片机的简介1.1、什么是单片机1.2、F1系列内核和芯片的系统架构1.3、存储器映像1.4、什么是寄存器 2、寄存器开发模板工程3、使用寄存器点亮一个LED4、代码改进15、代码改进2 本教程使用的是STM32F103C8T6最小系统板&#xff0c;教程来源B站up“嵌入式那些事”。…...

.Net 6.0 Windows平台如何判断当前电脑是否联网

最近在工作中开发需要判断当前电脑是否联网的需求&#xff0c;在网上找了一个调用window API来判断本机是否联网。具体请看下面介绍&#xff1a; 1.方法一&#xff08;调用winAPI&#xff09; [DllImport("wininet")] public static extern bool InternetGetConnec…...

微软准备了 Windows 11 24H2 ISO “OOBE/BypassNRO“命令依然可用

Windows 11 24H2 可能在未来几周内开始推出。 微软已经要求 OEM 遵循新的指南准备好 Windows 11 24H2 就绪的驱动程序&#xff0c;并且现在已经开始准备媒体文件 (.ISO)。 OEM ISO 的链接已在微软服务器上发布。 一个标有"X23-81971_26100.1742.240906-0331.ge_release_sv…...

MacOS 终端执行安装 Brew

在配置新的 Mac 环境时&#xff0c;如果你发现终端中无法识别 brew 命令&#xff0c;可以按照以下步骤进行解决。 步骤 1&#xff1a;确保网络稳定 为了避免安装过程中出现中断&#xff0c;建议使用 Wi-Fi 或有线连接&#xff0c;不推荐使用移动网络。 步骤 2&#xff1a;打…...

【设计模式-解释模式】

定义 解释器模式是一种行为设计模式&#xff0c;用于定义一种语言的文法&#xff0c;并提供一个解释器来处理该语言的句子。它通过为每个语法规则定义一个类&#xff0c;使得可以将复杂的表达式逐步解析和求值。这种模式适用于需要解析和执行语法规则的场景。 UML图 组成角色…...

51单片机应用开发(进阶)---数码管+按键+蜂鸣器(电磁炉显示模拟)

实现目标 1、加强数码管、按键的学习&#xff0c;实现数码显示变量数据&#xff08;四位数的显示&#xff09;&#xff1b; 2、4位数码2个按键无源蜂鸣器实现模拟电磁炉功率调节及显示&#xff1b; 一、内容描述 功能描述&#xff1a;1、开机显示电磁炉功率300&#xff0c;每…...

Emergency Stop (ES)

文章目录 1. 介绍2. Feature List3. 紧急停止信号触发方式3.1 Port触发紧急停止信号3.2 SMU事件触发紧急停止信号3.3 软件触发紧急停止信号 4. 应用场景4.1 Port4.2 MSC 1. 介绍 Emergency Stop (ES)是Ifx System Control Units (SCU)六大模块之一。详细信息可以参考Infineon-…...

[C++][第三方库][gtest]详细讲解

目录 1.介绍2.安装3.使用1.头文件包含2.框架初始化接口3.调用测试样例4.TEST宏5.断言宏6.示例 1.介绍 gtest是一个跨平台的C单元测试框架&#xff0c;由Google公司发布gtest是为了在不同平台上为编写C单元测试而生成的&#xff0c;它提供了丰富的断言、致命和非致命判断、参数…...

【Java数据结构】 链表

【本节目标】 1. ArrayList 的缺陷 2. 链表 3. 链表相关 oj题目 一. ArrayList的缺陷 上节课已经熟悉了ArrayList 的使用&#xff0c;并且进行了简单模拟实现。通过源码知道&#xff0c; ArrayList 底层使用数组来存储元素&#xff1a; public class ArrayList<E>…...

前端——Ajax和jQuery

一、Ajax Ajax即“Asynchronous Javascript And XML”&#xff08;异步 JavaScript 和 XML&#xff09;&#xff0c; 通过 JS 异步的向服务器发送请 求并接收响应数据。 同步访问&#xff1a;当客户端向服务器发送请求时&#xff0c;服务器在处理的过程中&#xff0c;浏览器…...

C++-vector模拟实现

###vector底层相当于是数组&#xff0c;查看源码可以发现&#xff0c;这个类的私有成员变量是三个迭代器&#xff1b;在实现时迭代器就可以当作是vector里面的元素的指针类型&#xff1b; ###vector是一个类模板&#xff0c;实现时也应当按照这样的写法用一个模板去实现&#…...

Activity

69[toc] 1.启停活动页面 1.Activity启动和结束 从当前页面跳到新页面 startActivity(new Intent(this, ActFinishActivity.class));从当前页面返回上一个页面&#xff0c;相当于关闭当前页面 finish();2.Activity生命周期 官方描述生命周期 onCreate&#xff1a;创建活…...

【力扣 | SQL题 | 每日四题】力扣1581, 1811, 1821, 1831

今天的题目就1811这个比较难&#xff0c;其他非常的基础。 1. 力扣1581&#xff1a;进店却未进行过交易的顾客 1.1 题目&#xff1a; 表&#xff1a;Visits ---------------------- | Column Name | Type | ---------------------- | visit_id | int | | customer…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...