自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

HTML 5實現(xiàn)3D迷宮

開發(fā) 前端
在之前的一篇文章:《javascript實現(xiàn)3D房間》中,3D效果的實現(xiàn)只局限于平面(意思是從側(cè)面看沒有立體效果),在這種有局限性的3D效果中,我們以一個個物體為單位,通過不同物體平面之間的視覺差實現(xiàn)3D。而在這次的效果中,為了使物體從不同角度看都能具有立體效果,我們把單位從平面改成線。

功能描述:

左右方向鍵控制玩家的方向,上下方向鍵控制玩家的前進和后退。

效果預(yù)覽:

 

51CTO推薦專題:HTML 5 下一代Web開發(fā)標準詳解

實現(xiàn)原理:

在上面的效果預(yù)覽中,可以看到右邊是2D的平面地圖,而左邊的則是***人稱的3D視圖,這兩幅圖的關(guān)系是非常密切的,實質(zhì)上,實現(xiàn)3D視覺的過程,就是依據(jù)2D地圖把地圖轉(zhuǎn)換成***人稱視覺的過程。

在之前的一篇文章:《javascript實現(xiàn)3D房間》中,3D效果的實現(xiàn)只局限于平面(意思是從側(cè)面看沒有立體效果),在這種有局限性的3D效果中,我們以一個個物體為單位,通過不同物體平面之間的視覺差實現(xiàn)3D。而在這次的效果中,為了使物體從不同角度看都能具有立體效果,我們把單位從平面改成線。

首先,我們創(chuàng)建一個叫視覺平面的東西,它像一面鏡子,把實物投影到一個平面上,首先初始化該平面的尺寸:

  1. screenSize:[320,240],//視覺屏幕尺寸 

之后,我們可以以1像素為單位,只要知道物體每個像素在該視覺平面上顯示出來的高度,就可以繪制出物體在***人稱視覺上的效果。

以視覺平面上的***個像素線段為例,根據(jù)比例可得知:玩家到視覺平面的距離/玩家到物體的實際距離=物體在視覺平面上的高度/物體的實際高度。由于玩家到視覺平面的距離和物體的實際高度我們可以自己定義,因此我們只要知道玩家到物體的距離,就可以知道物體該像素在視覺平面的高度。

怎樣知道玩家到物體的實際距離呢?這時我們就需要借助和3D視覺圖密切相關(guān)的2D地圖了。首先,我們定義玩家的***視覺角度為60度(意思是玩家的視覺范圍角度),由于我們現(xiàn)在處理的是平面的***條像素線,因此該像素線相對于玩家的角度就為-30度。在地圖上,我們可以知道玩家的X,Y位置和玩家的方向,因此我們就可以知道***條像素線在地圖上的方向。

在2D地圖上怎么表示3D視覺平面上的一條像素線呢?其實仔細想想就可以發(fā)現(xiàn),3D視覺平面中的一條像素線,相當于2D地圖上特定方向上發(fā)出的一條射線,射線與物體的交點就是3D視覺平面中的那條像素線的內(nèi)容。因此,只要我們計算出該射線的長度(起點:玩家位置 終點:射線和物體相交的位置),就可以知道玩家與物體的距離,從而求得改像素的物體在視覺平面上的高度。

***只要循環(huán)遍歷視覺平面上的每一條1px寬的像素線,并根據(jù)2D地圖上對應(yīng)射線的長度,就可以求得視覺平面上所有視覺范圍內(nèi)的物體每一像素的高度,形成3D視覺效果。

代碼分析:

主要看實現(xiàn)的核心代碼,循環(huán)遍歷視覺平面上每條像素線,繪制出該像素線上的物體內(nèi)容:

  1. var context=this.screenContext;  
  2.  
  3.     context.clearRect(0,0,this.screenSize[0],this.screenSize[1]);  
  4.     context.fillStyle="rgb(203,242,238)";  
  5.     context.fillRect(0,0,this.screenSize[0],this.screenSize[1]/2);  
  6.     context.fillStyle="rgb(77,88,87)";  
  7.     context.fillRect(0,this.screenSize[1]/2,this.screenSize[0],this.screenSize[1]/2); 

