You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 04:42:41