找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 28259|回复: 3

[游戏娱乐] 批处理 3D 旋转

[复制链接]
发表于 2014-9-13 12:50:54 | 显示全部楼层 |阅读模式
发过一个球体 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. )
复制代码

评分

参与人数 3PB +20 技术 +8 收起 理由
Taurus + 1 good job
CrLf + 20 + 1
523066680 + 6 字符3D独特而惊艳。

查看全部评分

发表于 2014-9-13 14:36:27 | 显示全部楼层
本帖最后由 523066680 于 2014-9-13 15:08 编辑

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

突然想起了BCCN的 一笔苍穹。好像原名叫董凯
http://bbs.bccn.net/search.php?searchid=24&orderby=lastpost&ascdesc=desc&searchsubmit=yes
[原创]给我一个画点函数,我能描绘出整个世界!
发表于 2014-9-13 15:21:00 | 显示全部楼层
空间坐标系: X 正向右, Y 正向上, Z 正向着你, 小心被扎到哦.

卧槽,看到这句,害得我不敢直视显示器
发表于 2020-11-14 14:15:32 | 显示全部楼层
nbbnbnnnnbnbbnb
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 20:18 , Processed in 0.021239 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表