C#创建obj三维模型文件

devtools/2024/9/22 13:54:34/

介绍

使用开源库创建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/devtools/25345.html

相关文章

C#编程模式之组合模式(Composite)

创作背景:各位朋友,我们继续C#编程模式的探讨,这次探讨的模式是组合模式。它和桥接模式一样,是一种结构型设计模式,允许使用者将对象组合成树形结构来展示其“部分和整体”的层次结构。要求同样比较严格,用…

指纹浏览器:网络安全与隐私的新工具

在互联网时代,隐私和网络安全成为人们越来越关注的话题。随着数字化的发展,个人信息的泄露和在线追踪的问题愈发严峻。在这个背景下,"指纹浏览器"作为一种新型工具,开始受到关注。撸空投需要了解指纹浏览器。本文将深入…

Ubuntu搭建RP2040开发环境-1

Ubuntu搭建RP2040开发环境-1 2024-4-23 hongxi.zhu 前置依赖(可选) sudo apt-get install vim sudo apt-get install cmake sudo apt-get install libncurses-dev sudo apt-get install libssl-dev sudo apt-get install git一、下载SDK和编译链 下载SD…

c++多文件,cmakelist编写简单示例

记录下c多文件cmakelist编写流程&#xff1a; 目录结构大致如下&#xff1a; 1、swap.h #include <iostream> #include <vector> #include <string> using namespace std;void swap(int *a,int *b); 2、swap.cpp #include "swap.h"void swap(…

【MRI重建】Cartesian采样中data consistency 常规数据一致性实现(pytorch)

关于 在MRI重建中,data consistency 可以帮助加快MRI图像重建和减少模型重建带来的重建误差。 工具 方法实现 x_rec: 重建图像, (batch_size,2,H,W) mask: 欠采样模版,(batch_size,2,H,W) k_un: 真实欠采样采集数据, (batch_size,2,H,W) torch.view_as_complex: 将实数数据…

富格林:落实安全出金可信操作

富格林指出&#xff0c;在现货黄金交易理财中&#xff0c;投资者的唯一目标就是降低亏损风险&#xff0c;同时增加安全出金的几率。然而&#xff0c;由于现货黄金行情的多样变化给投资者增加了控制的难度。那么&#xff0c;我们要如何实现安全出金呢&#xff1f;其实有一些可信…

PM2管理器无法使用解决方法

之前的项目全是依靠PM2管理器部署的&#xff0c;部署快速&#xff0c;也便于管理 但是宝塔实在是bug毛病太多&#xff0c;最近这两天又出毛病了 这次的问题是在PM2管理器的node版本中无法进行版本切换&#xff0c;如果是第一次使用PM2的话甚至无法设置node版本&#xff0c;之前…

Qt/C++ 波形绘制双缓冲下改善PaintEvent连续绘制卡顿问题(完整代码解析)

音频波形可视化&#xff1a;该控件用于将音频样本数据可视化为波形&#xff0c;常用于音频处理软件中以展示音频信号的时间域特性。 动态数据绘制&#xff1a;控件能够响应外部数据的变化并重新绘制波形&#xff0c;适用于实时或动态的音频数据流。 自定义绘制逻辑&#xff1…