Пару дней назад я задал вопрос о переводах и вращениях в обработке.
Я хотел:
- переводить, инвертировать и вращать один четырехугольник (объект PShape) несколько раз
- затем измените высоту одной из 2 верхних вершин
так как все это действует как шарнирное плечо, которое можно сгибать вправо или влево.
Благодаря помощи @ Rabbid76 мне удалось добиться этого эффекта, но теперь я сталкиваюсь с другой проблемой при переводе последних 5 верхних квадратов с горизонтальной инверсией .
При изгибе объекта первые 3 четырехугольника отделяются от последних 5 и. И чем больше изгибающаяся нога изогнута, тем дальше они расходятся.
Я был бы очень признателен, если бы кто-нибудь мог помочь мне исправить часть перевода (от строки 65 до 68), чтобы квады оставались прикрепленными друг к другу, независимо от того, насколько сильны изгибы.
Любое предложение по этому вопросу также будет с благодарностью.
SCRIPT
int W = 40;
int H = 40;
int nQuads = 8;
int xOffset = 27;
float[] p0 = {-W/2 + xOffset, -H/2};
float[] p1 = {-W/2, H/2};
float[] p2 = {W/2, H/2};
float[] p3 = {W/2, -H/2};
PShape object;
void setup(){
size(600, 600, P2D);
smooth(8);
}
void draw(){
background(255);
// Bending to the left
float bending = sin(frameCount*.05) * .1;
p0[1] -= bending;
pushMatrix();
translate(width/2, height/2);
float minX = min( min(p0[0], p3[0]), min(p2[0], p1[0]) );
float maxX = max( max(p0[0], p3[0]), max(p2[0], p1[0]) );
float cptX = (minX+maxX)/2;
//Rotation Angle
float angle = atan2(p3[1]-p0[1], p3[0]-p0[0]);
//Pivot Height
float PH = p0[1] + (p3[1]-p0[1]) * (cptX-p0[0])/(p3[0]-p0[0]);
for (int i = 0; i < nQuads; i++){
float PivotHeight = (i % 2 == 1) ? PH : H/2;
//Height translation
if (i > 0){
translate(0, PivotHeight);
}
//Rotate once every 2 quads
if (i%2 == 1){
rotate(angle*2);
}
//Height translation
//Flip all quads except 1st one
if (i > 0){
translate(0, PivotHeight);
scale(1, -1);
}
//NOT working --> Flipping horizontally the last 5 top QUADS
if (i == 3){
scale(-1, 1);
translate(- xOffset, 0); //trying to align the quads on the X axis. Y translation is missing
rotate(-angle*2);
}
object();
}
popMatrix();
}
void object() {
beginShape(QUADS);
vertex(p0[0], p0[1]);
vertex(p1[0], p1[1]);
vertex(p2[0], p2[1]);
vertex(p3[0], p3[1]);
endShape();
}