我想将坐标向量中的数据写入二进制.stl 3d几何文件。
我需要一个80位的标题,24位数的三角形。 每个三角形应该由3个点和1个法线定义,每个三角形的坐标值是32位。此外,每个三角形可能有一个属性,我想留空。 (见wiki)
我想我仍然对char和二进制模式有误解。
最终生成的文件与原始文件大小相同但图形程序无法读取,因此仍然存在逻辑错误......
在转换为char *之前,我的点坐标是双值的,这样做可以吗?
我的代码:
void write_stl(std::string filename, std::vector<tri> triangles){
//binary file
std::string header_info = "solid " + filename + "-output";
char head[80];
std::strncpy(head,header_info.c_str(),sizeof(head)-1);
char attribute[2] = "0";
unsigned long nTriLong = triangles.size() ;
std::ofstream myfile;
myfile.open((Filename + "-out.stl").c_str(), std::ios::out | std::ios::binary);
myfile.write(head,sizeof(head));
myfile.write((char*)&nTriLong,4);
//write down every triangle
for (std::vector<tri>::iterator it = triangles.begin(); it!=triangles.end(); it++){
//normal vector coordinates
myfile.write((char*)&it->m_n.m_x, 4);
myfile.write((char*)&it->m_n.m_y, 4);
myfile.write((char*)&it->m_n.m_z, 4);
//p1 coordinates
myfile.write((char*)&it->m_p1.m_x, 4);
myfile.write((char*)&it->m_p1.m_y, 4);
myfile.write((char*)&it->m_p1.m_z, 4);
//p2 coordinates
myfile.write((char*)&it->m_p2.m_x, 4);
myfile.write((char*)&it->m_p2.m_y, 4);
myfile.write((char*)&it->m_p2.m_z, 4);
//p3 coordinates
myfile.write((char*)&it->m_p3.m_x, 4);
myfile.write((char*)&it->m_p3.m_y, 4);
myfile.write((char*)&it->m_p3.m_z, 4);
myfile.write(attribute,2);
}
myfile.close();
}
其中tri
只是一个三角形的结构,包含3个点而法线是“3D矢量”(即具有x,y,z,值的结构)......
答案 0 :(得分:6)
write()
的size参数是以字节为单位的大小,而不是以位为单位。当你应该通过4时,你正在为float
传递32。