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

首頁 > 開發 > HTML5 > 正文

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

2024-09-05 07:21:52
字體:
來源:轉載
供稿:網友

最近研究魔方的玩法,就突然想用HMTL5寫一個魔方的模型,由于魔方是一個3D的立方體,這次就試著用HTML5寫了一個簡單的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個小矩形的各個定點所對應的坐標如下圖所示

所以,前面這個面的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個面之前,首先要根據旋轉的角度來計算各個定點的坐標,看下面的圖

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

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模型,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品小视频| 亚洲人成在线播放| 国产一区二区三区在线视频| 欧美日韩免费看| 亚洲欧美激情视频| 欧美亚洲成人xxx| 亚洲国产婷婷香蕉久久久久久| 欧洲亚洲女同hd| 欧美一区二区三区免费视| 国产欧美日韩专区发布| 26uuu亚洲伊人春色| 中文字幕亚洲无线码a| 日韩欧美亚洲范冰冰与中字| 亚洲人成电影在线观看天堂色| 91亚洲国产精品| 黄色一区二区在线| 中日韩美女免费视频网址在线观看| 日韩精品中文在线观看| 92裸体在线视频网站| 亚洲一区二区久久久久久| 日韩在线免费观看视频| 亚洲综合中文字幕68页| 日韩精品视频在线观看网址| 亚洲男人第一av网站| 777777777亚洲妇女| 国产成人精品亚洲精品| 欧美日本高清一区| 日本精品免费观看| 精品中文字幕视频| 亚洲免费影视第一页| 欧美裸身视频免费观看| 国产91精品久| 中文字幕亚洲二区| 一夜七次郎国产精品亚洲| 成人av在线亚洲| 国产精品观看在线亚洲人成网| 日韩在线一区二区三区免费视频| 欧美成人中文字幕| 亚洲国产精品成人av| 久久久久久18| 欧美精品成人91久久久久久久| 成人乱人伦精品视频在线观看| 中文在线资源观看视频网站免费不卡| 成人免费福利在线| 亚洲国产精彩中文乱码av在线播放| 欧美性视频在线| 一区二区三区 在线观看视| 久久精品福利视频| …久久精品99久久香蕉国产| 97精品国产97久久久久久春色| 国产精品高精视频免费| 国产亚洲欧洲高清| 日韩av成人在线观看| 18久久久久久| 国产精品久久二区| 97色伦亚洲国产| 亚洲性av网站| 日韩精品视频在线免费观看| 久久激情五月丁香伊人| 中文字幕欧美视频在线| 亚洲图片在区色| 国产精品嫩草影院一区二区| 亚洲欧洲av一区二区| 日韩黄在线观看| 国产美女搞久久| 97精品视频在线播放| 日韩av在线看| 欧美性xxxx| 成人黄色午夜影院| 久久久久久久久久国产| 亚洲人成电影在线观看天堂色| 久久成人这里只有精品| 久久久av电影| 高清亚洲成在人网站天堂| 亚洲国产免费av| 日韩中文av在线| 国产精品视频白浆免费视频| 国产主播喷水一区二区| 91亚洲精品久久久| 中文字幕欧美日韩在线| 欧美性jizz18性欧美| 免费97视频在线精品国自产拍| 日韩av色在线| 国产91精品黑色丝袜高跟鞋| 中文日韩在线观看| 精品高清一区二区三区| 中文字幕亚洲一区二区三区五十路| 成人天堂噜噜噜| 欧美黑人狂野猛交老妇| 亚州精品天堂中文字幕| 亚洲天堂av在线免费观看| 欧美性理论片在线观看片免费| 欧美国产日韩免费| 亚洲精品国产综合久久| 91超碰中文字幕久久精品| 亚洲国产97在线精品一区| 91美女片黄在线观看游戏| 欧美黑人xxxx| 超薄丝袜一区二区| 欧美视频专区一二在线观看| 全球成人中文在线| 久久人人爽亚洲精品天堂| 亚洲国产精品小视频| 亚洲欧美国产精品va在线观看| 国产精品∨欧美精品v日韩精品| 性视频1819p久久| 97在线精品国自产拍中文| 成人精品一区二区三区| 国产精品久久久一区| 欧美大片免费观看在线观看网站推荐| 91网站免费观看| 日韩黄色高清视频| 另类美女黄大片| 欧美激情videos| 91探花福利精品国产自产在线| 国产精品一区二区性色av| 在线播放日韩精品| 91理论片午午论夜理片久久| 精品福利在线看| 91a在线视频| 亚洲男人第一av网站| 91在线免费视频| 69**夜色精品国产69乱| 欧美黑人一级爽快片淫片高清| 日韩在线国产精品| 亚洲美腿欧美激情另类| 法国裸体一区二区| 国产精品无码专区在线观看| 欧美在线中文字幕| 国内精久久久久久久久久人| 日本午夜精品理论片a级appf发布| 一区二区三区精品99久久| 中文日韩电影网站| 国产v综合v亚洲欧美久久| 日韩男女性生活视频| 亚洲色图校园春色| 久久久久久久久久亚洲| 亚洲精品网址在线观看| 日韩精品免费观看| 俺去啦;欧美日韩| 国产精品偷伦一区二区| 日韩精品久久久久久久玫瑰园| 亚洲人成欧美中文字幕| 在线成人一区二区| 国产在线视频一区| 国产精品久久久久久亚洲影视| 国产欧美日韩亚洲精品| 亚洲2020天天堂在线观看| 中文精品99久久国产香蕉| 91成人性视频| 高清欧美电影在线| 欧美成人在线影院| 91精品国产777在线观看| 国内揄拍国内精品| 久久成人免费视频| 亚洲成人教育av| www.美女亚洲精品| 精品国产一区二区三区在线观看| 亚洲影影院av| 成人在线视频网站| 亚洲精品动漫100p| 91福利视频在线观看| 欧美日韩一区二区三区在线免费观看| 亚洲女人被黑人巨大进入al|