DirectX10教程8加载Maya模型.docx
- 文档编号:11497866
- 上传时间:2023-06-01
- 格式:DOCX
- 页数:18
- 大小:56.75KB
DirectX10教程8加载Maya模型.docx
《DirectX10教程8加载Maya模型.docx》由会员分享,可在线阅读,更多相关《DirectX10教程8加载Maya模型.docx(18页珍藏版)》请在冰点文库上搜索。
DirectX10教程8加载Maya模型
DirectX10教程8:
加载Maya2011模型
原文地址:
Tutorial8:
LoadingMaya2011Models。
本教程介绍如何导入Maya2011制作的3D模型。
虽然本教程讨论的是Maya,但是要稍加修改也可以处理其他3D建模工具导出的3D模型。
在前面的教程中我们创建了自己的模型格式并进行了绘制。
本教程我们要把Maya2011模型格式变换为自己的格式并进行绘制。
这里不讨论如何在Maya创建3D模型,网上有无数的教程,我们直接从一个已经附有纹理的3D模型开始。
Maya导出的格式很多,我们使用的是.OBJ,因为它易读,所以适用于初学者。
要在Maya中将模型导出为.obj格式,你必须首先打开.OBJexporter。
点击“Window”,选择“Settings/Preferences”,然后是“Plug-inManager”。
下拉到objExport.mll并选择“Loaded”和“Autoload”。
导出时只需点击“File”,选择“ExportAll”。
在底部选择“Filesoftype:
”找到“OBJexport”。
指定一个文件名词并点击“ExportAll”,Maya就会把模型导出为一个.obj后缀的文本文件,用任意一个文本编辑器(例如记事本)打开这个文件,内容如下:
Cube.obj
#Thisfileusescentimetersasunitsfornon-parametriccoordinates.
mtllibcube.mtl
gdefault
v-0.500000-0.5000000.500000
v0.500000-0.5000000.500000
v-0.5000000.5000000.500000
v0.5000000.5000000.500000
v-0.5000000.500000-0.500000
v0.5000000.500000-0.500000
v-0.500000-0.500000-0.500000
v0.500000-0.500000-0.500000
vt0.0019920.001992
vt0.9980080.001992
vt0.0019920.998008
vt0.9980080.998008
vt0.0019920.001992
vt0.9980080.001992
vt0.0019920.998008
vt0.9980080.998008
vt0.0019920.001992
vt0.9980080.001992
vt0.0019920.998008
vt0.9980080.998008
vt0.0019920.001992
vt0.9980080.001992
vt0.0019920.998008
vt0.9980080.998008
vt0.0019920.001992
vt0.9980080.001992
vt0.0019920.998008
vt0.9980080.998008
vt0.9980080.998008
vt0.0019920.998008
vt0.9980080.001992
vt0.0019920.001992
vn0.0000000.0000001.000000
vn0.0000000.0000001.000000
vn0.0000000.0000001.000000
vn0.0000000.0000001.000000
vn0.0000001.0000000.000000
vn0.0000001.0000000.000000
vn0.0000001.0000000.000000
vn0.0000001.0000000.000000
vn0.0000000.000000-1.000000
vn0.0000000.000000-1.000000
vn0.0000000.000000-1.000000
vn0.0000000.000000-1.000000
vn0.000000-1.0000000.000000
vn0.000000-1.0000000.000000
vn0.000000-1.0000000.000000
vn0.000000-1.0000000.000000
vn1.0000000.0000000.000000
vn1.0000000.0000000.000000
vn1.0000000.0000000.000000
vn1.0000000.0000000.000000
vn-1.0000000.0000000.000000
vn-1.0000000.0000000.000000
vn-1.0000000.0000000.000000
vn-1.0000000.0000000.000000
s1
gpCube1
usemtlfile1SG
f1/1/12/2/23/3/3
f3/3/32/2/24/4/4
s2
f3/13/54/14/65/15/7
f5/15/74/14/66/16/8
s3
f5/21/96/22/107/23/11
f7/23/116/22/108/24/12
s4
f7/17/138/18/141/19/15
f1/19/158/18/142/20/16
s5
f2/5/178/6/184/7/19
f4/7/198/6/186/8/20
s6
f7/9/211/10/225/11/23
f5/11/231/10/223/12/24
这个.OBJ模型文件表示一个3D立方体。
它有6个顶点,24个纹理坐标和法线矢量,6个面共12个三角形。
注意每行开头的“V”,“VT”,“VN”"或“F”。
这些额外的信息在转换为我们自定义的格式时是无用的。
下面我们讨论一下字母的含义:
1.“V”开头的行用于顶点。
立方体有8个顶点,每个顶点由三个代表X,Y,Z的浮点数构成。
2.“VT”开头的行用于纹理坐标。
立方体有24个纹理坐标,大部分坐标是重复的,由两个TU,TV浮点数构成。
3.“VN”开头的行用于法线矢量。
立方体有24个法线,大部分是重复的,由三个NX,NY,NZ浮点数构成。
4.“F”开头的行用于每个三角形。
由顶点索引,纹理坐标索引和法线索引构成,每个面的格式为:
fVertex1/Texture1/Normal1Vertex2/Texture2/Normal2Vertex3/Texture3/Normal3
因此“f3/13/54/14/65/15/7”表示“Vertex3/Texture13/Normal5Vertex4/Texture14/Normal6Vertex5/Texture15/Normal7”。
数据的顺序非常重要。
例如文件中的第一个顶点对应face列表中的Vertex1,纹理坐标和法线的顺序也是如此。
在行face中每行的三个索引组代表一个三角形,一个立方体有12face组成6个面,每个面有2个三角形。
右手坐标系到左手坐标系的转换
Maya2011默认使用右手坐标系。
要将数据转换为DirectX10使用的左手坐标系,你需要进行以下步骤:
1.反转顶点的Z坐标,代码为:
vertices[vertexIndex].z=vertices[vertexIndex].z*-1.0f;
2.反转TV纹理坐标,代码为:
texcoords[texcoordIndex].y=1.0f-texcoords[texcoordIndex].y;
3.反转NZ法线,代码为:
normals[normalIndex].z=normals[normalIndex].z*-1.0f;
4.将绘制顺序由逆时针方向转换为顺时针方向。
在代码中只是简单地逆序读取索引组即可实现:
fin>>faces[faceIndex].vIndex3>>input2>>faces[faceIndex].tIndex3>>input2>>faces[faceIndex].nIndex3;
fin>>faces[faceIndex].vIndex2>>input2>>faces[faceIndex].tIndex2>>input2>>faces[faceIndex].nIndex2;
fin>>faces[faceIndex].vIndex1>>input2>>faces[faceIndex].tIndex1>>input2>>faces[faceIndex].nIndex1;
通过以上四个步骤,模型数据就能把DirectX10正确绘制了。
Main.cpp
将Maya2011的.obj文件转换为自定义的DirectX10格式非常简单,只有一个程序文件叫做main.cpp。
这个程序打开一个命令行窗口询问要转换的.obj文件名称。
用户输入了名称之后,程序就会打开文件并读取到数据结构,然后将它们转换到左手坐标系,完成后就将这些数据写入到model.txt文件。
这个文件就可以使用上一个教程的代码进行绘制了。
////////////////////////////////////////////////////////////////////////////////
//Filename:
main.cpp
////////////////////////////////////////////////////////////////////////////////
//////////////
//INCLUDES//
//////////////
#include
#include
usingnamespacestd;
//////////////
//TYPEDEFS//
//////////////
typedefstruct
{
floatx,y,z;
}VertexType;
typedefstruct
{
intvIndex1,vIndex2,vIndex3;
inttIndex1,tIndex2,tIndex3;
intnIndex1,nIndex2,nIndex3;
}FaceType;
/////////////////////////
//FUNCTIONPROTOTYPES//
/////////////////////////
voidGetModelFilename(char*);
boolReadFileCounts(char*,int&,int&,int&,int&);
boolLoadDataStructures(char*,int,int,int,int);
//////////////////
//MAINPROGRAM//
//////////////////
intmain()
{
boolresult;
charfilename[256];
intvertexCount,textureCount,normalCount,faceCount;
chargarbage;
//Readinthenameofthemodelfile.
GetModelFilename(filename);
//Readinthenumberofvertices,texcoords,normals,andfacessothatthedatastructurescanbeinitializedwiththeexactsizesneeded.
result=ReadFileCounts(filename,vertexCount,textureCount,normalCount,faceCount);
if(!
result)
{
return-1;
}
//Displaythecountstothescreenforinformationpurposes.
cout< cout<<"Vertices: "< cout<<"UVs: "< cout<<"Normals: "< cout<<"Faces: "< //Nowreadthedatafromthefileintothedatastructuresandthenoutputitinourmodelformat. result=LoadDataStructures(filename,vertexCount,textureCount,normalCount,faceCount); if(! result) { return-1; } //Notifytheuserthemodelhasbeenconverted. cout<<"\nFilehasbeenconverted."< cout<<"\nDoyouwishtoexit(y/n)? "; cin>>garbage; return0; } voidGetModelFilename(char*filename) { booldone; ifstreamfin; //Loopuntilwehaveafilename. done=false; while(! done) { //Asktheuserforthefilename. cout<<"Entermodelfilename: "; //Readinthefilename. cin>>filename; //Attempttoopenthefile. fin.open(filename); if(fin.good()) { //Ifthefileexistsandtherearenoproblemsthenexitsincewehavethefilename. done=true; } else { //Ifthefiledoesnotexistortherewasanissueopeningitthennotifytheuserandrepeattheprocess. fin.clear(); cout< cout<<"File"< } } return; } boolReadFileCounts(char*filename,int&vertexCount,int&textureCount,int&normalCount,int&faceCount) { ifstreamfin; charinput; //Initializethecounts. vertexCount=0; textureCount=0; normalCount=0; faceCount=0; //Openthefile. fin.open(filename); //Checkifitwassuccessfulinopeningthefile. if(fin.fail()==true) { returnfalse; } //Readfromthefileandcontinuetoreaduntiltheendofthefileisreached. fin.get(input); while(! fin.eof()) { //Ifthelinestartswith'v'thencounteitherthevertex,thetexturecoordinates,orthenormalvector. if(input=='v') { fin.get(input); if(input==''){vertexCount++;} if(input=='t'){textureCount++;} if(input=='n'){normalCount++;} } //Ifthelinestartswith'f'thenincrementthefacecount. if(input=='f') { fin.get(input); if(input==''){faceCount++;} } //Otherwisereadintheremainderoftheline. while(input! ='\n') { fin.get(input); } //Startreadingthebeginningofthenextline. fin.get(input); } //Closethefile. fin.close(); returntrue; } boolLoadDataStructures(char*filename,intvertexCount,inttextureCount,intnormalCount,intfaceCount) { VertexType*vertices,*texcoords,*normals; FaceType*faces; ifstreamfin; intvertexIndex,texcoordIndex,normalIndex,faceIndex,vIndex,tIndex,nIndex; charinput,input2; ofstreamfout; //Initializethefourdatastructures. vertices=newVertexType[vertexCount]; if(! vertices) { returnfalse; } texcoords=newVertexType[textureCount]; if(! texcoords) { returnfalse; } normals=newVertexType[normalCount]; if(! normals) { returnfalse; } faces=newFaceType[faceCount]; if(! faces) { returnfalse; } //Initializetheindexes. vertexIndex=0; texcoordIndex=0; normalIndex=0; faceIndex=0; //Openthefile. fin.open(filename); //Checkifitwassuccessfulinopeningthefile. if(fin.fail()==true) { returnfalse; } //Readinthevertices,texturecoordinates,andnormalsintothedatastructures. //Important: AlsoconverttolefthandcoordinatesystemsinceMayausesrighthandcoordinatesystem. fin.get(input); while(! fin.eof()) { if(input=='v') { fin.get(input); //Readinthevertices. if(input=='') { fin>>vertices[vertexIndex].x>>vertices[vertexIndex].y>>vertices[vertexIndex].z; //InverttheZvertextochangetolefthandsystem. vertices[vertexIndex].z=vertices[vertexIndex].z*-1.0f; vertexIndex++; } //Readinthetextureuvcoordinates. if(input=='t') { fin>>texcoords[texcoordIndex].x>>texcoords[texcoordIndex].y; //InverttheVtexturecoordinatestolefthandsystem. texcoords[texcoordIndex].y=1.0f-texcoords[texcoordIndex].y; texcoordIndex++; } //Readinthenormals. if(input=='n') { fin>>normals[normalIndex].x>>normals[normalIndex].y>>normals[normalIndex].z; //InverttheZnormaltochangetolefthandsystem. normals[normalIndex].z=normals[normalI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DirectX10 教程 加载 Maya 模型