我想要:
- 翻译、倒置并旋转一个四边形(PShape对象)多次
- 然后改变它的2个顶点之一的高度
这样整个物体就可以像关节手臂一样向左或向右弯曲。
为了尽可能清晰,我制作了一些图形。
我知道我可以:
- 使用
translate()
函数来平移四边形 - 使用
scale(1, -1)
函数来翻转(反转)它 - 使用
atan2()
函数来旋转它
问题
当将这三个组合在一起时,我最终得到了这个:
旋转角度似乎正确,但显然在平移方面存在问题(可能是在X或Y轴上),我无法确定具体是什么。
我怀疑枢轴缺少翻译,或者变换顺序不正确(或者两者都有可能)。
如果有人能帮助我理解我做错了什么以及如何解决这个问题,我将不胜感激。
int W = 40;
int H = 40;
int offset = 10;
float[] p0 = {-W/2, -H/2};
float[] p1 = {-W/2, H/2};
float[] p2 = {W/2, H/2};
float[] p3 = {W/2, -H/2 - offset};
PShape object;
void setup(){
size(600, 600, P2D);
smooth(8);
noFill();
}
void draw(){
background(255);
pushMatrix();
translate(width>>1, height>>1);
float angle = atan2(p3[1] - p0[1], p3[0] - p0[0]);
for (int i = 0; i < 6; i++){
int factor = (i % 2 == 0) ? 1 : -1;
//Height translation
translate(0, H*factor);
//Flip all quads except 1st one
if (i > 0){
scale(1, -1);
}
//Rotate once every 2 quads
if (i%2 == 1){
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();
}