PDA

View Full Version : مقاله: OBJ FILE LOADING



Hamid_VB
سه شنبه 03 شهریور 1388, 19:35 عصر
برنامه ی باز کردن فایل های obj که خودم نوشتم ، البته هنوز کامل کامل نشده...


#define MAX_POINTS 100000
unsigned char objname[20] = {""};
char objpoints[MAX_POINTS][50]={""};
char objpointstex[MAX_POINTS][50]={""};
unsigned char objpointnorm[MAX_POINTS][50]={""};
char objface[MAX_POINTS][50]={""};
unsigned char objqroupname[MAX_POINTS][10]={""};
unsigned char objpoint[MAX_POINTS][10]={""};
unsigned char objline[MAX_POINTS][10]={""};
float PointsPos[2][1]={0};
unsigned int faces_points[2][50000]={0};
unsigned int faces_textures[2][50000]={0};
float TrianglesPoints[2][50000]={0};
float TrianglesTextures[2][1]={0};
float LinesPos[2][1]={0};
void loadobjfile(char *FileName,int List_Number)
{
int filesize;
char data[1000000]={""};
FILE * file;
int cntsplashs=0;
file = fopen(FileName, "rb" );
fread(data,1,1000000,file);
fclose(file);
filesize = strlen(data);
int cntnamechar =0;
int cntinfochar =0;
int cntinfocharcnt =-1;
int cntpointschar =0;
int cntpointscharcnt =-1;
int cntpointcharcnt =-1;
int cntpointstxchar =0;
int cntpointtxcharcnt =-1;
int cntpointnormchar =0;
int cntpointnormcharcnt =-1;
int cntfchar =0;
int cntfcharcnt =-1;
int cntfacechar =0;
int cntpointchar=0;
int cntfacecharcnt =-1;
int cntqroupcharcnt=-1;
int cntqroupchar=0;
int cntlinecharcnt=-1;
int cntlinechar=0;
bool isobjinfo=false;
bool isqroupname=false;
bool isobjname=false;
bool isline=false;
bool ispoint=false;
bool isobjtexture=false;
bool isobjpoints=false;
bool isobjpointstex=false;
bool isobjpointnorm=false;
bool isobjface=false;
for(int chrcnt=0;chrcnt<filesize;chrcnt++){
switch(data[chrcnt]){
case char(10):
if(isqroupname) isqroupname = false;
if(isline) isline = false;
if(ispoint) ispoint = false;
if(isobjname) isobjname = false;
if(isobjpoints) isobjpoints = false;
if(isobjpointstex) isobjpointstex = false;
if(isobjpointnorm) isobjpointnorm = false;
if(isobjface) isobjface = false;
switch(data[chrcnt+1]){
case 'v':
switch(data[chrcnt+2]){
case 't':
chrcnt++;
chrcnt++;
isobjpointstex = true;
cntpointtxcharcnt++;
cntpointstxchar=0;
break;
case 'n':
chrcnt++;
chrcnt++;
isobjpointnorm = true;
cntpointnormcharcnt++;
cntpointnormchar=0;
break;
default:
chrcnt++;
isobjpoints = true;
cntpointscharcnt++;
cntpointschar=0;
break;
}
break;
case 'f':
chrcnt++;
isobjface = true;
cntfacecharcnt++;
cntfacechar=0;
break;
case 'g':
chrcnt++;
isqroupname=true;
cntqroupcharcnt++;
cntqroupchar=0;
break;
case 'o':
chrcnt++;
isobjname=true;
break;
case 'p':
chrcnt++;
ispoint=true;
cntpointcharcnt++;
cntpointchar=0;
break;
case 'l':
chrcnt++;
isline=true;
cntlinecharcnt++;
cntlinechar=0;
break;
}
break;
default:
if(isqroupname){
objqroupname[cntqroupcharcnt][cntqroupchar] = data[chrcnt];
cntqroupchar++;
}
if(isobjpoints){
objpoints[cntpointscharcnt][cntpointschar] = data[chrcnt];
cntpointschar++;
}
if(isobjpointstex){
objpointstex[cntpointtxcharcnt][cntpointstxchar] = data[chrcnt];
cntpointstxchar++;
}
if(isobjpointnorm){
objpointnorm[cntpointnormcharcnt][cntpointnormchar] = data[chrcnt];
cntpointnormchar++;
}
if(isobjface){
objface[cntfacecharcnt][cntfacechar] = data[chrcnt];
cntfacechar++;
}
if(isline){
objline[cntlinecharcnt][cntlinechar] = data[chrcnt];
cntlinechar++;
}
if(ispoint){
objpoint[cntpointcharcnt][cntpointchar] = data[chrcnt];
cntpointchar++;
}
if(isobjname){
objname[cntnamechar] = data[chrcnt];
cntnamechar++;
}
break;
}
}
for(int cnt=0;cnt<=cntpointscharcnt;cnt++){
sscanf(objpoints[cnt]," %f %f %f",&TrianglesPoints[0][cnt],&TrianglesPoints[1][cnt],&TrianglesPoints[2][cnt]);
}
for(cnt=0;cnt<=cntfacecharcnt;cnt++){
cntsplashs=0;
for(int _cnt=0;_cnt<=strlen(objface[1]);_cnt++){
if(objface[1][_cnt]=='/') cntsplashs++;
}
switch(cntsplashs){
case 0:
sscanf(objface[cnt]," %i %i %i",&faces_points[0][cnt],&faces_points[1][cnt],&faces_points[2][cnt]);
break;
case 3:
sscanf(objface[cnt]," %i/%i %i/%i %i/%i",&faces_points[0][cnt],&faces_textures[0][cnt],&faces_points[1][cnt],&faces_textures[1][cnt],&faces_points[2][cnt],&faces_textures[2][cnt]);
break;
case 6:
break;
}
}
glNewList(List_Number, GL_COMPILE);
for(cnt=0;cnt<=cntfacecharcnt;cnt++){
glBegin(GL_TRIANGLES);
glVertex3f(TrianglesPoints[0][faces_points[0][cnt]-1],TrianglesPoints[1][faces_points[0][cnt]-1],TrianglesPoints[2][faces_points[0][cnt]-1]);
glVertex3f(TrianglesPoints[0][faces_points[1][cnt]-1],TrianglesPoints[1][faces_points[1][cnt]-1],TrianglesPoints[2][faces_points[1][cnt]-1]);
glVertex3f(TrianglesPoints[0][faces_points[2][cnt]-1],TrianglesPoints[1][faces_points[2][cnt]-1],TrianglesPoints[2][faces_points[2][cnt]-1]);
glEnd();
}
glEndList();
}

