1)你如何添加一个精灵这是不一个细胞,就像Wolfenstein 3D中的敌人一样?
2)你如何制作墙壁图像,而不是颜色块?
1)你如何添加一个精灵这是不一个细胞,就像Wolfenstein 3D中的敌人一样?
2)你如何制作墙壁图像,而不是颜色块?
纹理
第一次看到Ray Casting with different height size
你需要的是改变你的引擎使用纹理的扫描线渲染。上述链接中的代码仅供初学者使用(在代码中查找// render scan line
),并且可用于墙壁,但天花板和地板会出现扭曲。要解决您的问题,您需要申请perspective correct texture mapping。
这是怎么样子(后我把它落实到以前的代码我联系)
void Doom3D::draw_scanline(int sx,int sy0,int sy1,int sz0,int sz1,int symin,int tx0,int ty0,int tx1,int ty1,DWORD li)
{
//
union { DWORD dd; BYTE db[4]; } cc;
int Txs=txs*tn;
if (sz0==sz1) // affine texture mapping (front side of walls)
{
int sy,tx,ty,ktx,kty,dtx,dty,ctx,cty,dsy;
dsy=sy1-sy0; if (dsy<0) dsy=-dsy;
ktx=0; dtx=tx1-tx0; if (dtx>0) ktx=+1; else { ktx=-1; dtx=-dtx; } tx=tx0; ctx=0;
kty=0; dty=ty1-ty0; if (dty>0) kty=+1; else { kty=-1; dty=-dty; } ty=ty0; cty=0;
if (dsy) for (sy=sy0;sy>=sy1;sy--)
{
if ((sy>=0)&&(sy<sys)&&(sy<=symin))
if ((tx>=0)&&(tx<Txs)&&(ty>=0)&&(ty<tys))
{
cc.dd=ptxr[ty][tx];
cc.db[0]=DWORD((DWORD(cc.db[0])*li)>>8);
cc.db[1]=DWORD((DWORD(cc.db[1])*li)>>8);
cc.db[2]=DWORD((DWORD(cc.db[2])*li)>>8);
pscr[sy][sx]=cc.dd;
}
for (ctx+=dtx;ctx>=dsy;) { ctx-=dsy; tx+=ktx; }
for (cty+=dty;cty>=dsy;) { cty-=dsy; ty+=kty; }
}
}
else{ // perspective correct mapping (floor, top side of walls, ceiling)
int sy,tx,ty,dsy,dtx,dty,_n,n,dn;
int a,b,_z0,_z1;
const int acc=15;
dsy=sy1-sy0; n=abs(dsy); dn=n;
dtx=tx1-tx0; n=abs(dtx); if (dn<n) dn=n;
dty=ty1-ty0; n=abs(dty); if (dn<n) dn=n;
if (sz0==0) return; _z0=(1<<acc)/sz0;
if (sz1==0) return; _z1=(1<<acc)/sz1;
if (dn) for (n=0;n<=dn;n++)
{
sy=sy0+((n*dsy)/dn);
tx=tx0+((n*dtx)/dn);
ty=ty0+((n*dty)/dn);
// perspective correction (https://en.wikipedia.org/wiki/Texture_mapping)
_n=dn-n;
a=(_n*tx0*_z0) + (n*tx1*_z1);
b=(_n *_z0) + (n *_z1); tx=a/b;
a=(_n*ty0*_z0) + (n*ty1*_z1);
b=(_n *_z0) + (n *_z1); ty=a/b;
if ((sy>=0)&&(sy<sys)&&(sy<=symin))
if ((tx>=0)&&(tx<Txs)&&(ty>=0)&&(ty<tys))
{
cc.dd=ptxr[ty][tx];
cc.db[0]=DWORD((DWORD(cc.db[0])*li)>>8);
cc.db[1]=DWORD((DWORD(cc.db[1])*li)>>8);
cc.db[2]=DWORD((DWORD(cc.db[2])*li)>>8);
pscr[sy][sx]=cc.dd;
}
}
}
}
的sx,sy0,sy1
是屏幕的协调扫描线tx0,ty0,tx1,ty1
的是纹理坐标和l0,l1
从相机的距离。 li
只是光线强度。纹理坐标是每个网格单元命中坐标的小数部分。使用的纹理是图集,因此x坐标也编码使用哪个纹理。
在此之上,你还应该添加纹理贴图(接近投射单元尺寸使用的纹理分辨率),这将避免像素的远处波光粼粼的墙壁上,而移动或转身......
精灵
对于每个对象计算其相对于玩家的极坐标。所以你会有角度(相对于视图方向)和距离。您可以从远处直接从角度和屏幕y0,y1
计算屏幕x
。从那里只是渲染每个扫描线+/-计算位置周围的精灵宽度。你不需要为精灵透视修正纹理映射,因为它们总是垂直于玩家...
我认为这是唯一的发动机怎么看光线投射作品,而不是引擎来创建游戏 - 它没有任何功能来放置精灵并绘制图像。您必须自行添加此功能。 – furas
我完成了我的答案的编辑。 – Spektre