CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  游戏开发

DX创建较复杂的物体

楼主kimryo(God is on my side)2002-02-11 01:41:07 在 专题开发/技术/项目 / 游戏开发 提问

.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

相关问题

  • 三维物体
  • 物体阴影检测
  • 从CWnd类派生的子类是不自然就有一个窗口,还是需要创建才有?我只想用SetTimer向这个类对象周期性地发消息,应该不需要一个很复杂的窗口吧,哪位大侠能给详细讲讲怎样创建吗?如果很难可以不断加分!!
  • 关于物体移动的问题???
  • 求物体运动轨迹算法
  • DirectX中物体拾取的问题
  • 关于平移物体的问题.
  • 游戏中如何判断一个物体撞上另一个物体?,如:……
  • CWnd创建
  • Pen的创建

关键词

  • 文件
  • 物体
  • 转换
  • ds
  • 矩阵
  • 数据
  • savevertex
  • mesh
  • nloopy
  • vertexnormal

得分解答快速导航

  • 帖主:kimryo
  • gddsky
  • mjm_d
  • GaoYakun
  • CTimerain
  • RealRender
  • blue_nova

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo