Processing P3D中Box类实例联动问题:如何实现独立运作?
问题解决:Processing中Box实例独立绘制的方法
你的问题核心在于Processing的变换操作(如translate、rotate)是全局累积的:当Box1调用translate(boxX, boxY, boxDist)后,坐标系已经被修改,Box2再调用translate时,会基于这个被修改后的坐标系计算位置,导致Box2的坐标依赖Box1。
解决方案:用pushMatrix()和popMatrix()隔离变换
这两个函数是Processing中管理坐标系的关键:
pushMatrix():保存当前的坐标系状态(包括所有已做的变换)popMatrix():恢复到pushMatrix()之前的坐标系状态
把每个Box的变换和绘制包裹在这两个函数之间,就能让每个实例的变换独立,不会互相影响。
修改后的完整代码
Box Box1; Box Box2; int boxXM; void setup() { size(1000, 500, P3D); fill(250, 0, 0); Box1 = new Box(160, 160, 0, 0, 0); Box2 = new Box(0, 0, 0, 0, 0); } void draw() { background(200); Box1.display(); Box1.move(); Box2.display(); Box2.move(); } void keyPressed() { if (key == 'a') { boxXM = 1; } else if (key == 'd') { boxXM = 2; } else { boxXM = 0; } } void keyReleased() { boxXM = 0; } class Box { float boxX; float boxY; float boxRY; float boxRX; float boxDist; Box(float boxX, float boxY, float boxRY, float boxRX, float boxDist) { this.boxX = boxX; this.boxY = boxY; this.boxRY = boxRY; this.boxDist = boxDist; this.boxRX = boxRX; } void display() { pushMatrix(); // 保存当前坐标系状态 translate(boxX, boxY, boxDist); rotateY(boxRY); rotateX(boxRX); box(160); popMatrix(); // 恢复到之前的坐标系 } void move() { if (boxXM == 1) { boxX -= 5; } if (boxXM == 2) { boxX += 5; } } }
额外优化建议
- 目前
boxXM是全局变量,两个Box的move都会响应键盘事件,如果你想让每个Box独立控制,可以给Box类添加自己的控制变量,或者在keyPressed里直接修改对应Box的boxX值。 - 可以给Box添加不同的填充色,方便区分两个实例。
内容的提问来源于stack exchange,提问作者Colton Scherer
相关产品推荐
相关产品推荐

