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

Processing实现3D随机游走 如何让整体结构绕自身Z轴旋转

Processing 3D随机游走自旋转实现方案

原有方案失效原因

  • PeasyCam配置无效:默认相机观察点绑定在世界坐标原点(0,0,0),没有对齐到随机游走结构的自身起始中心,旋转时会出现整个结构绕远点甩动的错位,无法实现绕自身Z轴旋转的效果。
  • PGraphics图层变扁平:创建PGraphics实例时未指定P3D渲染器,默认启用2D渲染模式,会把所有3D坐标信息压缩成平面像素,后续旋转操作只能作用于2D平面,自然出不了3D旋转效果。
  • 直接加rotateZ无效:原代码靠不清除背景留轨迹残影的方式保留游走路径,已经画到帧缓存里的旧像素不会受后续矩阵变换影响,只有当前帧新画的方块会跟着旋转,整体效果完全错乱。

最简实现方案

不需要引入额外库、不需要新建PGraphics图层,直接通过矩阵栈+点位存储的方式就能实现,核心逻辑是每帧清屏后,先执行全局旋转,再统一绘制所有历史游走点位,保证所有轨迹元素都受同一个旋转变换控制。
完整可运行代码如下:

// 存储所有随机游走生成的历史点位
ArrayList<PVector> walkPoints = new ArrayList<PVector>();

void setup() {
  size(600, 600, P3D);
  // 初始化游走起始点
  walkPoints.add(new PVector(width/2, height/2, -height/4));
}

void draw() {
  background(255);
  // 基于最后一个点位生成新的随机步长
  PVector lastPoint = walkPoints.get(walkPoints.size() - 1);
  float nx = lastPoint.x + random(-10, 10);
  float ny = lastPoint.y + random(-10, 10);
  float nz = lastPoint.z + random(-10, 10);
  walkPoints.add(new PVector(nx, ny, nz));

  // 最外层矩阵控制整个结构的全局旋转
  pushMatrix();
  // 示例用鼠标X坐标控制绕Z轴旋转角度,替换成固定增量即可实现自动旋转
  rotateZ(radians(mouseX));
  // 保留原有的45度俯视角
  rotateX(radians(45));

  // 遍历绘制所有历史点位
  for (PVector p : walkPoints) {
    pushMatrix();
    translate(p.x, p.y, p.z);
    rotateX(radians(90));
    rect(0, 0, 10, 10);
    popMatrix();
  }
  popMatrix();
}

其他方案补充说明

  • 如果要使用PeasyCam:导入库后初始化相机时,直接把观察中心坐标设置为游走结构的起始点即可,示例初始化代码为PeasyCam cam = new PeasyCam(this, width/2, height/2, -height/4, 800);,最后一个参数为相机到观察点的距离,配置完成后即可通过鼠标拖拽自由绕结构中心旋转视角。
  • 如果要使用PGraphics图层:创建图层时必须指定3D渲染器,代码为PGraphics walkLayer = createGraphics(width, height, P3D);,所有游走点位先绘制到该3D图层上,再回到主画布执行旋转操作后绘制图层内容,即可避免扁平问题。

内容的提问来源于stack exchange,提问作者Cyrill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 14:06:26