html5制作旋转正方体,HTML5实验室-Canvas世界( 旋转的立方体)

立方体by大奔

你的浏览器改换了

var d=document.getElementByIdx_x_x_x("myCanvas");

var cxt=d.getContext("2d");

var tx=250;

var ty=250;

//要考虑到立方体的长宽,所以要把坐标原点转移

cxt.translate(tx,ty);

//html5中scale的意思是成倍变化,所以这里是,

//y坐标方向变反。成为标准的笛卡尔坐标

cxt.scale(1,-1);

function getRandom(a,b){

return

(a+Math.floor(Math.random()*(b-a+1)))

}

var Points=[];

var drawRect=function(){

cxt.strokeStyle="#000";

cxt.beginPath();

//画正方体得到步骤是,先把上下两面的正方形画出来,然后画中间的

//四条直线

cxt.moveTo(Points[0].x,Points[0].y);

cxt.lineTo(Points[1].x,Points[1].y);

cxt.lineTo(Points[2].x,Points[2].y);

cxt.lineTo(Points[3].x,Points[3].y);

cxt.lineTo(Points[0].x,Points[0].y);

cxt.moveTo(Points[4].x,Points[4].y);

cxt.lineTo(Points[5].x,Points[5].y);

cxt.lineTo(Points[6].x,Points[6].y);

cxt.lineTo(Points[7].x,Points[7].y);

cxt.lineTo(Points[4].x,Points[4].y);

cxt.moveTo(Points[1].x,Points[1].y);

cxt.lineTo(Points[5].x,Points[5].y);

cxt.moveTo(Points[0].x,Points[0].y);

cxt.lineTo(Points[4].x,Points[4].y);

cxt.moveTo(Points[2].x,Points[2].y);

cxt.lineTo(Points[6].x,Points[6].y);

cxt.moveTo(Points[3].x,Points[3].y);

cxt.lineTo(Points[7].x,Points[7].y);

cxt.stroke();

}

//这里利用的是空间向量。大体就那个意思

var

Matrix4=function(n11,n12,n13,n14,n21,n22,n23,n24,n31,n32,n33,n34,n41,n42,n43,n44){

this.set(

n11||1,n12||0,n13||0,n14||0,

n21||0,n22||1,n23||0,n24||0,

n31||0,n32||0,n33||1,n34||0,

n41||0,n42||0,n43||0,n44||1

);

}

Matrix4.prototype={

set:function(n11,n12,n13,n14,n21,n22,n23,n24,n31,n32,n33,n34,n41,n42,n43,n44){

this.n11=n11;this.n12=n12;this.n13=n13,this.n14=n14;

this.n21=n21;this.n22=n22;this.n23=n23,this.n24=n24;

this.n31=n31;this.n32=n32;this.n33=n33,this.n34=n34;

this.n41=n41;this.n42=n42;this.n43=n43,this.n44=n44;

return this;

},

//向量的乘法

multiplyVector4:function(v){

var vx=v.x;

var vy=v.y;

var vz=v.z;

var vw=v.w;

v.x=this.n11*vx+this.n21*vy+this.n31*vz+this.n41*vw;

v.y=this.n12*vx+this.n22*vy+this.n32*vz+this.n42*vw;

v.z=this.n13*vx+this.n23*vy+this.n33*vz+this.n43*vw;

v.w=this.n14*vx+this.n24*vy+this.n34*vz+this.n44*vw;

return v;

}

};

Vector4=function(x,y,z,w){

this.x=x||0;

this.y=y||0;

this.z=z||0;

this.w=w||1;

};

function init(){

Points[0]=new Vector4(100,100,100,1);

Points[1]=new Vector4(100,100,-100,1);

Points[2]=new Vector4(-100,100,-100,1);

Points[3]=new Vector4(-100,100,100,1);

Points[4]=new Vector4(100,-100,100,1);

Points[5]=new Vector4(100,-100,-100,1);

Points[6]=new Vector4(-100,-100,-100,1);

Points[7]=new Vector4(-100,-100,100,1);

}

//这里用到另一个js框架,easel.js。比原来方便许多。

function it(){

createjs.Ticker.setFPS(20);

createjs.Ticker.addListener(window);

}

var m4=new Matrix4();

var angle=0;

var currentAngle=0;

function transform(){

//首先把角度转化为js可以计算的。例如30度转为1/6PI.

angle=degToRad(currentAngle);

init();

//这里用到了。绕y轴,x,z坐标变化的一个公式。记住吧。我搞半天,没整明白为啥。

m4.n11=Math.cos(angle);

m4.n13=-Math.sin(angle);

m4.n31=Math.sin(angle);

m4.n33=Math.cos(angle);//

//m4.n11+=0.01;

//m4.n22+=0.01;

//m4.n33+=0.01;

//m4.n21+=0.01;

for(var i=0;i

Points[i]=m4.multiplyVector4(Points[i]);

}

//绕y轴转完后,再绕z轴转,所以会出现偏转。立方体感觉更加真实。

m4=new Matrix4();

m4.n11=Math.cos(angle);

m4.n12=-Math.sin(angle);

m4.n21=Math.sin(angle);

m4.n22=Math.cos(angle);//

for(var i=0;i

Points[i]=m4.multiplyVector4(Points[i]);

}

}

function degToRad(angle){

return angle/180*Math.PI;

}

//这就是要循环的方法。每次重新擦除然后重画,角度加一个固定的角度。

function tick(){

cxt.clearRect(-tx,-ty,d.width,d.height);

transform();

drawRect();

currentAngle=currentAngle+5;

}

it();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值