[PR]
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
プログラミング、3DCGとその他いろいろについて
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
Planck.jsで物体にロープをつなげるサンプルコードを書きました。ロープがつながると、物体は動きを制限されます。
<canvas id="canvas" width="600" height="600" style="border:solid"></canvas>
<script src="planck.js"></script>
<script>
var World = planck.World,
Vec2 = planck.Vec2,
Edge = planck.Edge,
Circle = planck.Circle;
function fillCircle(context, position, radius){
context.beginPath();
context.ellipse(position.x, position.y, radius, radius, 0, 0, 2 * Math.PI);
context.fill();
}
class Demo{
constructor(){
this.world = this._createWorld();
this._initializeGround(this.world);
this._initializeCircle(this.world);
}
_createWorld(){
return World(Vec2(0, 100));
}
_initializeGround(world){
var bottomGround = world.createBody();
bottomGround.createFixture(Edge(Vec2(0, canvas.height), Vec2(canvas.width, canvas.height)), {restitution: 1, friction : 0});
this.topGround = world.createBody();
this.topGround.createFixture(Edge(Vec2(0, 0), Vec2(canvas.width, 0)), {restitution: 1, friction: 0});
var leftGround = world.createBody();
leftGround.createFixture(Edge(Vec2(0, 0), Vec2(0, canvas.height)), {restitution: 1, friction: 0});
var rightGround = world.createBody();
rightGround.createFixture(Edge(Vec2(canvas.width, 0), Vec2(canvas.width, canvas.height)), {restitution: 1, friction: 0});
}
_initializeCircle(world){
this.circle = world.createBody().setDynamic();
this.circle.setPosition(Vec2(200, 100));
this.circle.setAngle(Math.PI / 6);
this.circleShape = Circle(40);
this.circle.createFixture(this.circleShape, {restitution: 1, friction: 0});
this.circle.setMassData(this._getMassData(this.circleShape));
this.rope = new planck.RopeJoint({maxLength:200, localAnchorA:Vec2(), localAnchorB:Vec2()}, this.circle, this.topGround);
this.world.createJoint(this.rope);
}
_getMassData(circleShape){
var massData = {center:Vec2()};
circleShape.computeMass(massData, 1);
return massData;
}
run(){
window.requestAnimationFrame(() => this.run());
this._update();
this._draw();
}
_update(){
this.world.step(1 / 60);
}
_draw(){
var context = canvas.getContext("2d");
context.clearRect(0, 0, canvas.width, canvas.height);
this._drawCircle(context);
this._drawRope(context);
}
_drawRope(context){
context.beginPath();
context.lineTo(this.rope.getAnchorA().x, this.rope.getAnchorA().y);
context.lineTo(this.rope.getAnchorB().x, this.rope.getAnchorB().y);
context.stroke();
}
_drawCircle(context){
fillCircle(context, this.circle.getPosition(), this.circleShape.getRadius());
}
}
function main(){
var demo = new Demo();
demo.run();
}
main();
</script>
このプログラムはRopeJointクラスの使い方のデモです。黒い球はロープで天井と結び付けられており、壁にぶつかって何度も跳ね返ります。