碼農(nóng)干貨系列【8】--世界上最簡單的3D渲染(no webgl)
2013-03-10 21:02 【當(dāng)耐特】 閱讀(4698) 評論(8) 收藏 舉報
簡介
進(jìn)行上圖所示的3D格子地板的渲染,需要進(jìn)行Canvas的像素級別操作,從視點連接屏幕(屏幕就是canvas)中的所有像素點,形成大量的射線,倘若射線與地板相交,把交點以及交點的顏色反饋給屏幕(canvas)。如下圖所示:
像素操作
在進(jìn)行3D渲染之前,必須了解Canvas的像素操作相關(guān)概念。在給定了width和height的canvas上,在坐標(biāo)(x ,y)上的像素的index構(gòu)成如下。
var data=getImageData(0, 0, canvas.width, canvas.height);
紅色index:((width * y) + x) * 4 像素值:data[((width * y) + x) * 4]
綠色index:((width * y) + x) * 4 + 1 像素值:data[((width * y) + x) * 4+1]
藍(lán)色index:((width * y) + x) * 4 + 2 像素值:data[((width * y) + x) * 4+2]
透明度index:((width * y) + x) * 4 + 3 像素值:data[((width * y) + x) * 4+3]
修改了任何像素的紅、綠、藍(lán)和alpha值之后,可以通過第二個函數(shù)來更新canvas上的顯示,那就是context.putImageData(imagedata, dx, dy)。
尋找交點
怎么找到射線與地板的交點?可以先列出已知的條件:
視點坐標(biāo)A、屏幕上的點坐標(biāo)B、交點P的Y坐標(biāo)(y=0),向量AP,BP共線。
根據(jù)上面的條件,利用兩兩向量共線(Ax-Px/Bx-Px = Ay-Py/By-Py = Az-Pz/Bz-Pz) 可以推導(dǎo)出交點的坐標(biāo)。
格子材質(zhì)
找到交點后,還剩下的問題就是根據(jù)z的坐標(biāo)渲染格子材質(zhì),如下面代碼所示:
(Math.ceil(cv.x / sideLength) + Math.ceil(cv.z / sideLength)) % 2 === 0
上面的cv為交點坐標(biāo),sideLength為地板格子編程,根據(jù)上面的true和false返回相應(yīng)的顏色值。
在線演示
修改代碼里面的變量值點擊run again試試!
Have Fun!

浙公網(wǎng)安備 33010602011771號