C#创建obj三维模型文件

news2024/11/23 2:09:32

介绍

使用开源库创建obj三维模型文件。
开源库地址:https://github.com/JeremyAnsel/JeremyAnsel.Media.WavefrontObj

相关API地址:https://jeremyansel.github.io/JeremyAnsel.Media.WavefrontObj/api/JeremyAnsel.Media.WavefrontObj.ObjFile.html

obj格式解读:https://blog.csdn.net/shebao3333/article/details/132094257

示例

效果图(灰色为外,红色为内):
在这里插入图片描述

测试代码:

            //面片1
            var face1Pts = new float[][]
            {
                new float[]{0,0,0},
                new float[]{0,1,0},
                new float[]{1,1,0},
                new float[]{1,0,0},
            };
            //面片2
            var face2Pts = new float[][]
            {
                new float[]{0,0,0},
                new float[]{1,0,0},
                new float[]{1,0,0.5f},
                new float[]{0,0,0.5f},
            };

            //面片3
            var face3Pts = new float[][]
            {
                new float[]{0,1,0},
                new float[]{0,1,0.5f},
                new float[]{1,1,0.5f},
                new float[]{1,1,0},
            };

            var obj = new ObjFile();

            //用组表示对象
            //第一个组有两个面
            var group1 = new ObjGroup("group1");
            obj.Groups.Add(group1);
            //添加点
            foreach (var pt in face1Pts)
            {
                obj.Vertices.Add(new ObjVertex(pt[0], pt[1], pt[2]));
            }
            //添加面
            var face = new ObjFace();//根据右手定则确定面片的正面(外面)
            face.Vertices.Add(new ObjTriplet(1, 0, 0));
            face.Vertices.Add(new ObjTriplet(2, 0, 0));
            face.Vertices.Add(new ObjTriplet(3, 0, 0));
            face.Vertices.Add(new ObjTriplet(4, 0, 0));
            face.ObjectName = "group1-face1";
            face.MapName = "group1-face1";
            face.MaterialName = "Wall";
            //面片添加到组里,也需要添加到obj的Faces集合中
            group1.Faces.Add(face);
            obj.Faces.Add(face);

            //第一个组的第二个面
            foreach (var pt in face2Pts)
            {
                obj.Vertices.Add(new ObjVertex(pt[0], pt[1], pt[2]));
            }
            var face2 = new ObjFace();
            face2.Vertices.Add(new ObjTriplet(5, 0, 0));
            face2.Vertices.Add(new ObjTriplet(6, 0, 0));
            face2.Vertices.Add(new ObjTriplet(7, 0, 0));
            face2.Vertices.Add(new ObjTriplet(8, 0, 0));
            face2.ObjectName = "group1-face2";
            face2.MapName = "group1-face2";
            face2.MaterialName = "Column";
            group1.Faces.Add(face2);
            obj.Faces.Add(face2);


            //创建第二个对象,第二个对象有一个面
            var group2 = new ObjGroup("group2");
            obj.Groups.Add(group2);
            foreach (var pt in face3Pts)
            {
                obj.Vertices.Add(new ObjVertex(pt[0], pt[1], pt[2]));
            }
            var face3 = new ObjFace();
            face3.Vertices.Add(new ObjTriplet(9, 0, 0));
            face3.Vertices.Add(new ObjTriplet(10, 0, 0));
            face3.Vertices.Add(new ObjTriplet(11, 0, 0));
            face3.Vertices.Add(new ObjTriplet(12, 0, 0));
            face3.ObjectName = "group2-face1";
            face3.MapName = "group2-face1";
            face3.MaterialName = "Window";
            group2.Faces.Add(face3);
            obj.Faces.Add(face3);
           
			//其他参数
            //face.LevelOfDetail = 2;
            //face.MapName = "c";
            //face.MaterialName = "d";
            //face.SmoothingGroupNumber = 10;
            //face.IsBevelInterpolationEnabled = true;
            //face.IsColorInterpolationEnabled = true;
            //face.IsDissolveInterpolationEnabled = true;
            obj.WriteTo("./Tmp.obj");

