使用Processing PeasyCam创建3D点网格时仅显示对角线点求助
问题分析与解决方案
问题根源
- 总点数计算错误:当前代码中
N = Nx * Ny仅计算了2D平面的点数,3D网格的总点数应为Nx * Ny * Nz,否则数组长度不足以存储所有三维点,导致大部分点无法被正确初始化。 - 坐标生成逻辑错误:三个独立的
for循环用同一个count变量分别生成x、y、z坐标的方式完全不适合3D场景。这种方式会让x、y、z坐标按相同的线性序列生成,最终所有点的x/y/z值一一对应,仅形成一条对角线,而非三维网格。
解决方案
- 修正总点数
N的计算,改为三维维度的乘积,确保数组能容纳所有3D点。 - 使用三重嵌套循环遍历x、y、z三个维度的索引,分别计算每个点的坐标并赋值到对应数组位置,让每个点对应三维网格中的唯一位置。
修改后的完整代码
import peasy.*; PeasyCam cam; void setup() { size(1000, 800, P3D); background(0); frameRate(60); cam = new PeasyCam(this, 1200); cam.lookAt(boxwidth/2, boxheight/2, boxdepth/2); cam.setMinimumDistance(50); cam.setMaximumDistance(2000); //initialize grid of points of interest grid_spacingx = grid_width / (Nx-1); //one fewer spacings than points grid_spacingy = grid_height / (Ny-1); grid_spacingz = grid_depth / (Nz-1); int index = 0; // 三重循环遍历z、y、x三个维度,生成所有3D点坐标 for(int k = 0; k < Nz; k++){ for(int j = 0; j < Ny; j++){ for(int i = 0; i < Nx; i++){ px[index] = i * grid_spacingx; py[index] = j * grid_spacingy; pz[index] = k * grid_spacingz; index++; } } } } int boxwidth = 1000; int boxheight = 1000; int boxdepth = 1000; //size of arrays int Nx = 26; //number of horizontal points (makes N-1 spacings) int Ny = 26; //number of vertical points int Nz = 26; //number of depth points int N = Nx * Ny * Nz; //total number of 3D points float grid_width = 1000; float grid_height = 1000; float grid_depth = 1000; float grid_spacingx; float grid_spacingy; float grid_spacingz; //position of point of interest float[] px = new float[N]; float[] py = new float[N]; float[] pz = new float[N]; void draw() { background(0); colorMode(RGB, 255); fill(255); strokeWeight(2); drawBox(); drawFieldArrows(); } //******************************************************// void drawFieldArrows() { fill(255); for(int i = 0; i < N; i++){ pushMatrix(); translate(px[i], py[i], pz[i]); point(0, 0, 0); popMatrix(); } } //******************************************************// void drawBox() { stroke(255); noFill(); line(0, 0, 0, boxwidth, 0, 0); line(0, 0, 0, 0, boxheight, 0); line(0, 0, 0, 0, 0, boxdepth); line(0, 0, boxdepth, boxwidth, 0, boxdepth); line(0, 0, boxdepth, 0, boxheight, boxdepth); line(boxwidth, boxheight, boxdepth, boxwidth, boxheight, 0); line(boxwidth, boxheight, boxdepth, 0, boxheight, boxdepth); line(boxwidth, boxheight, boxdepth, boxwidth, 0, boxdepth); line(boxwidth, 0, 0, boxwidth, boxheight, 0); line(boxwidth, 0, 0, boxwidth, 0, boxdepth); line(0, boxheight, 0, boxwidth, boxheight, 0); line(0, boxheight, 0, 0, boxheight, boxdepth); }
修改说明
- 修正
N的计算为Nx * Ny * Nz,确保数组长度匹配3D网格的总点数。 - 用三重循环遍历z(k)、y(j)、x(i)维度索引,通过索引乘以间隔值计算每个点的坐标,保证每个点对应三维网格中的唯一位置。
- 移除错误的
count变量,改用index变量依次填充坐标数组,避免逻辑混乱。
内容的提问来源于stack exchange,提问作者Jeff Roberts
相关产品推荐
相关产品推荐

