Board logo

标题: [其他] 命令行 三维模型渲染绘制器 [打印本页]

作者: slimay    时间: 2021-7-15 17:47     标题: 命令行 三维模型渲染绘制器

v v.exe
摘要:命令行下的 ASE、PLY 三维模型文件绘制工具。不足50KB, cpu使用率不到百分之一,黑窗口下高质量渲染三维模型

版本:1.8
用法:(控制台窗口输入命令)
vv [ASE文件路径]

下载链接:https://pan.baidu.com/s/1atnT6S0j0-_zKuUMI5vhFg
提取码:ypd9
请及时下载,失效后不在补更
  1. 控制:
  2. A、D 按键控制图像 左右旋转
  3. W、S 按键控制图像 上下旋转
  4. Q、E 按键控制图像 Z轴倾斜
  5. Z、X 按键控制图像 缩放
  6. O、P 按键控制灯光强弱
  7. Y 按键 开启、关闭 二级旋转开关
  8. U 按键 渲染模式切换: 1.面渲染 2.点渲染 3.线渲染 4.白模渲染
  9. I 按键 开启、关闭 材质加强渲染开关
  10. R 按键重置图像,复位键
  11. 空格键 控制图像 暂停、旋转
  12. 回车键 控制程序 关闭
  13. 2、8 按键控制图像 上下平移
  14. 4、6 按键控制图像 左右平移
  15. 7、9 按键控制图像 里外平移
  16. 补充:
  17. 附带的FreeImage.dll图像插件如果删除,vv.exe将会启用内置gdiplus显示模型。
  18. 脱离FreeImage图像插件后,vv将无法加载dds、tga等纹理贴图,但此时可实现在
  19. PE下独立运行。
复制代码


