X文件的导出系列2——纹理和朝向
带纹理的模型的导出
在系列1中建立的正方形平面的基础上添加纹理,注意纹理文件的大小必须设置为2的整数幂,否则在XNA中会报错。如下图所示:
如图中红圈所示,将“U向平铺”和“V向平铺”都从默认的“1”设置为“2”,这样纹理就会以4张的形式平铺在面上。导出为X文件,相对于系列1,输出选项要做以下变化:
1.Mesh选项卡
选择“Mapping coordinares(纹理坐标)”。
2.Textures&.fx files选项卡
Texture Conversion:选择“Copy texture map(复制纹理贴图)”,“Scale texture to nearest power of 2(将纹理设置为最接近2的幂,这样做对显卡更加友好)”,“White diffuse override(texture)(不懂)”。“Format”中选择“PNG(.png)”,可选项还有“Bitmap(.bmp)”“JPEG(.jpg)”和“Targe(.tga)”。“Overwrite”中选择“Do not overwrite”,可选项还有“Always overwrite”。不勾选“Use File pathname”,否则纹理文件会使用绝对路径。
保存文件后,就会在输出目录下生成x文件和对应的纹理文件“einstain.png”。
X文件的结构
在写字板中打开此文件,源代码如下:
xof 0303txt 0032 template ColorRGBA { <35ff44e0-6c7c-11cf-8f52-0040333594a3> FLOAT red; FLOAT green; FLOAT blue; FLOAT alpha; } template ColorRGB { <d3e16e81-7835-11cf-8f52-0040333594a3> FLOAT red; FLOAT green; FLOAT blue; } template Material { <3d82ab4d-62da-11cf-ab39-0020af71e433> ColorRGBA faceColor; FLOAT power; ColorRGB specularColor; ColorRGB emissiveColor; [...] } template TextureFilename { <a42790e1-7810-11cf-8f52-0040333594a3> STRING filename; } template Vector { <3d82ab5e-62da-11cf-ab39-0020af71e433> FLOAT x; FLOAT y; FLOAT z; } template MeshFace { <3d82ab5f-62da-11cf-ab39-0020af71e433> DWORD nFaceVertexIndices; array DWORD faceVertexIndices[nFaceVertexIndices]; } template Mesh { <3d82ab44-62da-11cf-ab39-0020af71e433> DWORD nVertices; array Vector vertices[nVertices]; DWORD nFaces; array MeshFace faces[nFaces]; [...] } template MeshNormals { <f6f23f43-7686-11cf-8f52-0040333594a3> DWORD nNormals; array Vector normals[nNormals]; DWORD nFaceNormals; array MeshFace faceNormals[nFaceNormals]; } template MeshMaterialList { <f6f23f42-7686-11cf-8f52-0040333594a3> DWORD nMaterials; DWORD nFaceIndexes; array DWORD faceIndexes[nFaceIndexes]; [Material <3d82ab4d-62da-11cf-ab39-0020af71e433>] } template Coords2d { <f6f23f44-7686-11cf-8f52-0040333594a3> FLOAT u; FLOAT v; } template MeshTextureCoords { <f6f23f40-7686-11cf-8f52-0040333594a3> DWORD nTextureCoords; array Coords2d textureCoords[nTextureCoords]; } Material PDX01_-_Default { 1.000000;1.000000;1.000000;1.000000;; 3.200000; 0.000000;0.000000;0.000000;; 0.000000;0.000000;0.000000;; TextureFilename { "einstain.png"; } } Mesh Plane01 { 4; -0.500000;-0.500000;0.000000;, 0.500000;-0.500000;0.000000;, -0.500000;0.500000;0.000000;, 0.500000;0.500000;0.000000;; 2; 3;2,0,3;, 3;1,3,0;; MeshNormals { 1; 0.000000;0.000000;1.000000;; 2; 3;0,0,0;, 3;0,0,0;; } MeshMaterialList { 1; 2; 0, 0; { PDX01_-_Default } } MeshTextureCoords { 4; -0.000000;1.000000;, 2.000000;1.000000;, 0.000000;-1.000000;, 2.000000;-1.000000;; } }
模板
模板中的变化是多了三个纹理坐标的模板:
纹理文件名模板:
template TextureFilename { <a42790e1-7810-11cf-8f52-0040333594a3> STRING filename; }
UV坐标数据类型模板:
template Coords2d { <f6f23f44-7686-11cf-8f52-0040333594a3> FLOAT u; FLOAT v; }
纹理坐标模板:
template MeshTextureCoords { <f6f23f40-7686-11cf-8f52-0040333594a3> DWORD nTextureCoords; array Coords2d textureCoords[nTextureCoords]; }
数据
数据的变化是:
Material PDX01_-_Default { 1.000000;1.000000;1.000000;1.000000;; 3.200000; 0.000000;0.000000;0.000000;; 0.000000;0.000000;0.000000;; TextureFilename { "einstain.png"; //纹理文件,使用相对路径 } }
MeshTextureCoords { 4; //4个纹理坐标 -0.000000;1.000000;, //纹理坐标值 2.000000;1.000000;, 0.000000;-1.000000;, 2.000000;-1.000000;; }
在XNA中的截图如下:
模型的朝向
先在3DS中制作一个坐标轴,方向与3DS的相同,即向右为X轴(红色),向左为Y轴(绿色),向上为Z轴(蓝色),是右手坐标系。如下图所示:
在DirectX Viewer中观察一切正常:
可见导出插件自动把右手坐标系转换成了DirectX的左手坐标系,或者说把模型关于XY平面做了镜像。但这样的话在XNA就会得不到我要的结果,变成了左手坐标系:
解决方案
要解决这个问题有两个方法,第一种方法是推荐的美工解决方案:即在3DS中将刚才做好的坐标轴旋转至Y轴(向上),并在输出选项中选择“Left Handed Axis”,就能得到期待的结果。详情请见http://www.cnblogs.com/gogoplayer/archive/2008/08/14/973669.html。
在XNA中出现了预期的效果:
第二个方法是在程序中转换朝向。具体实现可参见http://www.zhouweidi.name/Tech/Article/ExportToD3D/ExportToD3D.htm。
发布时间:2009/6/5 下午12:40:24 阅读次数:8969