xxxxxxxxxx
147
function setup() {
createCanvas(400, 650);
}
let debug = true; // enables rendering of debug lines
let DTcount = 0;
let timescale = 1
function deepCopy(array) {
return JSON.parse(JSON.stringify(array));
}
let joints = []; // [0 = name, 1 = rotation, 2 = X, 3 = Y]
function jointOffset(name, X, Y) {
let joint;
for (let i = 0; i < joints.length; i++) {
if (joints[i][0] == name) {
joint = joints[i];
}
}
if (joint == null) return;
let Jr = joint[1];
let Jx = joint[2];
let Jy = joint[3];
let x = cos(Jr) * Y + cos(Jr + PI / 2) * X + Jx;
let y = sin(Jr) * Y + sin(Jr + PI / 2) * X + Jy;
return [x, y];
}
function createJoint(name, R, X, Y) {
joints[joints.length] = [name, R, X, Y];
}
function setJoint(name, R, X, Y) {
for (let i = 0; i < joints.length; i++) {
if (joints[i][0] == name) {
joints[i] = [name, R, X, Y];
}
}
}
function linkJoint(name, linkName, R, L) {
let joint;
for (let i = 0; i < joints.length; i++) {
if (joints[i][0] == name) {
joint = i;
}
}
if (joint == null) {
print("no joint");
return;
}
let link;
for (let i = 0; i < joints.length; i++) {
if (joints[i][0] == linkName) {
link = i;
}
}
if (link == null) {
print("no link");
return;
}
let r = joints[link][1] + R;
let x = cos(r) * L + joints[link][2];
let y = sin(r) * L + joints[link][3];
joints[joint] = [name, r, x, y];
if (debug) {
line(joints[link][2], joints[link][3], joints[joint][2], joints[joint][3]);
}
}
function pointsLine(POINT1, POINT2) {
line(POINT1[0], POINT1[1], POINT2[0], POINT2[1]);
}
function pointsTriangle(POINT1,POINT2,POINT3){
triangle(POINT1[0], POINT1[1], POINT2[0], POINT2[1], POINT3[0], POINT3[1])
}
// create joints
createJoint("base", Math.PI, 100, 100);
createJoint("wingJoint1", 0, 0, 0);
createJoint("wingJoint2", 0, 0, 0);
createJoint("wingJoint3", 0, 0, 0);
createJoint("wingJoint4", 0, 0, 0);
createJoint("wingJoint5", 0, 0, 0);
createJoint("neckJoint1", 0, 0, 0);
createJoint("neckJoint2", 0, 0, 0);
createJoint("neckJoint3", 0, 0, 0);
function draw() {
background(0);
strokeWeight(1.5);
stroke(255);
fill(0);
DTcount += deltaTime / 1000 * timescale;
// put the stuff in here \/
setJoint("base", PI, 120, 120 + sin(DTcount * PI) * 5);
linkJoint("wingJoint1", "base", (sin(DTcount * PI) * PI) / 3, 30);
linkJoint("wingJoint2", "wingJoint1", PI / 8 + sin(DTcount * PI) / 4, 30);
linkJoint("wingJoint3", "wingJoint2", -PI / 8 + sin((DTcount - 0.1) * PI) / 4, 40);
linkJoint("wingJoint4", "wingJoint3", -PI / 16 + sin((DTcount - 0.2) * PI) / 6, 60);
linkJoint("wingJoint5", "wingJoint4", -PI / 16 + sin((DTcount - 0.3) * PI) / 8, 60);
linkJoint("neckJoint1", "base", -PI - PI/8 + (sin((DTcount-0.1)*PI)*PI/32*-1),60)
linkJoint("neckJoint2", "neckJoint1", PI/10 + (sin((DTcount-0.2)*PI)*PI/32*-1),50)
linkJoint("neckJoint3", "neckJoint2", PI/10 + (sin((DTcount-0.2)*PI)*PI/32) + (sin((DTcount-0.1)*PI)*PI/32),60)
// draw wings
let wp0 = jointOffset("base", 10, 0);
let wp1 = jointOffset("wingJoint2", 10, -20);
let wp2 = jointOffset("wingJoint2", 10, 0);
let wp3 = jointOffset("wingJoint3", 10, 0);
let wp4 = jointOffset("wingJoint4", 10, 0);
let wp5 = jointOffset("wingJoint5", 10, 10);
pointsLine(wp0, wp1);
pointsLine(wp1, wp2);
pointsLine(wp2, wp3);
pointsLine(wp3, wp4);
pointsLine(wp4, wp5);
// draw neck
let np0 = jointOffset("base",20,-20)
let np1 = jointOffset("neckJoint1",-10,0)
let np2 = jointOffset("neckJoint2",-10,0)
pointsLine(np0,wp0)
pointsLine(np1,np0)
pointsLine(np2,np1)
// CONGRATIONS, OUR JOINT SYTSEM IS NO LONGER SPAGETTI
}