生成的obj文件内容:

v 0.000000 0.000000 0.000000
v 0.000000 1.000000 0.000000
v 1.000000 1.000000 0.000000
v 1.000000 0.000000 0.000000
v 0.000000 0.000000 0.000000
v 1.000000 0.000000 0.000000
v 1.000000 0.000000 0.500000
v 0.000000 0.000000 0.500000
v 0.000000 1.000000 0.000000
v 0.000000 1.000000 0.500000
v 1.000000 1.000000 0.500000
v 1.000000 1.000000 0.000000
g group1
o group1-face1
usemap group1-face1
usemtl Wall
f 1 2 3 4
o group1-face2
usemap group1-face2
usemtl Column
f 5 6 7 8
g group2
o group2-face1
usemap group2-face1
usemtl Window
f 9 10 11 12

补充:

  • 根据右手定则确定面片的正面(外面)
  • ObjectName、MapName、MaterialName的赋值可以注释跳过。

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

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

相关文章

【文献阅读】 The ITS Irregular Terrain Model(Longely-Rice模型)海上电波传播模型

前言 因为最近在做海上通信的一个项目,所以需要对海上的信道进行建模,所以才阅读到了这一篇文献,下面的内容大部分是我的个人理解,如有错误,请见谅。欢迎在评论区和我一起讨论。 Longely-Rice模型介绍 频率介于 20 …

Redis协议与异步方式

Rredis Pipeline redis pipeline 是一个客户端提供的机制,而不是服务端提供的; pipeline 不具备事务性; 目的:节约网络传输时间; 通过一次发送多次请求命令,从而减少网络传输的时间。 Redis发布订阅 为了支…

文件传送协议

壹、文件传输协议FTP 一、FTP简介 文件传送协议FTP曾是互联网上使用最广泛的协议; 在互联网发展的早期阶段,用FTP传送文件约占整个互联网的通信量的三分之一;知道1995年,www的通信量才首次超过FTP。 FTP实现的是通过网络实现异…

删除链表中等于给定值 val 的所有结点(三种方法深入解析)

又见面啦,接下来的链表相关Oj题目我会根据我自己的理解来给大家讲解,包括解析和代码,希望你可以对链表有更加深入的理解!! 题目: 先上链接: OJ题目 给你一个链表的头节点 head 和一个整数 va…

ICode国际青少年编程竞赛- Python-1级训练场-路线规划

ICode国际青少年编程竞赛- Python-1级训练场-路线规划 1、 Dev.step(3) Dev.turnLeft() Dev.step(4)2、 Dev.step(3) Dev.turnLeft() Dev.step(3) Dev.step(-6)3、 Dev.step(-2) Dev.step(4) Dev.turnLeft() Dev.step(3)4、 Dev.step(2) Spaceship.step(2) Dev.step(3)5、…

欧拉回路(leetcode 重新安排行程)

先学习一下欧拉回路是怎么一回事。 对于图中这七个节点,从节点1出发,最终要到达节点1,并且每条路只能走一次,且每条路都得走过一次。 使用dfs,如果算法按照字典序的排列方式选择下一个节点。 第一部分:那…

VS Code 保存+格式化代码

在 VSCode 中,使用 Ctrl S 快捷键直接保存并格式化代码: 打开 VSCode 的设置界面:File -> Preferences -> Settings在设置界面搜索框中输入“format on save”,勾选“Editor: Format On Save”选项,表示在保存…

CUDA内存访问模式

大多数设备端数据访问都是从全局内存开始的,并且多数GPU应用程序容易受内存带宽的限制。因此,最大限度的利用全局内存带宽是调控核函数性能的基本。 对齐与合并访问 如图,所有的应用程序数据最初存在于DRAM上,也就是物理设备内存上…

