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
相关产品推荐
相关产品推荐