ASE文件解析核心
  1. int readAseData( char* aseFile )
  2. {
  3. FILE* fp = fopen(aseFile , "rb" );
  4. if( fp == NULL )
  5. {
  6. printf( "Needs ase file in!\n" );
  7. exit( 1 );
  8. }
  9. // 获取ASE文件路径
  10. char materPath[MAX_PATH];
  11. materPath[0] = 0; //初始化为空字符串
  12. char* p = strrchr(aseFile, '\\');
  13. if(p != NULL)
  14. {
  15. *(p + 1) = '\0';
  16. strcpy(materPath, aseFile);
  17. }
  18. // 计算ASE文件后缀路径添加位置
  19. char* addSuffixPathPos = (char*)materPath + strlen(materPath);
  20. char line[LINE_SIZE + 1];
  21. line[0] = 0;  //初始化为空字符串
  22. int flag[5] = {0};
  23. int preADD = 0;
  24. int _tpreADD = 0;
  25. int materIndex = 0;
  26. while( !feof( fp ) )
  27. {
  28. fgets( line, 1024, fp );
  29. if( strstr( line, "*MATERIAL" ) != NULL )
  30. {
  31. int n;
  32. if(sscanf( line, " *MATERIAL %d", &n) != 0 )
  33. {
  34. materCount ++;
  35. materIndex = abs(n) % MAX_MESH;
  36. readMaterCount[materIndex] = materCount;
  37. // 先初默认纹理编号为白色纹理编号
  38. materials[materCount].texture = 0;
  39. continue;
  40. }
  41. }
  42. if( strstr( line, "*MATERIAL_AMBIENT" ) != NULL )
  43. {
  44. float f1 = 0.0f, f2 = 0.0f, f3 = 0.0f;
  45. if(sscanf( line, " *MATERIAL_AMBIENT %f %f %f", &f1, &f2, &f3) != 0 )
  46. {
  47. ((materials[materCount]).ambient)[0] = f1;
  48. ((materials[materCount]).ambient)[1] = f2;
  49. ((materials[materCount]).ambient)[2] = f3;
  50. continue;
  51. }
  52. }
  53. if( strstr( line, "*MATERIAL_DIFFUSE" ) != NULL )
  54. {
  55. float f1 = 0.0f, f2 = 0.0f, f3 = 0.0f;
  56. if(sscanf( line, " *MATERIAL_DIFFUSE %f %f %f", &f1, &f2, &f3) != 0 )
  57. {
  58. ((materials[materCount]).diffuse)[0] = f1;
  59. ((materials[materCount]).diffuse)[1] = f2;
  60. ((materials[materCount]).diffuse)[2] = f3;
  61. continue;
  62. }
  63. }
  64. if( strstr( line, "*MATERIAL_SPECULAR" ) != NULL )
  65. {
  66. float f1 = 0.0f, f2 = 0.0f, f3 = 0.0f;
  67. if(sscanf( line, " *MATERIAL_SPECULAR %f %f %f", &f1, &f2, &f3) != 0 )
  68. {
  69. ((materials[materCount]).specular)[0] = f1;
  70. ((materials[materCount]).specular)[1] = f2;
  71. ((materials[materCount]).specular)[2] = f3;
  72. continue;
  73. }
  74. }
  75. if( strstr( line, "*MATERIAL_EMISSION" ) != NULL )
  76. {
  77. float f1 = 0.0f, f2 = 0.0f, f3 = 0.0f;
  78. if(sscanf( line, " *MATERIAL_AMBIENT %f %f %f", &f1, &f2, &f3) != 0 )
  79. {
  80. ((materials[materCount]).emission)[0] = f1;
  81. ((materials[materCount]).emission)[1] = f2;
  82. ((materials[materCount]).emission)[2] = f3;
  83. continue;
  84. }
  85. }
  86. if( strstr( line, "*MATERIAL_SHINE" ) != NULL )
  87. {
  88. float f1;
  89. if(sscanf( line, " *MATERIAL_SHINE %f", &f1) != 0 )
  90. {
  91. (materials[materCount]).shine = f1;
  92. }
  93. }
  94. if( strstr( line, "*MATERIAL_TRANSPARENCY" ) != NULL )
  95. {
  96. float f1;
  97. if(sscanf( line, " *MATERIAL_TRANSPARENCY %f", &f1) != 0 )
  98. {
  99. (materials[materCount]).alpha = f1;
  100. }
  101. }
  102. if( strstr( line, "*MESH_NUMVERTEX" ) != NULL )
  103. {
  104. continue;
  105. }
  106. if( strstr( line, "*MESH_NUMFACES" ) != NULL )
  107. {
  108. continue;
  109. }
  110. if( strstr( line, "*MATERIAL_REF" ) != NULL )
  111. {
  112. int ni = -1;
  113. if( sscanf( line, " *MATERIAL_REF %d", &ni ) != 0 )
  114. {
  115. materIndex = abs(ni) % MAX_MESH;
  116. meshIndex[meshIncount ++ ] = readMaterCount[materIndex];
  117. continue;
  118. }
  119. }
  120. if( strstr( line, "*MAP_DIFFUSE" ) != NULL )
  121. {
  122. flag[4] = 1;
  123. continue;
  124. }
  125. if( flag[4] == 1 )
  126. {
  127. if( strstr( line, "*BITMAP" ) != NULL )
  128. {
  129. char pStr[MAX_PATH];
  130. if( sscanf( line, " *BITMAP \"%[^\"]\"", &pStr ) != 0 )
  131. {
  132. //检查材质路径是否为绝对路径
  133. p = strrchr(pStr, ':');
  134. //如果是相对路径,
  135. if(p == NULL)
  136. {
  137. // 则附在ASE文件的路径后边附加上材质相对路径
  138. strcpy(addSuffixPathPos , pStr);
  139. // 将拼接的材质总路径复制回 pStr容器中
  140. strcpy(pStr, materPath);
  141. }
  142. flag[4] = 0;
  143. continue;
  144. }
  145. }
  146. }
  147. if( strstr( line, "*MESH_VERTEX_LIST" ) != NULL )
  148. {
  149. flag[0] = 1;
  150. continue;
  151. }
  152. if( flag[0] == 1 )
  153. {
  154. char* keyPos = strstr( line, "*MESH_VERTEX" );
  155. if( keyPos != NULL )
  156. {
  157. int a;
  158. float f1, f2, f3;
  159. sscanf( line, " *MESH_VERTEX %d %f %f %f", &a, &f1, &f2, &f3 );
  160. pointData[pointCount][0] = f1;
  161. pointData[pointCount][1] = f2;
  162. pointData[pointCount][2] = f3;
  163. pointCount ++;
  164. }
  165. else
  166. {
  167. flag[0] = 0;
  168. }
  169. }
  170. if( strstr( line, "*MESH_FACE_LIST" ) != NULL )
  171. {
  172. flag[1] = 1;
  173. continue;
  174. }
  175. if( flag[1] == 1 )
  176. {
  177. char* keyPos = strstr( line, "*MESH_FACE" );
  178. if( keyPos != NULL )
  179. {
  180. int a;
  181. int f1, f2, f3;
  182. sscanf( line, " *MESH_FACE %d: A: %d B: %d C: %d", &a, &f1, &f2, &f3 );
  183. faceData[faceCount][0] = (abs(f1) + preADD) % pointCount;
  184. faceData[faceCount][1] = (abs(f2) + preADD) % pointCount;
  185. faceData[faceCount][2] = (abs(f3) + preADD) % pointCount;
  186. faceCount ++;
  187. }
  188. else
  189. {
  190. flag[1] = 0;
  191. preADD = pointCount;
  192. }
  193. }
  194. if( strstr( line, "*MESH_TVERTLIST" ) != NULL )
  195. {
  196. flag[2] = 1;
  197. continue;
  198. }
  199. if( flag[2] == 1 )
  200. {
  201. char* keyPos = strstr( line, "*MESH_TVERT" );
  202. if( keyPos != NULL )
  203. {
  204. int a;
  205. float f1, f2, f3;
  206. sscanf( line, " *MESH_TVERT %d %f %f %f", &a, &f1, &f2, &f3 );
  207. _tpointData[_tpointCount][0] = f1;
  208. _tpointData[_tpointCount][1] = f2;
  209. _tpointData[_tpointCount][2] = f3;
  210. _tpointCount ++;
  211. }
  212. else
  213. {
  214. flag[2] = 0;
  215. }
  216. }
  217. if( strstr( line, "*MESH_TFACELIST" ) != NULL )
  218. {
  219. flag[3] = 1;
  220. continue;
  221. }
  222. if( flag[3] == 1 )
  223. {
  224. char* keyPos = strstr( line, "*MESH_TFACE" );
  225. if( keyPos != NULL )
  226. {
  227. int a;
  228. int f1, f2, f3;
  229. sscanf( line, " *MESH_TFACE %d %d %d %d", &a, &f1, &f2, &f3 );
  230. _tfaceData[_tfaceCount][0] = (abs(f1) + _tpreADD) % _tpointCount;
  231. _tfaceData[_tfaceCount][1] = (abs(f2) + _tpreADD) % _tpointCount;
  232. _tfaceData[_tfaceCount][2] = (abs(f3) + _tpreADD) % _tpointCount;
  233. _tfaceCount ++;
  234. }
  235. else
  236. {
  237. flag[3] = 0;
  238. _tpreADD = _tpointCount;
  239. meshDelimsIndex[++ meshDelimsCount] = _tfaceCount;
  240. }
  241. }
  242. }
  243. fclose( fp );
  244. return 0;
  245. }
复制代码





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2