由于該效果需要兩個canvas(一個顯示地圖,一個顯示3D視覺圖),因此我們首先獲取3D視覺圖上的canvas,并繪制地面和天空。

  1. //cnGame.context.beginPath();  
  2.     for(var index=0,colCount=this.screenSize[0]/this.viewColWidth;index<colCount;index++){  
  3.         screenX=-this.screenSize[0]/2+index*this.viewColWidth;//該豎線在屏幕的x坐標      
  4.         colAngle=Math.atan(screenX/this.screenDistant);//玩家的視線到屏幕上的豎線所成的角度  
  5.         colAngle%=2*Math.PI;  
  6.         var angle=this.player.angle/180*(Math.PI)-colAngle;//射線在地圖內(nèi)所成的角度  
  7.         angle%=2*Math.PI;  
  8.         if(angle<0){  
  9.             angle+=2*Math.PI;  
  10.         }  
  11.         distant=0;  
  12.         x=0;  
  13.         y=0;  
  14.         centerX=this.player.x+(this.player.width)/2;//玩家中點X坐標  
  15.         centerY=this.player.y+(this.player.height)/2;//玩家中Y坐標  
  16.         while(this.map.getPosValue(centerX+x,centerY-y)==0){  
  17.             distant+=1;  
  18.             x=distant*Math.cos(angle);  
  19.             y=distant*Math.sin(angle);  
  20.         }  
  21.         //如果射線在地圖遇到墻壁,則畫線  
  22.         /*cnGame.context.strokeStyle="#000";      
  23.         cnGame.context.moveTo(centerX,centerY);  
  24.         cnGame.context.lineTo(centerX+x,Math.floor(centerY-y));  
  25.         cnGame.context.closePath();  
  26.         */  
  27.           
  28.         distant*=Math.cos(colAngle);//防止魚眼效果  
  29.       
  30.         heightInScreen=this.screenDistant/(distant)*this.wallSize[2];//根據(jù)玩家到墻壁的距離計算墻壁在視覺平面的高度  
  31.         var img=cnGame.loader.loadedImgs[srcObj.stone2];  
  32.         context.drawImage(img,0,0,2,240,this.viewColWidth*index,(this.screenSize[1]-heightInScreen)/2, this.viewColWidth,heightInScreen)      
  33.     } 

之后,就可以開始循環(huán)遍歷每條像素線,繪制出物體內(nèi)容。在處理每條像素線的過程中,我們讓射線每次增加1像素的長度,當射線遇到非空地的時候(getPosValue(x,y)>0),就停止增長,并記錄下此時射線的長度,該長度就是玩家到該像素線內(nèi)容的實際距離。

上面代碼中,注釋掉的部分其實就是用于繪制出發(fā)射的射線,如果大家有需要,可以恢復(fù)該部分的代碼,就可以看到玩家的視覺范圍。

需要注意的是,由于視覺平面有區(qū)別人的眼球(是一個平面而非球體),因此我們還需要使距離乘上玩家視覺角度的余弦值,從而避免了魚眼效果。

***,我們還可以在3D視覺圖上繪制出玩家(拿槍的手),達到更好的效果。

完整demo下載:點擊下載

原文:http://www.cnblogs.com/Cson/archive/2012/02/27/2368955.html

【編輯推薦】

  1. HTML 5中的文件處理之FileAPI
  2. HTML 5 Canvas組件繪制太極圖案
  3. HTML 5開發(fā):地理位置定位指南
  4. 一句代碼實現(xiàn)HTML 5淘寶語音搜索
  5. 使用HTML 5和CSS3制作登錄頁面完整步驟
責任編輯:陳貽新 來源: Cson's Room
相關(guān)推薦

2014-09-12 10:30:51

HTML5熱力圖

2012-04-24 15:07:49

HTML5

2015-10-08 08:48:37

HTML53D網(wǎng)絡(luò)拓撲樹

2015-06-26 11:51:26

HTML5JavaScript

2009-12-14 08:58:25

HTML5網(wǎng)頁3DWebGL

2012-06-16 16:57:52

WebGL

2014-02-24 11:43:44

HTML5機房監(jiān)控

2011-05-26 10:55:39

2021-09-16 07:52:18

SwiftUScroll效果

2022-09-19 19:16:42

輪播圖has

2011-05-26 10:08:14

2011-10-06 13:30:45

宏碁投影儀

2017-07-12 23:08:03

白鷺引擎

2012-11-26 12:51:44

木材3D打

2023-05-26 07:08:05

CSS模糊實現(xiàn)文字

2010-06-09 10:50:08

OpenSUSE 3D

2019-11-18 10:22:01

深度學(xué)習編程人工智能

2015-12-07 09:05:37

HTML5動畫源碼

2015-04-03 11:40:08

Cocos 2015

2011-05-26 10:05:07

優(yōu)派投影機
點贊
收藏

51CTO技術(shù)棧公眾號