C#创建obj三维模型文件

介绍

使用开源库创建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的赋值可以注释跳过。

相关推荐

  1. C语言三维数组的创建

    2024-04-29 21:46:04       115 阅读
  2. 【OpenGL实践06】如何读入模型文件obj数据

    2024-04-29 21:46:04       32 阅读
  3. c++ 模拟 三维数组输入 string转化为int

    2024-04-29 21:46:04       42 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-29 21:46:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-29 21:46:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-29 21:46:04       82 阅读
  4. Python语言-面向对象

    2024-04-29 21:46:04       91 阅读

热门阅读

  1. Python学习路线图及开源库和工具推荐

    2024-04-29 21:46:04       25 阅读
  2. Seata分布式事务!!!

    2024-04-29 21:46:04       33 阅读
  3. 统计字符次数

    2024-04-29 21:46:04       36 阅读
  4. APP漏洞频发怎么办?渗透测试有用吗

    2024-04-29 21:46:04       34 阅读
  5. leetcode1146--快照数组

    2024-04-29 21:46:04       38 阅读
  6. 使用python写一个识别人脸

    2024-04-29 21:46:04       26 阅读
  7. C#面:委托是什么?事件是不是一种委托?

    2024-04-29 21:46:04       39 阅读
  8. 2d激光slam的改进方案探索

    2024-04-29 21:46:04       33 阅读
  9. C/C++中的整数乘法运算与汇编指令MUL和IMUL

    2024-04-29 21:46:04       35 阅读
  10. 内核镜像

    2024-04-29 21:46:04       33 阅读
  11. 常用的网站和软件

    2024-04-29 21:46:04       34 阅读
  12. 发现问题并进行管理——bug和调试器

    2024-04-29 21:46:04       32 阅读
  13. vue源码中如何实现数据监听?

    2024-04-29 21:46:04       36 阅读
  14. 反射会打破单例模式吗

    2024-04-29 21:46:04       39 阅读