【发布时间】:2011-08-12 20:18:51
【问题描述】:
我正在尝试将我拥有的一个小型 Python 程序翻译成 C++,它打开一个 OBJ 文件并将必要的数据记录到 FACES 和 VERTS 类中。在 Python 程序中,它只是查看每一行并将它们拆分为由空格描述的标记。如果该行以“f”开头,则后续标记将是面部数据。对于“v”,顶点的位置。对于“vt”,UV 信息。 verts 的“vn”法线。
到目前为止,我可以为线路开通做线路。但是要遍历每一行,然后将它们记录到一个字符串数组(char 数组)中,是非常困难的。请帮忙。
这是我必须开始的示例:
FILE * pFile;
char myString[100];
pFile = fopen(filename, "r");
while(fgets(myString, 100, pFile)!=NULL) {
char *sep;
int counter = 0;
int mode = 0;
sep = strtok(myString, " ");
while (sep != NULL) {
if (strncmp(sep,"f",1)==0) {
mode = 4;
} else {
if (strncmp(sep,"vn",2)==0) {
mode = 3;
} else {
if (strncmp(sep,"vt",2)==0) {
mode = 2;
} else {
if (strncmp(sep,"v",2)==0) {
mode = 1;
}else {
}
}
}
}
switch (mode) {
case 1 :{
// vertex position
break;
}
case 2 :{
cout << sep << " --> vertex normal" << endl;
break;
}
case 3 :{
cout << sep << " --> vertex UV" << endl;
break;
}
case 4 :{
cout << sep << " --> face " << endl;
break;
}
}
sep = strtok(NULL, " ");
counter++;
}
}
我宁愿有一个简单的东西,而不是之前为“MODE”设置变量的“SWITCH”:
def openFile(self, filename):
faceCount = 0
for line in open(filename, "r"):
vals = line.split()
if len(vals) > 0:
if vals[0] == "v":
v = map(float, vals[1:4])
self.verts.append(Point(v[0], v[1], v[2]))
if vals[0] == "vn":
n = map(float, vals[1:4])
self.norms.append(Normal(n[0], n[1], n[2]))
if vals[0] == "vt":
vt = map(float, vals[1:3])
self.text.append(UV(vt[0], vt[1]))
if vals[0] == "f":
vertsOut = []
normsOut = []
textOut = []
for f in vals[1:]:
w = f.split("/")
# OBJ Files are 1-indexed so we must subtract 1 below
try:
vertsOut.append(self.verts[int(w[0])-1])
except:
print "Issue with Position of Face %s " % faceCount
try:
textOut.append(self.text[int(w[1])-1])
except:
print "Issue with UV of Face %s " % faceCount
try:
normsOut.append(self.norms[int(w[2])-1])
except:
print "Issue with Normal of Face %s " % faceCount
self.verts[int(w[0])-1].addFace(faceCount)
self.faces[faceCount]= Face(vertsOut,normsOut,textOut)
faceCount += 1
但那是 Python。那里容易得多。请帮忙。谢谢!
【问题讨论】:
-
你应该看看
else if,你现在在你的C代码中硬编码它们:p。 -
你从哪本书学习 C++?
-
你必须非常小心面部定义和'/'分隔符。如果面的顶点是法线的,那么定界符是'//'而不是单个'/'。见OBJ file format。顺便问一下,您对任何答案都满意吗?