c++编译STL文件反转其法线

 

项目场景:

利用c++编译STL反转法线


问题描述:

STL格式模型如何生成,如何反转法线,反转之后模型有什么变化


原因分析:

可适用于STL文件格式底层学习


解决方案:

#include <iostream>

#include <vector>

#include <fstream>

#include<string>

using namespace std;

 

int main()

{

ifstream in("F:\\VScunfang\\inlet.stl"); //txt文件与源代码要在一个文件夹内

string filename;

string line;

string temp;

vector<string>  m_vec;

if (in) // 有该文件

{

while (getline(in, line)) // line中不包括每行的换行符

{

m_vec.push_back(line); //读取每一行并保存到容器中

}

 

//反转法线方向

ofstream ofs;

ofs.open("F:\\VScunfang\\inlet反转法线.stl", ios::out);

//交换坐标并输出

ofs << "solid C47C" << endl;

for (int i = 2; i < m_vec.size(); i = i + 7)

{

ofs << "facet normal 0 0 1" << endl;

temp = m_vec[i+2];

m_vec[i+2] = m_vec[i+3];

m_vec[i+3] = temp;

for (int j= i; j < i+6; j++)

{

ofs << m_vec[j] << "  " << endl;

cout << m_vec[j] << "" << endl;

}

}

ofs << "endsolid C47C" << endl;

}

else // 没有该文件

{

cout << "no such file" << endl;

}

 

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中,可以使用STL文件读取库来读取和解析STL文件。下面是使用C++代码读取STL文件的基本流程: 1. 打开STL文件并读取文件头信息。 2. 解析文件中的三角形面片信息,可以使用二进制或ASCII格式。 3. 将每个三角形的顶点坐标、法向量等信息保存到一个数据结构中,例如三维向量。 4. 关闭STL文件。 以下是一个简单的C++程序,用于读取二进制格式的STL文件: ``` #include <iostream> #include <fstream> #include <vector> using namespace std; // 三维向量结构体 struct Vec3f { float x, y, z; }; // 三角形面片结构体 struct Triangle { Vec3f normal; Vec3f v1, v2, v3; }; // 读取二进制格式的STL文件 vector<Triangle> readSTLBinary(string filename) { vector<Triangle> triangles; ifstream file(filename.c_str(), ios::in | ios::binary); if (file.fail()) { cerr << "Error: Cannot open file " << filename << endl; return triangles; } // 读取文件头信息 char header[80] = ""; file.read(header, 80); // 读取三角形数量 uint32_t numTriangles = 0; file.read((char*)&numTriangles, sizeof(uint32_t)); // 逐个读取每个三角形的信息 for (uint32_t i = 0; i < numTriangles; i++) { Triangle triangle; // 读取法向量 file.read((char*)&triangle.normal, sizeof(triangle.normal)); // 读取三个顶点的坐标 file.read((char*)&triangle.v1, sizeof(triangle.v1)); file.read((char*)&triangle.v2, sizeof(triangle.v2)); file.read((char*)&triangle.v3, sizeof(triangle.v3)); // 跳过属性字节 char attribute = ""; file.read(attribute, 2); triangles.push_back(triangle); } file.close(); return triangles; } int main() { vector<Triangle> triangles = readSTLBinary("example.stl"); for (auto& triangle : triangles) { cout << "Normal: (" << triangle.normal.x << ", " << triangle.normal.y << ", " << triangle.normal.z << ")" << endl; cout << "Vertex 1: (" << triangle.v1.x << ", " << triangle.v1.y << ", " << triangle.v1.z << ")" << endl; cout << "Vertex 2: (" << triangle.v2.x << ", " << triangle.v2.y << ", " << triangle.v2.z << ")" << endl; cout << "Vertex 3: (" << triangle.v3.x << ", " << triangle.v3.y << ", " << triangle.v3.z << ")" << endl; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值