亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

【HTML5】3D模型--百行代碼實現旋轉立體魔方實例

2024-08-26 00:19:17
字體:
來源:轉載
供稿:網友

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

下面是預覽畫面。

html5,3d,魔方旋轉,3d立體旋轉,實現3d旋轉

制作流程

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

魔方分為6個面,每個面由9個小矩形組成,現在我把每個小矩形當做一個類封裝起來,

因為現在建立的是一個3D魔方,所以要畫出每個小矩形,需要知道小矩形的4個定點,而這4個定點會根據空間的旋轉角度而變換,所以為了計算出這4個定點坐標,需要知道魔方繞x軸和z軸旋轉的角度。

所以,建立矩形類如下

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是小矩形的四個頂點,angleX,angleZ分別是x軸和z軸旋轉的角度,color是小矩形的顏色。

魔方分為6個面,先看一下最前面的一面,如果以立方體的中心作為3D坐標系的中心,那么9個小矩形的各個定點所對應的坐標如下圖所示

html5,3d,魔方旋轉,3d立體旋轉,實現3d旋轉

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

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是一個LSprite類,step是半個小矩形的長,同樣的道理,可以也得到其他5個面。

6個面都建立了,在繪制這6個面之前,首先要根據旋轉的角度來計算各個定點的坐標,看下面的圖

html5,3d,魔方旋轉,3d立體旋轉,實現3d旋轉

根據上面的圖,用下面的公式即可得到變換后的定點坐標

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];  };  

最后根據小矩形的四個定點坐標,來繪制這個矩形,

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類的一個方法,它可以根據傳入的定點坐標數組來繪制一個多邊形。

最后,給出完整代碼,代碼很少,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);     }  }  

這只是一個非常簡陋的3D模型,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到HTML教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久网| 成人国内精品久久久久一区| 综合网日日天干夜夜久久| 久久99青青精品免费观看| 免费91在线视频| 久久人人爽人人爽人人片av高请| 热re91久久精品国99热蜜臀| 国产精品免费在线免费| 九色成人免费视频| 久久激情视频免费观看| 91欧美激情另类亚洲| 日韩国产高清污视频在线观看| 国产精品一区二区久久国产| 欧美小视频在线观看| 国产美女搞久久| 国产精品视频专区| 国产精品视频一区二区三区四| 美日韩精品免费观看视频| 精品人伦一区二区三区蜜桃免费| 91国产一区在线| 国产成人精品久久二区二区91| 国产亚洲一区二区精品| 欧美中文字幕第一页| 日韩在线免费视频| 久久这里只有精品视频首页| 欧美性受xxxx白人性爽| 国产偷亚洲偷欧美偷精品| 欧美日韩国产色视频| 欧美性69xxxx肥| 岛国av一区二区在线在线观看| 亚洲国产精品女人久久久| 91精品久久久久久久久青青| 国产欧美日韩免费| 97婷婷涩涩精品一区| 夜夜嗨av色一区二区不卡| 日本道色综合久久影院| 亚洲精选中文字幕| 亚洲电影免费观看高清| 91最新在线免费观看| 欧美性xxxxxxxxx| 欧美日韩裸体免费视频| 亚洲人成电影在线观看天堂色| 中文字幕亚洲专区| 在线观看国产精品91| 国产精品第100页| 欧美日韩精品国产| 日韩电影中文字幕一区| 国产一区二区黄| 亚洲第一精品夜夜躁人人爽| 狠狠躁夜夜躁人人躁婷婷91| 欧美大奶子在线| 精品国产欧美一区二区三区成人| 国产精品欧美在线| 国产一区二区香蕉| 久久久这里只有精品视频| 日韩精品在线免费观看视频| 亚洲伊人久久综合| www.国产精品一二区| 亚洲欧美日韩国产成人| 国产a级全部精品| 日韩高清免费观看| 亚洲第一页自拍| 久久av在线播放| 国产精品一区二区三区在线播放| 欧美疯狂性受xxxxx另类| 91精品视频免费观看| 欧美中文字幕视频| 1769国内精品视频在线播放| 国产日韩在线看片| 精品国产91久久久久久老师| 欧美一性一乱一交一视频| 亚洲3p在线观看| 91久久久久久久久久| 91国产精品91| 亚洲品质视频自拍网| 国产www精品| 黄色成人在线免费| 欧美裸体xxxx| 亚洲女人天堂av| 岛国av一区二区三区| 色偷偷888欧美精品久久久| 午夜精品国产精品大乳美女| 成人伊人精品色xxxx视频| 中文字幕亚洲情99在线| 91av中文字幕| 国产精品444| 国产视频欧美视频| 亚洲aa在线观看| 2023亚洲男人天堂| 91久热免费在线视频| 2019最新中文字幕| 久久男人的天堂| 日产精品99久久久久久| 欧美日本在线视频中文字字幕| 亚洲精品日韩欧美| 中文字幕亚洲欧美在线| 欧美日在线观看| 中文字幕欧美日韩va免费视频| 成人精品一区二区三区电影免费| 国产日韩欧美夫妻视频在线观看| 5252色成人免费视频| 亚洲国产精品人人爽夜夜爽| 国产午夜精品免费一区二区三区| 国产欧美日韩综合精品| 午夜精品久久久久久久99热浪潮| 亚洲第一综合天堂另类专| 亚洲国产天堂网精品网站| 九九精品视频在线| 日韩国产一区三区| 欧美成人一二三| 亚洲综合日韩中文字幕v在线| 97碰碰碰免费色视频| 久久天天躁狠狠躁夜夜爽蜜月| 69国产精品成人在线播放| 欧美日韩免费在线观看| 亚洲理论在线a中文字幕| 亚洲人成网站免费播放| 欧美风情在线观看| 国产精品免费久久久| 亚洲国产成人精品久久| 日韩欧美国产骚| 中文字幕亚洲一区二区三区五十路| 久久这里有精品视频| 亚洲精品成人久久| 日韩的一区二区| 国模精品视频一区二区| 亚洲精品v欧美精品v日韩精品| 精品久久香蕉国产线看观看亚洲| 国产日韩欧美夫妻视频在线观看| 日韩精品免费电影| 中文字幕日本欧美| 日韩在线视频导航| 国产在线播放不卡| 91亚洲精品久久久久久久久久久久| 精品中文视频在线| 一区二区三区黄色| 中文字幕日韩精品在线观看| 国产精品久久久久久久av电影| 最近中文字幕mv在线一区二区三区四区| 亚洲国产私拍精品国模在线观看| 欧美激情区在线播放| 亚洲成人av在线播放| 久久久免费电影| 亚洲一区中文字幕| 一区二区成人精品| 日韩av免费在线看| 久久久99久久精品女同性| 亚洲人成电影网站| 久久精品视频va| 最近2019中文字幕一页二页| 亚洲欧美制服另类日韩| 2018中文字幕一区二区三区| 98精品国产高清在线xxxx天堂| 久久伊人精品一区二区三区| 按摩亚洲人久久| 国产成人a亚洲精品| 中文字幕一区日韩电影| 国产视频综合在线| 日韩欧美中文字幕在线观看| 亚洲第一区第一页| 欧美网站在线观看| 亚洲精品一区在线观看香蕉| 91精品啪在线观看麻豆免费| 91精品久久久久久久久久久久久|