麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > HTML > 正文

【HTML5】3D模型--百行代碼實(shí)現(xiàn)旋轉(zhuǎn)立體魔方實(shí)例

2024-08-26 00:19:17
字體:
供稿:網(wǎng)友

最近研究魔方的玩法,就突然想用HMTL5寫一個(gè)魔方的模型,由于魔方是一個(gè)3D的立方體,這次就試著用HTML5寫了一個(gè)簡單的3D模型。

下面是預(yù)覽畫面。

html5,3d,魔方旋轉(zhuǎn),3d立體旋轉(zhuǎn),實(shí)現(xiàn)3d旋轉(zhuǎn)

制作流程

首先你需要下載Html5開源庫件lufylegend-1.4.0

魔方分為6個(gè)面,每個(gè)面由9個(gè)小矩形組成,現(xiàn)在我把每個(gè)小矩形當(dāng)做一個(gè)類封裝起來,

因?yàn)楝F(xiàn)在建立的是一個(gè)3D魔方,所以要畫出每個(gè)小矩形,需要知道小矩形的4個(gè)定點(diǎn),而這4個(gè)定點(diǎn)會(huì)根據(jù)空間的旋轉(zhuǎn)角度而變換,所以為了計(jì)算出這4個(gè)定點(diǎn)坐標(biāo),需要知道魔方繞x軸和z軸旋轉(zhuǎn)的角度。

所以,建立矩形類如下

function Rect(pointA,pointB,pointC,pointD,angleX,angleZ,color){      base(this,LSprite,[]);      this.pointZ=[(pointA[0]+pointB[0]+pointC[0]+pointD[0])/4,(pointA[1]+pointB[1]+pointC[1]+pointD[1])/4,(pointA[2]+pointB[2]+pointC[2]+pointD[2])/4];      this.z = this.pointZ[2];      this.pointA=pointA,this.pointB=pointB,this.pointC=pointC,this.pointD=pointD,this.angleX=angleX,this.angleZ=angleZ,this.color=color;  }    Rect.prototype.setAngle = function(a,b){      this.angleX = a;      this.angleZ = b;      this.z=this.getPoint(this.pointZ)[2];  };  

pointA,pointB,pointC,pointD是小矩形的四個(gè)頂點(diǎn),angleX,angleZ分別是x軸和z軸旋轉(zhuǎn)的角度,color是小矩形的顏色。

魔方分為6個(gè)面,先看一下最前面的一面,如果以立方體的中心作為3D坐標(biāo)系的中心,那么9個(gè)小矩形的各個(gè)定點(diǎn)所對(duì)應(yīng)的坐標(biāo)如下圖所示

html5,3d,魔方旋轉(zhuǎn),3d立體旋轉(zhuǎn),實(shí)現(xiàn)3d旋轉(zhuǎn)

所以,前面這個(gè)面的9個(gè)小矩形可以由下面的代碼來建立

for(var x=0;x<3;x++){      for(var y=0;y<3;y++){          z = 3;          var rect = new Rect([-3*step + x*2*step,-3*step + y*2*step,-3*step + z*2*step],[-step + x*2*step,-3*step + y*2*step,-3*step + z*2*step],[-step + x*2*step,-step + y*2*step,-3*step + z*2*step],[-3*step + x*2*step,-step + y*2*step,-3*step + z*2*step],0,0,"#FF0000");          backLayer.addChild(rect);      }  }  

其中backLayer是一個(gè)LSprite類,step是半個(gè)小矩形的長,同樣的道理,可以也得到其他5個(gè)面。

6個(gè)面都建立了,在繪制這6個(gè)面之前,首先要根據(jù)旋轉(zhuǎn)的角度來計(jì)算各個(gè)定點(diǎn)的坐標(biāo),看下面的圖

html5,3d,魔方旋轉(zhuǎn),3d立體旋轉(zhuǎn),實(shí)現(xiàn)3d旋轉(zhuǎn)

根據(jù)上面的圖,用下面的公式即可得到變換后的定點(diǎn)坐標(biāo)

