C#创建obj三维模型文件

ops/2024/9/23 9:23:47/

介绍

使用开源库创建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

示例

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

测试代码:

            //面片1var face1Pts = new float[][]{new float[]{0,0,0},new float[]{0,1,0},new float[]{1,1,0},new float[]{1,0,0},};//面片2var 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},};//面片3var 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.ppmy.cn/ops/23905.html

相关文章

JavaWeb-自学JSP组件报告

自学JSP组件报告 一、组件资源及作用 1. commons-fileupload-1.2.2.jar 组件作用:用于处理HTTP文件上传请求,提供了文件上传的解析和存储功能。它允许开发者在Web应用中轻松实现文件上传功能。 2. commons-io-2.4.jar 组件作用:提供了一…

【Linux】git和gdb

下面还有两个Linux中会用到的工具,一个是给git,可以叫版本控制器,就是对我们写的代码进行版本控制 一个是gdb,就是我们C语言/C的代码调试工具 下面我们分别来介绍一下 git git和Linux一样,也是一个开源项目&#xff0c…

php curl_init proxy type

PHP的curl库提供了多种代理类型供选择。在使用curl库时,您可以设置代理类型,以便curl可以使用不同类型的代理来发出请求。 以下是curl支持的代理类型列表: HTTP代理(CURLOPT_PROXYTYPE > CURLPROXY_HTTP)&#xf…

Ant Design助力:实现用户列表的优雅展示与管理

文章目录 概要前端讲解登录组件注册组件用户列表组件 后端讲解连接数据库db.js路由routes.jsexpress应用app.js 启动项目小结 概要 在上一篇博客🚪中,我们已经成功实现了登录注册系统的基本功能。现在,我们将进一步完善系统,实现…

ICP-RIE设备原理

知识星球(星球名:芯片制造与封测社区)里的学员问:请问ICP-RIE机台的原理是什么样的? 上图是一个典型的ICP-RIE设备的原理图,其中: ICP Generator(感应耦合等离子体发生器&#xff0…

使用python写一个识别车牌原理

车牌识别(License Plate Recognition, LPR)通常涉及几个关键步骤:图像预处理、车牌定位、字符分割和字符识别。以下是一个简化的原理说明和Python代码示例,帮助你理解如何使用Python进行车牌识别。 1. 图像预处理 灰度化&#xf…

springboot常用注释

SpringBootApplication 标明启动类的注释,也就是标明项目程序入口,实际上集成了非常多的注释 SpringBootApplication public class SpringbootApplication {public static void main(String[] args) {SpringApplication.run(SpringbootApplication.cla…

如何使用PHP进行图片处理?

如何使用PHP进行图片处理? 使用PHP进行图片处理是一项强大的功能,它可以让你在服务器端对图像进行各种操作,如裁剪、缩放、添加水印、调整颜色等。这通常通过使用GD库或Imagick扩展来实现。下面将详细介绍如何使用PHP和这两个工具进行图片处…