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

使用Processing PeasyCam创建3D点网格时仅显示对角线点求助

问题分析与解决方案

问题根源

  1. 总点数计算错误:当前代码中N = Nx * Ny仅计算了2D平面的点数,3D网格的总点数应为Nx * Ny * Nz,否则数组长度不足以存储所有三维点,导致大部分点无法被正确初始化。
  2. 坐标生成逻辑错误:三个独立的for循环用同一个count变量分别生成x、y、z坐标的方式完全不适合3D场景。这种方式会让x、y、z坐标按相同的线性序列生成,最终所有点的x/y/z值一一对应,仅形成一条对角线,而非三维网格。

解决方案

  1. 修正总点数N的计算,改为三维维度的乘积,确保数组能容纳所有3D点。
  2. 使用三重嵌套循环遍历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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 18:05:11