Rect.prototype.getPoint = function(p){      var u2,v2,w2,u=p[0],v=p[1],w=p[2];      u2 = u * Math.cos(this.angleX) - v * Math.sin(this.angleX);      v2 = u * Math.sin(this.angleX) + v * Math.cos(this.angleX);      w2 = w;      u = u2; v = v2; w = w2;      u2 = u;      v2 = v * Math.cos(this.angleZ) - w * Math.sin(this.angleZ);      w2 = v * Math.sin(this.angleZ) + w * Math.cos(this.angleZ);      u = u2; v = v2; w = w2;      return [u2,v2,w2];  };  

最后根據(jù)小矩形的四個(gè)定點(diǎn)坐標(biāo),來繪制這個(gè)矩形,

Rect.prototype.draw = function(layer){      this.graphics.clear();      this.graphics.drawVertices(1,"#000000",[this.getPoint(this.pointA),this.getPoint(this.pointB),this.getPoint(this.pointC),this.getPoint(this.pointD)],true,this.color);  };  

其中drawVertices是lufylegend.js庫件中LGraphics類的一個(gè)方法,它可以根據(jù)傳入的定點(diǎn)坐標(biāo)數(shù)組來繪制一個(gè)多邊形。

最后,給出完整代碼,代碼很少,JS代碼一共91行。

一,index.html

<!DOCTYPE html>  <html>  <head>  <meta charset="UTF-8">  <title>3D魔方</title>  </head>  <body>  <div id="mylegend">loading……</div>  <script type="text/javascript" src="../lufylegend-1.4.0.min.js"></script>   <script type="text/javascript" src="./Main.js"></script>   <script type="text/javascript" src="./Rect.js"></script>   </body>  </html>  

二,Rect類

function Rect(pointA,pointB,pointC,pointD,angleX,angleZ,color){      base(this,LSprite,[]);      this.pointZ=[(pointA[0]+pointB[0]+pointC[0]+pointD[0])/4,(pointA[1]+pointB[1]+pointC[1]+pointD[1])/4,(pointA[2]+pointB[2]+pointC[2]+pointD[2])/4];      this.z = this.pointZ[2];      this.pointA=pointA,this.pointB=pointB,this.pointC=pointC,this.pointD=pointD,this.angleX=angleX,this.angleZ=angleZ,this.color=color;  }  Rect.prototype.draw = function(layer){      this.graphics.clear();      this.graphics.drawVertices(1,"#000000",[this.getPoint(this.pointA),this.getPoint(this.pointB),this.getPoint(this.pointC),this.getPoint(this.pointD)],true,this.color);  };  Rect.prototype.setAngle = function(a,b){      this.angleX = a;      this.angleZ = b;      this.z=this.getPoint(this.pointZ)[2];  };  Rect.prototype.getPoint = function(p){      var u2,v2,w2,u=p[0],v=p[1],w=p[2];      u2 = u * Math.cos(this.angleX) - v * Math.sin(this.angleX);      v2 = u * Math.sin(this.angleX) + v * Math.cos(this.angleX);      w2 = w;      u = u2; v = v2; w = w2;      u2 = u;      v2 = v * Math.cos(this.angleZ) - w * Math.sin(this.angleZ);      w2 = v * Math.sin(this.angleZ) + w * Math.cos(this.angleZ);      u = u2; v = v2; w = w2;      return [u2,v2,w2];  };  

三,Main.js

