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

news2024/11/26 5:55:49

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

整体效果:

放大可以看清砖头:

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,2
                                                     4,0,1   4,1,5
                                                     1,2,6   1,6,5
                                                     5,6,7   5,7,4
                                                     4,7,3   4,3,0
                                                     3,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,2
                     4,0,1   4,1,5
                     1,2,6   1,6,5
                     5,6,7   5,7,4
                     4,7,3   4,3,0
                     3,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);
}

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

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

相关文章

SAP HCM 抓取模拟工资核算日志RT表数据

一&#xff1a;故事背景 SAP的核算其实比较麻烦的就是没地方可以导出核算成功的人员编号&#xff0c;即使能导出也是树形的结构&#xff0c;需要反复加工多次才能整理好员工&#xff0c;所以非常麻烦&#xff0c;今天就想能不能抓取模拟工资的rt表数据. 二&#xff1a;解决办法…

【项目记录】llama-7B基于llama.cpp在Qemu-riscv64向量扩展指令下的部署

概述 参考博客链接&#xff1a; Accelerating llama.cpp with RISC-V Vector Extension 基于RVV的llama.cpp在Qemu上的演示 Github相关链接&#xff1a; Llama.cpp中利用GGML中对RVV的支持1 Llama.cpp中利用GGML中对RVV的支持2 llama.cpp工程 2024/10/02: 工具准备OK&#…

Log4j的配置与使用详解

Log4j的配置与使用详解 Log4j介绍 Log4j是Apache的一个开源项目&#xff0c;通过使用Log4j&#xff0c;我们可以控制日志信息输送的目的地是控制台、文件、GUI组件&#xff0c;我们可以控制每条日志的输出格式&#xff1b;只需要通过一个配置文件就可以灵活的配置&#xff0c…

Android SystemUI组件(11)SystemUIVisibility解读

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节思维导图&#xff0c;主要关注左侧最上方SystemUiVisibility解读部分即可。 本章节主要讲解SystemUiVisibility的概念及其相…

【EXCEL数据处理】000015案例 EXCEL公式与基础函数

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000015案例 EXCEL公式与基础函数。使用的软件&#x…

基础岛第3关:浦语提示词工程实践

模型部署 使用下面脚本测试模型 from huggingface_hub import login, snapshot_download import osos.environ[HF_ENDPOINT] https://hf-mirror.comlogin(token“your_access_token")models ["internlm/internlm2-chat-1_8b"]for model in models:try:snapsh…

Java--IO基本流

IO流 概述 生活中&#xff0c;你肯定经历过这样的场景。当你编辑一个文本文件&#xff0c;忘记了ctrls &#xff0c;可能文件就白白编辑了。当你电脑上插入一个U盘&#xff0c;可以把一个视频&#xff0c;拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢&#xff1f;键盘…

昇思MindSpore进阶教程--二阶优化器THOR

大家好&#xff0c;我是刘明&#xff0c;明志科技创始人&#xff0c;华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享&#xff0c;如果你也喜欢我的文章&#xff0c;就点个关注吧 正文介绍 深度学习训练过程可以看成损失…

Neo4j CQL语句 使用教程

CREATE命令 : CREATE (<node-name>:<label-name>{ <Property1-name>:<Property1-Value>........<Propertyn-name>:<Propertyn-Value>} )字段说明 CREATE (dept:Dept { deptno:10,dname:“Accounting”,location:“Hyderabad” })&#…

ATLAS/ICESat-2 L3B 每 3 个月网格动态海洋地形图 V001

目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATLAS/ICESat-2 L3B Monthly 3-Month Gridded Dynamic Ocean Topography V001 ATLAS/ICESat-2 L3B 每月 3 个月网格动态海洋地形图 V001 简介 该数据集包含中纬度、北极和南极网格上动态海洋地形&…

[Offsec Lab] ICMP Monitorr-RCE+hping3权限提升

信息收集 IP AddressOpening Ports192.168.52.218TCP:22,80 $ nmap -p- 192.168.52.218 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.9p1 Debian 10deb10u2 (protocol 2.0) | ssh-hostkey: | 2048 de:b5:23:89:bb:9f:d4:1…

Kubernetes-Kind篇-01-kind搭建测试集群

1、Kind 介绍 官方文档地址&#xff1a;https://kind.sigs.k8s.io/ github仓库地址&#xff1a;https://github.com/kubernetes-sigs/kind 国内镜像仓库地址&#xff1a;https://gitcode.com/gh_mirrors/ki/kind/overview kind 是一种使用 Docker 容器 nodes 运行本地 Kubern…

算法日记-链表翻转

文章目录 场景&#xff1a;解法一&#xff1a;迭代步骤完整代码 解法二&#xff1a;递归步骤完整代码 重温力扣常规算法&#xff0c;记录算法的演变&#xff0c;今天介绍的是链表翻转 场景&#xff1a; 现在有一条单项链表&#xff0c;链表节点存在一个数据和指向下一个节点的…

MySQL--三大范式(超详解)

目录 一、前言二、三大范式2.1概念2.2第一范式&#xff08;1NF&#xff09;2.3第二范式&#xff08;2NF&#xff09;2.3第三范式&#xff08;3NF&#xff09; 一、前言 欢迎大家来到权权的博客~欢迎大家对我的博客进行指导&#xff0c;有什么不对的地方&#xff0c;我会及时改进…

AI不可尽信

看到某项目有类似这样的一段代码 leaves : make([]int, 10) leaves leaves[:0]没理解这样的连续两行,有何作用? 初始化一个长度和容量都为10的切片,接着把切片长度设置为0 即如下demo: (在线地址) package mainimport "fmt"func main() {leaves : make([]int, 1…

【2023工业3D异常检测文献】CPMF: 基于手工制作PCD描述符和深度学习IAD结合的AD方法

Complementary Pseudo Multimodal Feature for Point Cloud Anomaly Detection 1、Background 早期的点云异常检测(PCD)表示是手工制作的&#xff0c;依赖于启发式设计。随着深度学习的发展&#xff0c;最近的方法采用了基于学习的PCD特征。尽管与基线相比有相当大的改进&…

欧几里得算法--(密码学基础)

根基&#xff1a;gcd(a,b)gcd(b,a mod b) 先举个例子吧&#xff0c;gcd(16,6)gcd(6,4)gcd(4,2)gcd(2,0)2 学习这个定理的时候我想了几个问题. 第一个问题&#xff1a;为什么求出的就一定是他们两个数的公约数&#xff1f; 这个问题很简单我们只需要通过几何来计较即可&#x…

MyBatis——ORM

MyBatis——ORM 验证映射配置ResultType本质是ResultMap具体的转换逻辑 概括的说&#xff0c;MyBatis中&#xff0c;对于映射关系的声明是由开发者在xml文件手动完成的。比如对查询方法而言&#xff0c;你需要显式声明ResultType或ResultMap&#xff0c;这里其实就是在定义数据…

Java JUC(三) AQS与同步工具详解

Java JUC&#xff08;三&#xff09; AQS与同步工具详解 一. ReentrantLock 概述 ReentrantLock 是 java.util.concurrent.locks 包下的一个同步工具类&#xff0c;它实现了 Lock 接口&#xff0c;提供了一种相比synchronized关键字更灵活的锁机制。ReentrantLock 是一种独占…

【Kubernetes】常见面试题汇总(五十三)

目录 118. pod 状态为 ErrlmagePull &#xff1f; 119.探测存活 pod 状态为 CrashLoopBackOff &#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。…