pswin.pooya
سه شنبه 03 شهریور 1388, 23:21 عصر
برای رسم سعی کن از تابع glDrawArrays استفاده کنی و یا اینکه VBO و VAO رو پیاده سازی کنی. ترتیب سرعت پیاده سازی:


VOA (Vertex array object) (OpenGL3.0 + or Geforce s8
Indexed VBO-IBO- ( OpenGL 2.0 +
VBO (OpenGL 2.0
gllistes with glDrawArray elements
glLists with glBegin/glEnd block
glDrawArray and glDrawArrayElements
glDrawArray
glBegin/glEnd

VBO و VAO شبیه هم دیگه هستند با این فرق که VAO تو هر دفعه رسم نیاز به ست کردن وضعیت کلاینت نداره و فقط زمان مقدار دهی اینکار رو لازم داره که توی تعداد رسم بالا تاثیر زیادی رو میذاره. همینطور روشهای دیگه ای هم برای رسم وجود دارن که برای تعداد object زیاد بکار میرن که به این بحث مربوط نیست.

armintirand
یک شنبه 08 شهریور 1388, 02:46 صبح
دوست عزیز در ساختار فایل با فرمت .obj و 3dsmaxچه تفاوتهایی هست؟

pswin.pooya
یک شنبه 08 شهریور 1388, 03:43 صبح
از زمین تا آسمون تفاوت هستش.
ولی عمده ترین تفاوت این دوو توی نحوه ذخیره سازی و قابلیتهای اونها هستش. به عنوان مثال فایلهای obj به صورت متنی ذخیره میشن و فقط اطلاعات ورتکس رو نگهداری میکنن (مثل مکان رنگ ، ... ) ولی فایلهای مکس (3ds) نه .max به صورت chunk و باینری ذخیره میشن و هر نوع اطلاعاتی مثل انیمیشن، سیستم اسکلتی، نور و ... رو هم میتونن نگهداری کنن. ایم بگم که در مورد فایلهای 3ds اطلاعات کاملی وجود نداره که بشه به اون تکیه کرد و کاملترین اطلاعات رو خود autodesk داره و بس. ولی بسیاری از chunk های مورد نیاز اون که به درد بازی سازی میخورن رو ذیکود کردن و میشه از اونها استفاده کرد.