init(50,"mylegend",400,400,main);  var a = 0,b=0,backLayer,step = 20,key = null;  function main(){      backLayer = new LSprite();      addChild(backLayer);      backLayer.x = 120,backLayer.y = 120;      //后      for(var x=0;x<3;x++){          for(var y=0;y<3;y++){              z = 0;              var rect = new Rect([-3*step + x*2*step,-3*step + y*2*step,-3*step + z*2*step],[-step + x*2*step,-3*step + y*2*step,-3*step + z*2*step],[-step + x*2*step,-step + y*2*step,-3*step + z*2*step],[-3*step + x*2*step,-step + y*2*step,-3*step + z*2*step],0,0,"#FF4500");              backLayer.addChild(rect);          }      }      //前      for(var x=0;x<3;x++){          for(var y=0;y<3;y++){              z = 3;              var rect = new Rect([-3*step + x*2*step,-3*step + y*2*step,-3*step + z*2*step],[-step + x*2*step,-3*step + y*2*step,-3*step + z*2*step],[-step + x*2*step,-step + y*2*step,-3*step + z*2*step],[-3*step + x*2*step,-step + y*2*step,-3*step + z*2*step],0,0,"#FF0000");              backLayer.addChild(rect);          }      }      //上      for(var x=0;x<3;x++){          for(var z=0;z<3;z++){              y = 0;              var rect = new Rect([-3*step + x*2*step,-3*step + y*2*step,-3*step + z*2*step],[-step + x*2*step,-3*step + y*2*step,-3*step + z*2*step],[-step + x*2*step,-3*step + y*2*step,-step + z*2*step],[-3*step + x*2*step,-3*step + y*2*step,-step + z*2*step],0,0,"#FFFFFF");              backLayer.addChild(rect);          }      }      //下      for(var x=0;x<3;x++){          for(var z=0;z<3;z++){              y = 3;              var rect = new Rect([-3*step + x*2*step,-3*step + y*2*step,-3*step + z*2*step],[-step + x*2*step,-3*step + y*2*step,-3*step + z*2*step],[-step + x*2*step,-3*step + y*2*step,-step + z*2*step],[-3*step + x*2*step,-3*step + y*2*step,-step + z*2*step],0,0,"#FFFF00");              backLayer.addChild(rect);          }      }      //左      for(var y=0;y<3;y++){          for(var z=0;z<3;z++){              x = 0;              var rect = new Rect([-3*step + x*2*step,-3*step + y*2*step,-3*step + z*2*step],[-3*step + x*2*step,-3*step + y*2*step,-step + z*2*step],[-3*step + x*2*step,-step + y*2*step,-step + z*2*step],[-3*step + x*2*step,-step + y*2*step,-3*step + z*2*step],0,0,"#008000");              backLayer.addChild(rect);          }      }      //右      for(var y=0;y<3;y++){          for(var z=0;z<3;z++){              x = 3;              var rect = new Rect([-3*step + x*2*step,-3*step + y*2*step,-3*step + z*2*step],[-3*step + x*2*step,-3*step + y*2*step,-step + z*2*step],[-3*step + x*2*step,-step + y*2*step,-step + z*2*step],[-3*step + x*2*step,-step + y*2*step,-3*step + z*2*step],0,0,"#0000FF");              backLayer.addChild(rect);          }      }      backLayer.addEventListener(LEvent.ENTER_FRAME,onframe);  }  function onframe(){      a += 0.1 , b += 0.1;      backLayer.childList = backLayer.childList.sort(function(a,b){return a.z - b.z;});      for(key in backLayer.childList){          backLayer.childList[key].setAngle(a,b);          backLayer.childList[key].draw(backLayer);     }  }  

這只是一個(gè)非常簡陋的3D模型,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到HTML教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美日韩电影在线 | 叉逼视频 | 蜜桃久久一区二区三区 | 视频一区二区三区在线播放 | 亚洲一区二区三区高清 | 国产精品久久久久久久久久电影 | 欧美性久久久 | free性欧美hd另类 | 久久草草影视免费网 | 毛片大全在线观看 | 久久精品日产第一区二区三区 | 欧美日韩高清一区二区三区 | 欧美黄一区 | 黄色网址免费进入 | 午夜精品小视频 | 欧美中文字幕一区二区三区亚洲 | 欧美一级二级毛片视频 | 亚洲精品午夜国产va久久成人 | 婷婷一区二区三区 | 亚洲一区二区国产 | 一区二区三区日韩精品 | 成人福利免费在线观看 | 午夜视频色 | 久久精品视频黄色 | 久久久久女人精品毛片九一 | 亚洲片在线观看 | 久久亚洲激情 | 久久精品com | 欧美大电影免费观看 | 免费观看视频网站 | 国产一区二区欧美 | 成人做爽爽爽爽免费国产软件 | 欧美日韩亚洲国产精品 | www深夜成人 | 国产成人高清在线观看 | 日日狠狠久久偷偷四色综合免费 | 国产 视频 一区二区 | 亚洲国产精品一区二区三区 | 7777在线视频免费播放 | 中文字幕极速在线观看 | 国产精品亚洲一区二区三区在线观看 |