【HTTP上】协议/域名/url/请求和响应/状态码/重定向

文章目录 0.应用层协议0.1HTTP协议 1.域名2.DNS3.访问浏览器4.URL搜索特殊字符如#&~ 5.万维网6.http请求和响应的格式6.1HTTP请求格式6.2HTTP响应格式6.3示例6.3模拟HTTP【框架】6.4查看请求或响应的工具FiddlerPostman 7.网页7.0对访问网页的认识7.1wget7.2新的认识7.3GET…

使用DataGrip连接DM达梦数据库

目录 前言一、添加数据库驱动1.1 配置达梦驱动包1.1.1 配置达梦驱动1.1.2 配置驱动jar包 1.2 配置JDBC URL模板1.3 保存驱动配置 二、新建数据源2.1 填写数据库连接信息2.2 测试是否配置成功2.3 保存配置并退出 前言 达梦数据库虽然提供了官方的数据库管理工具"DM管理工具…

数据挖掘实战-基于CNN深度学习算法构建英文文本分类模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

零基础学习数据库SQL语句之操作表中数据的DML语句

我们的数据库是根据页面原型和相关需求完成相关开发的 在表中添加数据 删除数据 修改数据 添加数据 页面模型 当点击保存的时候就能将表单数据提交到服务端 服务端将数据添加到数据库 我们要用insert语句 将数据添加到数据库中 代码演示 CREATE DATABASE Dduo; USE Dduo…

【资源分享】CAD Map 3D2024安装教程

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验,帮助大家尽早适应研究生生活,尽快了解科研的本质。祝一切顺利!—…

Elasticsearch:探索 11 种流行的机器学习算法

作者:来自 Elastic Elastic Platform Team 过去几年中,机器学习(ML)已经悄然成为我们日常生活中不可或缺的一部分。它影响着从购物网站和流媒体网站上的个性化推荐,到保护我们的收件箱免受我们每天收到的大量垃圾邮件的…

docker compose mysql主从复制及orchestrator高可用使用

1.orchestrator 功能演示: 1.1 多级级联: 1.2 主从切换: 切换成功后,原来的主库是红色的,需要在主库的配置页面点击“start replication ”,重新连接上新的主库。 1.3 主从故障,从库自动切换新…

Redis系列-2 Redis持久化机制

背景: 服务器重启后会丢失内存中的全部数据,内存数据库如果没有持久化机制,难以保证数据的可靠性,如Memcached。Redis提供了RDB(基于全量)和AOF(基于增量)两种持久化机制,一方面可以保证数据的可靠性,当服…

38-4 Web应用防火墙 - WAF的使用及规则

准备:38-3 Web应用防火墙 - 安装配置WAF-CSDN博客 WAF的使用 启动 Nginx /usr/local/nginx/sbin/nginx 为了测试未启动 ModSecurity 时的访问效果,我们可以模拟攻击。要查看当前虚拟机的 IP 地址,可以使用命令 ifconfig 浏览器中访问ip,如果要在真实机中访问就需要关闭…

Sqlserver批量迁移Job

因为切换物理机,需要把数据库的作业从A机器迁移到B机器,数据库整体备份还原就可以了,数据库上的作业不会跟着带过去,需要手动创建,作业数量太多,逐一创建太浪费时间,Microsoft SQL Server Manag…

M2M设备、消费设备、IoT设备

有任何关于GSMA\IOT\eSIM\RSP\业务应用场景相关的问题,欢迎W: xiangcunge59 一起讨论, 共同进步 (加的时候请注明: 来自CSDN-iot). 您提供的链接指向一篇关于GSMA SGP.32标准,即eSIM物联网(IoT)标准的文章。以下是文章的主要内容概述: ##…

JAVA基础之Swing窗体的几种布局

1、边框布局BorderLayout 特点:5个方位(东(East)南(north)西(west)北(south)中(center)) 是一种简单的布局策略。 使用时,应将其看成一个“组件”。 同样,首先应通…