所在的位置: js >> js介绍 >> threejscannonjs物理引

threejscannonjs物理引

今天继续讲cannon.js的物理约束,之前的一篇文章曾简单的提及过PointToPointConstraint约束,那么今天详细的说一说cannon.js的约束和使用方法。

1.cannon.js约束的种类1.PointToPointConstraint点对点约束

它的构造函数如下(之前可能介绍过了,这次统一说)

PointToPointConstraint(bodyApivotAbodyBpivotBmaxForce)

bodyA—刚体A。pivotA—相对于刚体A的质心的点,刚体A被约束到该点。bodyB—刚体B。pivotB—相对于刚体B的质心的点,刚体B被约束到该点。maxForce—约束物体应施加的最大力。

点对点约束顾名思义就是A刚体的某一点和B刚体的某一点形成约束,刚体之间仅通过约束点相连,如下图。

2.LockConstraint锁定约束

它的构造函数如下

LockConstraint(bodyAbodyB{maxForce})

bodyA—刚体A。bodyB—刚体B。maxForce—约束物体应施加的最大力。

为什么不需要设置约束点的位置呢,因为锁定约束点其实就是点对点约束的简化版本,他们pivotA和pivotB默认为刚体的中心,如下图。

3.DistanceConstraint距离约束

它的构造函数如下

DistanceConstraint(bodyAbodyBdistancemaxForce)

bodyA—刚体A。bodyB—刚体B。distance—要保持的距离。如果未定义,它将被设置为刚体A和刚体B之间的当前距离。maxForce—约束物体应施加的最大力。

距离约束将两个物体约束为彼此重心的距离恒定,如下图是相邻小球保持恒定距离。

4.HingeConstraint铰链约束

它的构造函数如下

HingeConstraint(bodyAbodyB{pivotAaxisApivotBaxisBmaxForce})

bodyA—刚体A。bodyB—刚体B。pivotA—相对于刚体A的质心的点,刚体A被约束到该点。axisA—在刚体A中局部定义的刚体A可以绕其旋转的轴。pivotB—相对于刚体B的质心的点,刚体B被约束到该点。axisB—在刚体B中局部定义的刚体B可以绕其旋转的轴。maxForce—约束物体应施加的最大力。

铰链又称合页,这个约束就像门的铰链一样,让两个物理只能在各自地点沿着固定的轴旋转。如下图。

2.案例的主要代码

下面是案例的主要代码

