Board logo

标题: [游戏娱乐] 批处理 3D 旋转 [打印本页]

作者: neorobin    时间: 2014-9-13 12:50     标题: 批处理 3D 旋转

发过一个球体 http://www.bathome.net/thread-31264-1-1.html  是 dostips 上的外国人做的.
因为是以坐标轴方向为视线方向, 而且球面在 比较 远处始终可近似认为 正好朝着观察者的半个球面是可见的(实际上小于半个球面)
这样, 消隐算法可以简化成对单一坐标数值的检测. 比如 z > 0 可见, 否则, 不可见.

这里做了一个, 很简单的, 物体不是 "体" 一个面而已, 就不管消隐了, 为了简化.
空间坐标系: X 正向右, Y 正向上, Z 正向着你, 小心被扎到哦.

旋转轴 没有采用任意轴, 而是 过原点的, 由两点确定 {0,0,0} -- {u,v,w}, 而且须 u^2 + v^2 + w^2 = 100 (原始公式  u^2 + v^2 + w^2 = 1, 这里为了把 u,v,w 都放大 10 倍)
u,v,w 的组合:
{10,0,0}  绕 X 轴
{0,10,0}  绕 Y 轴
{0,0,10}  绕 Z 轴
运行速度并不理想, 呃, 我没有提速的好点子了
  1. @echo off & setlocal enabledelayedexpansion & color 0a & chcp 437 & title CMD 3D
  2. if "%1"=="" (
  3. for %%a in (  FontSize:00080008 FontFamily:00000030 WindowSize:00560055
  4.   ScreenColors:0000000f CodePage:000001b5 ScreenBufferSize:00560055
  5. ) do for /f "tokens=1,2 delims=:" %%b in ("%%a") do (
  6. >nul reg add HKCU\Console\3D_ROTATE /v %%b /t reg_dword /d 0x%%c /f
  7. )
  8. start "3D_ROTATE" /max "%ComSpec%" /c "%~s0" 1&goto:eof
  9. ) else (
  10. >nul reg delete HKCU\Console\3D_ROTATE /f
  11. )
  12. set "SIN=(A-A*A/1875*A/320000+A*A/1875*A/15625*A/16000*A/2560000-A*A/1875*A/15360*A/15625*A/15625*A/16000*A/44800000)"
  13. set "COS=(10000-A*A/20000+A*A/1875*A/15625*A/819200-A*A/1875*A/15360*A/15625*A/15625*A/10240000+A*A/1875*A/15360*A/15625*A/15625*A/16000*A/15625*A/229376000)"
  14. set /a "ZM=10000, p=31416, p2=62832, pn2=-62832, p#2=15708, p3#2=47124, p3#2_=p3#2-1, DEG=31416/180"
  15. set "DOT=?
  16. for %%a in ( "######  ###### "
  17.          "     ## ##   ##"
  18.          "  ####  ##   ##"
  19.          "     ## ##   ##"
  20.          "     ## ##   ##"
  21.          "######  ###### "   ) do (
  22. set "s1=!s1!%%~a="
  23. )
  24. set "s1=!s1:#=%DOT%!"
  25. set "t=" & set /a "x=0,y=0,pcnt=0"
  26. for /l %%a in (0 1 300) do (
  27. if "!s1:~%%a,1!" equ "%DOT%" (
  28. set /a "pcnt+=1"
  29. set /a "xs!pcnt!=(x-7)*3,ys!pcnt!=(y-3)*3"
  30. )
  31. if "!s1:~%%a,1!" equ "=" (set /a "y+=1,x=0") else (set /a "x+=1")
  32. )
  33. set /a "wid=0X55, Cols=wid, lines=wid+1, iMax=wid*wid"
  34. MODE !Cols!,!lines!
  35. for /l %%i in (1 1 !iMax!) do set "scr= !scr!"
  36. set "emp=!scr!"
  37. set /a "th=0, XC = Cols/2, YC = lines/2, zscr = 30, zeye = 200, zs = zscr, u = 6, v = 8, w = 0"
  38. for /l %%a in () do (
  39. set /a "th+=p2+10*DEG, th %%= p2, th += th>>31&p2, t=th, s1=(t-p#2^t-p3#2)>>31, s3=p3#2_-t>>31, t=(-t&s1)+(t&~s1)+(p&s1)+(pn2&s3), SINt=%SIN:A=t%, t=%COS:A=t%, COSt=(-t&s1)+(t&~s1)"
  40. for /l %%i in (1 1 !pcnt!) do (
  41. set /a "zs2e=zscr-zeye,uxvywz=u*xs%%i+v*ys%%i+w*zs,v_1_COSt=ZM-COSt,uvwM1_COSt=uxvywz*v_1_COSt,z_t2eye_ZM=(w*uvwM1_COSt/100+zs*COSt+(-v*xs%%i+w*ys%%i)*SINt/10)-zeye*ZM, x=XC + (u*uvwM1_COSt/100 + xs%%i*COSt + (-w*ys%%i + v*zs)*SINt/10)*zs2e/z_t2eye_ZM, y=YC + (v*uvwM1_COSt/100 + ys%%i*COSt + (+w*xs%%i - u*zs)*SINt/10)*zs2e/z_t2eye_ZM, inScr=(x-0^x-wid)&(y-0^y-wid)"
  42. if !inScr! lss 0 (
  43. set /a "ind=x+y*wid+1, lenL=ind-1, lenR=iMax-ind"
  44. for /f "tokens=1,2,3" %%a in ("!lenL! !ind! !lenR!") do (set scr=!scr:~0,%%a!!DOT!!scr:~%%b,%%c!)
  45. )
  46. )
  47. cls &(<nul set /p=!scr:~0,-1!)
  48. set "scr=!emp!"
  49. )
复制代码

作者: 523066680    时间: 2014-9-13 14:36

本帖最后由 523066680 于 2014-9-13 15:08 编辑

这种用字符组成的效果和高分辨率的光栅化渲染比起来,却有一种独特而惊艳的感觉。
要说效率的话,我觉得还是用其他语言操作控制台吧,省心。

突然想起了BCCN的 一笔苍穹。好像原名叫董凯
http://bbs.bccn.net/search.php?searchid=24&orderby=lastpost&ascdesc=desc&searchsubmit=yes
[原创]给我一个画点函数,我能描绘出整个世界!
作者: CrLf    时间: 2014-9-13 15:21

空间坐标系: X 正向右, Y 正向上, Z 正向着你, 小心被扎到哦.

卧槽,看到这句,害得我不敢直视显示器
作者: battih0211    时间: 2020-11-14 14:15

nbbnbnnnnbnbbnb




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