DX创建较复杂的物体
.x是什么文件?记录物体的vertex的吗?
是否创建较复杂的物体都用.x文件来存储呢??
问题点数:100、回复次数:23Top
1 楼gddsky()回复于 2002-02-11 09:53:55 得分 10
.x文件是用来计算顶点、法线、动画矩阵、纹理……
很多很多,一般3D程序里面用到的那些数据,它里面都包含了
当然还有很多别的啊
如果:
.obj\.3ds……Top
2 楼kimryo(God is on my side)回复于 2002-02-11 11:02:38 得分 0
那这个.x文件应该用什么工具来创建呢?3d max行吗?Top
3 楼kimryo(God is on my side)回复于 2002-02-12 15:05:14 得分 0
UP~~~~有谁知道如何读取.max文件?什么3d绘画软件生成.x文件?Top
4 楼gddsky()回复于 2002-02-12 18:53:26 得分 0
使用3DMAX画好一个3DS的文件,再用DX里面自带的转换工具去转换
再就是使用工具,我喜欢用3D Exploration去完成转换,它可以转多种格式的文件如.OBJ/.XTop
5 楼kimryo(God is on my side)回复于 2002-02-12 19:10:30 得分 0
3D Exploration哪有下载?谢谢!Top
6 楼kimryo(God is on my side)回复于 2002-03-02 09:19:30 得分 0
up一把。我要找能生成.x文件的3D场景软件,谁能告知,加分酬谢!Top
7 楼mjm_d(菠萝蜜多)回复于 2002-03-02 20:35:20 得分 10
DX有自带的转换工具,到微软网站去找一下,叫什么CONV3DS.EXE的套装软件Top
8 楼kimryo(God is on my side)回复于 2002-03-03 09:31:46 得分 0
还是不行啊,我就在3D Max里画了个正方体,用Export命令导出为.3ds文件,再用DX8的conv3ds.exe在DOS窗口下conv3ds test.3ds,生成.x文件后,用D3d Mesh读入,还加了材质(D3DXMATERIAL),但显示不出来啊。Top
9 楼GaoYakun(大灰狼)回复于 2002-03-03 12:09:50 得分 10
用MilkShape3D吧,可以导出导入好多种格式。3DS,MAYA,OBJ,MD2,MD3,X,...,还有很强的建模功能Top
10 楼CTimerain(解析中......)回复于 2002-03-03 16:44:02 得分 20
都地老生常谈的问题了
立即模式对.X文件的支持可能有问题,那个文件是为保留模式做的,而且,我猜,等你文件的导出完成之后,可能又会发现,MAX和DX的坐标系是反的,而当再深入的时候,还会有贴图坐标,动画的骨骼的问题,等等。。。。这一些解决的最佳途径就是MAX本身的脚本,用哪个去导出文本格式的数据,再在程序里转换为2进制,再调用就好了,至于怎么调用,那就随你了,省事的做法是写到一个头文件里去,但这样数据量不能太多,因为头文件有2万行限制。比较好的方法是打包,这个实际操作的时候自己把握吧Top
11 楼CTimerain(解析中......)回复于 2002-03-03 16:46:37 得分 0
这是个老生常谈的问题了
x文件是为保留模式准备的,对立即模式的支持有问题Top
12 楼CTimerain(解析中......)回复于 2002-03-03 16:47:42 得分 0
解决的方法
1。用保留模式初始化设备Top
13 楼kimryo(God is on my side)回复于 2002-03-03 17:32:48 得分 0
我现在的问题是连一个最基本的Box都不能显示。
“MAX本身的脚本去导出文本格式数据,再在程序里转换为2进制”
什么更什么啊,我的目的是要能用D3d的mesh读入,而唯一的D3D Mesh认识的格式是.x文件格式。Top
14 楼CTimerain(解析中......)回复于 2002-03-03 18:38:34 得分 0
你用的D几啊??
我的mesh连文本都可以读Top
15 楼kimryo(God is on my side)回复于 2002-03-03 19:02:55 得分 0
.x文件不就是文本吗。
Dx8Top
16 楼CTimerain(解析中......)回复于 2002-03-03 21:38:25 得分 0
.x文件只用了1个月,就做文件的导出了。
那个东西的缺点,我能说一个晚上
就一个例子:你见过那个3D游戏的目录下放着一堆.x文件的?Top
17 楼CTimerain(解析中......)回复于 2002-03-03 21:39:46 得分 0
要是方便
贴代码出来,也好有的放矢Top
18 楼kimryo(God is on my side)回复于 2002-03-03 21:42:34 得分 0
我已经说了,我的目的是怎样转换3d max中编辑的文件让它以.x文件的方式显示到D3D中。
不要扯偏风好不好。Top
19 楼kimryo(God is on my side)回复于 2002-03-03 22:29:54 得分 0
123Top
20 楼freedrom(freedrom)回复于 2002-03-04 19:31:13 得分 0
看一下地热写Top
21 楼LGEN()回复于 2002-03-05 18:09:33 得分 0
我有读3ds文件的库,可以读出所有3ds内容,卖给你。in24@163.comTop
22 楼RealRender(RealRender)回复于 2002-03-06 20:40:43 得分 35
我告诉你个方法,
3ds max 4带有sdk,
里面有很多sample,
其中输出3ds格式也有源代码,
如果你有安装3ds max sdk
打开\maxsdk\Samples\ImpExp\3dsexp.dsw
用我的代码替换原来的CExpScene::callback ( INode *node )
你就能输出自己的格式了,
这样是最精确的,
为了示范,
我仅仅输出几何体,
而且数据输出为文本文件,以方便阅读
int CExpScene::callback ( INode *node )
{
// 不处理隐藏结点
if ( node->IsHidden () )
return TREE_CONTINUE;
Object *obj = node->EvalWorldState ( 0 ).obj;
switch ( obj->SuperClassID () )
{
case GEOMOBJECT_CLASS_ID:
if ( obj->CanConvertToType ( triObjectClassID ) &&
obj->IsRenderable () )
{
// 搜索到多边形物体
TriObject *tri = ( TriObject* )obj->ConvertToType ( 0, triObjectClassID );
if ( tri->mesh.numFaces > 0 )
{
// 写入顶点数
DWORD dwTemp = tri->mesh.numFaces * 3;
//fwrite ( &dwTemp, sizeof ( DWORD ), 1, m_ExpFile );
FILE* fp = m_ExpFile;
fprintf( fp, "\nVertex Total:%ld", dwTemp );
// 产生法线
tri->mesh.buildNormals ();
SceneVertex SaveVertex;
for ( int nLoopy = 0; nLoopy < tri->mesh.numFaces; nLoopy++ )
{
fprintf( fp, "\n\nFace:%ld", nLoopy );
for ( int nLoopz = 0; nLoopz < 3; nLoopz++ )
{
fprintf( fp, "\n Vertix:%ld", nLoopz );
WORD wIndex = nLoopz;
// 得到顶点位置
DWORD lOffset = tri->mesh.faces[nLoopy].v[wIndex];
SaveVertex.x = tri->mesh.verts[lOffset].x;
SaveVertex.y = tri->mesh.verts[lOffset].y;
SaveVertex.z = -tri->mesh.verts[lOffset].z;
// 得到顶点法线
Point3 VertexNormal;
VertexNormal = tri->mesh.getFaceNormal ( nLoopy );
SaveVertex.nx = VertexNormal.x;
SaveVertex.ny = VertexNormal.y;
SaveVertex.nz = -VertexNormal.z;
// 得到贴图坐标
lOffset = tri->mesh.tvFace[nLoopy].t[wIndex];
SaveVertex.u = tri->mesh.tVerts[lOffset].x;
SaveVertex.v = 1 - tri->mesh.tVerts[lOffset].y;
// 写入顶点信息
//fwrite ( &SaveVertex, sizeof ( SaveVertex ), 1, m_ExpFile );
fprintf( fp, "\n Point :%f,%f,%f",
SaveVertex.x, SaveVertex.y, SaveVertex.z );
fprintf( fp, "\n Normal :%f,%f,%f",
SaveVertex.nx, SaveVertex.ny, SaveVertex.nz );
fprintf( fp, "\n Texture :%f,%f",
SaveVertex.u, SaveVertex.v );
}
}// for 写入顶点数据完毕
// 写入初始化矩阵
D3DMATRIX SaveMatrix;
Point3 point[4];
// 得到运动矩阵
Matrix3 matrix = node->GetObjectTM ( 0 );
point[0] = matrix.GetRow ( 0 );
point[1] = matrix.GetRow ( 1 );
point[2] = matrix.GetRow ( 2 );
point[3] = matrix.GetRow ( 3 );
// 坐标系转换
point[0].z = -point[0].z;
point[1].z = -point[1].z;
point[2].x = -point[2].x;
point[2].y = -point[2].y;
point[3].z = -point[3].z;
D3DXMatrixIdentity ( ( D3DXMATRIX* )&SaveMatrix );
SaveMatrix._11 = point[0].x;
SaveMatrix._12 = point[0].y;
SaveMatrix._13 = point[0].z;
SaveMatrix._21 = point[1].x;
SaveMatrix._22 = point[1].y;
SaveMatrix._23 = point[1].z;
SaveMatrix._31 = point[2].x;
SaveMatrix._32 = point[2].y;
SaveMatrix._33 = point[2].z;
SaveMatrix._41 = point[3].x;
SaveMatrix._42 = point[3].y;
SaveMatrix._43 = point[3].z;
fprintf( fp, "\n\nMatrix" );
for( long i = 0; i < 4; i++ )
{
fprintf( fp, "\n%f,%f,%f,%f",
SaveMatrix.m[i][0],
SaveMatrix.m[i][1],
SaveMatrix.m[i][2],
SaveMatrix.m[i][3] );
}
}
}
break;
}
m_dwNowNode++;
m_lpInterface->ProgressUpdate ( ( int )( ( float )m_dwNowNode / m_dwNodeCount * 100.0f ) );
return TREE_CONTINUE;
}Top
23 楼blue_nova(蓝色冲击波)回复于 2002-03-06 20:54:21 得分 15
用3D Exploration吧,功能很强的,可以把各种格式的文件(包括和.max,.3ds)变成.x文件,而且生成现成的源代码。
下载地址:http://soft.km169.net/soft/html/3337.htmTop
24 楼kimryo(God is on my side)回复于 2002-03-07 10:42:30 得分 0
谢谢大家,加分结贴。有问题再来问。Top