varbodies=[],meshes=[];initPoint(){varsize=0.5;varboxShape=newCANNON.Box(newCANNON.Vec3(size,size,size));varmass=0;varN=10,last;for(vari=0;iN;i++){//Cateaboxvarboxbody=newCANNON.Body({mass:mass,shape:boxShape,position:newCANNON.Vec3(i*0.6,(N-i)*Math.sqrt(size*size*3)*2,0),quaternion:newCANNON.Quaternion().setFromEuler(-Math.PI/4,-Math.PI/4,0),material:pubMaterial});boxbody.angularDamping=0.3;bodies.push(boxbody);world.addBody(boxbody);if(i==0){mass=1;}else{varc=newCANNON.PointToPointConstraint(boxbody,newCANNON.Vec3(size,size,size),last,newCANNON.Vec3(-size,-size,-size));world.addConstraint(c);}last=boxbody;}for(leti=0;i10;i++){letmesh=newTHREE.Mesh(newTHREE.BoxBufferGeometry(1),newTHREE.MeshNormalMaterial());meshes.push(mesh);scene.add(mesh);}console.log(world)}initLock(){varsize=0.5;varboxShape=newCANNON.Box(newCANNON.Vec3(size,size,size));varmass=1;varspace=0.1*size;varN=10,last;for(vari=0;iN;i++){//Cateaboxvarboxbody=newCANNON.Body({mass:mass,shape:boxShape,position:newCANNON.Vec3((N-i-N/2)*(size*2+2*space),size*6+space,0),sleepSpeedLimit:0,material:pubMaterial});bodies.push(boxbody);world.addBody(boxbody);if(last){//Connectthecurntbodytothelastonevarc=newCANNON.LockConstraint(boxbody,last);world.addConstraint(c);}//Tokeeptrackofwhichbodywasaddedlastlast=boxbody;}varbodyA=newCANNON.Body({mass:0,shape:boxShape,position:newCANNON.Vec3((-N/2+1)*(size*2+2*space),size*3-1,0),material:pubMaterial});bodies.push(bodyA);world.addBody(bodyA);varbodyB=newCANNON.Body({mass:0,shape:boxShape,position:newCANNON.Vec3((N/2)*(size*2+2*space),size*3-1,0),material:pubMaterial});bodies.push(bodyB);world.addBody(bodyB);for(leti=0;i12;i++){letmesh=newTHREE.Mesh(newTHREE.BoxBufferGeometry(1),newTHREE.MeshNormalMaterial());meshes.push(mesh);scene.add(mesh);}}initCloth(){varsize=0.2;vardis=0.5;varspheShape=newCANNON.Sphe(size);varmass=1;varNrows=15,Ncols=15;for(leti=0;iNrows;i++){for(letj=0;jNcols;j++){letbody=newCANNON.Body({mass:mass,shape:spheShape,position:newCANNON.Vec3((i-0.5*Nrows+0.5)*dis,9,(j-0.5*Ncols+0.5)*dis),material:pubMaterial})bodies.push(body);world.addBody(body);}}letsphebody=newCANNON.Body({mass:0,shape:newCANNON.Sphe(4),position:newCANNON.Vec3(0,4,0),material:pubMaterial})bodies.push(sphebody);world.add(sphebody);for(leti=0;iNrows*Ncols;i++){letr=Math.floor(i/Nrows);letc=i%Nrows;if(rNrows-1){world.addConstraint(newCANNON.DistanceConstraint(bodies[r*Nrows+c],b2,dis,5));}if(cNcols-1){world.addConstraint(newCANNON.DistanceConstraint(bodies[r*Nrows+c],bodies[r*Nrows+c+1],dis,5));}}for(leti=0;iNrows*Ncols;i++){letmesh=newTHREE.Mesh(newTHREE.SpheBufferGeometry(size),newTHREE.MeshNormalMaterial());meshes.push(mesh);scene.add(mesh);}letmesh=newTHREE.Mesh(newTHREE.SpheBufferGeometry(4,32,16),newTHREE.MeshNormalMaterial());meshes.push(mesh);scene.add(mesh);}initHinge(){letbodyA=newCANNON.Body({mass:0,shape:newCANNON.Box(newCANNON.Vec3(0.2,4,0.2)),position:newCANNON.Vec3(-3.2,5,0),material:pubMaterial})letbodyB=newCANNON.Body({mass:1,shape:newCANNON.Box(newCANNON.Vec3(3,4,0.2)),position:newCANNON.Vec3(0,5,0),//material:pubMaterial})bodyB.velocity.set(0,0,-10);bodies.push(bodyA);bodies.push(bodyB);world.add(bodyA);world.add(bodyB);varc=newCANNON.HingeConstraint(bodyA,bodyB,{pivotA:newCANNON.Vec3(0.3,0,0),axisA:newCANNON.Vec3(0,1,0),pivotB:newCANNON.Vec3(-3.1,0,0),axisB:newCANNON.Vec3(0,1,0),maxForce:2});world.addConstraint(c);letmeshA=newTHREE.Mesh(newTHREE.BoxBufferGeometry(0.4,8,0.4),newTHREE.MeshNormalMaterial());letmeshB=newTHREE.Mesh(newTHREE.BoxBufferGeometry(6,8,0.4),newTHREE.MeshNormalMaterial());meshes.push(meshA);meshes.push(meshB);scene.add(meshA);scene.add(meshB);}

转载自:郭先生的博客(


转载请注明:http://www.aierlanlan.com/rzfs/8865.html

  • 上一篇文章:
  •   
  • 下一篇文章: