最近JavaScriptのCanvasを勉強しています。
主に本で勉強しているのですが、Canvasの本がかなり少ないです。なので、Processingの本も活用しつつやっています。
ニュートン力学
今回は「Processing クリエイティブ・コーディング入門 ―コードが生み出す創造表現」の第6章の「ニュートン力学でリアルな表現」をCanvasで作ってみました。
「ニュートン力学でリアルな表現」とは、モノが落ちていく状態だと思います。もっと細かな定義があるのですが、私はあまり理解できていないので書籍の引用を貼っておきます。
ニュートン力学の3つの法則
第1法則(完成の法則)
- 物体(質点)は、力が作用しない限り、静止または等速直線運動する
第2法則(ニュートンの運動方程式)
- 物体(質点)の加速度は、そのとき物体に作用する力に比例し、物体の質量に反比例する
第3法則(作用・反作用の法則)
- 2つの物体(質点)の間に相互に力が働くとき、物体2から物体1に作用する力と、物体1から物体2に作用する力は大きさが等しく逆向きである
X
作ったものをXにアップしています。
JSのCanvasで制作 pic.twitter.com/UmGrmVTjaj
— yusaku (@yusaku_radio) 2026年1月29日
コード
コードは以下となります。
すごくわかりづらいですが仕組みはわかりやすいと思います。わかりづらい部分は、classで書き換えてスッキリさせる予定です。
let canvas, ctx; let loc, vel, force, mass, accel, gravity, friction; let radius = 100; window.addEventListener("load", init, false); function init() { canvas = document.getElementById("myCanvas"); ctx = canvas.getContext("2d"); setup(); loop(); } function setup() { loc = { x: 0, y: 0 }; vel = { x: 0, y: 0 }; gravity = { x: 0, y: 0.3 }; force = { x: 5, y: 3 }; mass = 0.8; friction = 0.01; accel = { x: force.x * mass, y: force.y * mass }; } function loop() { // background ctx.fillStyle = "rgb(240, 240, 240)"; ctx.fillRect(0, 0, canvas.width, canvas.height); // set accel.x += gravity.x; accel.y += gravity.y; vel.x += accel.x; vel.y += accel.y; vel.x *= 1 - friction; vel.y *= 1 - friction; loc.x += vel.x; loc.y += vel.y; accel.x *= 0; accel.y *= 0; // getArc getArc(loc.x, loc.y); bounceOffWalls(); requestAnimationFrame(loop); } function getArc(x, y) { ctx.beginPath(); ctx.arc(x, y, radius, 0, Math.PI * 2, false); ctx.lineWidth = 3; ctx.strokeStyle = "rgb(52, 52, 234)"; ctx.stroke(); } function bounceOffWalls() { if (loc.x > canvas.width) { loc.x = canvas.width; vel.x *= -1; } else if (loc.x < 0) { loc.x = 0; vel.x *= -1; } if (loc.y > canvas.height) { loc.y = canvas.height; vel.y *= -1; } else if (loc.y < 0) { loc.y = 0; vel.y *= -1; } }
マイサイト
私のCanvas用のサイトにも残しています。









