【问题标题】:using processing for 3D image mapping [closed]使用 3D 图像映射处理 [关闭]
【发布时间】:2016-09-27 17:18:14
【问题描述】:

实际上,我尝试过运行球形 POV。对于运行 POV,每个图像都应转换为每转中使用的线数,我尝试使用处理软件通过其库将 2d 转换为 3d 图像,但是当在球形 POV 上插入这些像素数据时,图像真的无法识别,任何关于如何在球面上映射二维图像的线索

【问题讨论】:

  • 请在交叉帖子之间链接:forum.processing.org/two/discussion/18313/…
  • Stack Overflow 并不是真正为一般的“我该怎么做”类型的问题而设计的。它更适用于特定的“我尝试过 X,预期 Y,但得到了 Z”类型的问题。您可以发布您尝试过的任何内容吗?你的minimal reproducible example 在哪里?如果你不知道如何开始,那么从小一点开始:你能把图像映射到一个矩形吗?如果遇到困难,请从那里开始工作并发布。祝你好运。

标签: image-processing arduino processing pixel led


【解决方案1】:

处理编辑器附带示例,其中一个将纹理图像映射到球体。它通过将球体分割成三角形,然后使用texture()vertex() 函数来绘制带纹理的球体。

您可以通过转到 File > Examples > Topics > Textures > TextureSphere 从处理编辑器中获取代码,但这里是代码:

/**
 * Texture Sphere 
 * by Gillian Ramsay
 * 
 * Rewritten by Gillian Ramsay to better display the poles.
 * Previous version by Mike 'Flux' Chang (and cleaned up by Aaron Koblin). 
 * Original based on code by Toxi.
 * 
 * A 3D textured sphere with simple rotation control.
 */

int ptsW, ptsH;

PImage img;

int numPointsW;
int numPointsH_2pi; 
int numPointsH;

float[] coorX;
float[] coorY;
float[] coorZ;
float[] multXZ;

void setup() {
  size(640, 360, P3D);
  background(0);
  noStroke();
  img=loadImage("world32k.jpg");
  ptsW=30;
  ptsH=30;
  // Parameters below are the number of vertices around the width and height
  initializeSphere(ptsW, ptsH);
}

// Use arrow keys to change detail settings
void keyPressed() {
  if (keyCode == ENTER) saveFrame();
  if (keyCode == UP) ptsH++;
  if (keyCode == DOWN) ptsH--;
  if (keyCode == LEFT) ptsW--;
  if (keyCode == RIGHT) ptsW++;
  if (ptsW == 0) ptsW = 1;
  if (ptsH == 0) ptsH = 2;
  // Parameters below are the number of vertices around the width and height
  initializeSphere(ptsW, ptsH);
}

void draw() {
  background(0);
  camera(width/2+map(mouseX, 0, width, -2*width, 2*width), 
         height/2+map(mouseY, 0, height, -height, height),
         height/2/tan(PI*30.0 / 180.0), 
         width, height/2.0, 0, 
         0, 1, 0);

  pushMatrix();
  translate(width/2, height/2, 0);  
  textureSphere(200, 200, 200, img);
  popMatrix();
}

void initializeSphere(int numPtsW, int numPtsH_2pi) {

  // The number of points around the width and height
  numPointsW=numPtsW+1;
  numPointsH_2pi=numPtsH_2pi;  // How many actual pts around the sphere (not just from top to bottom)
  numPointsH=ceil((float)numPointsH_2pi/2)+1;  // How many pts from top to bottom (abs(....) b/c of the possibility of an odd numPointsH_2pi)

  coorX=new float[numPointsW];   // All the x-coor in a horizontal circle radius 1
  coorY=new float[numPointsH];   // All the y-coor in a vertical circle radius 1
  coorZ=new float[numPointsW];   // All the z-coor in a horizontal circle radius 1
  multXZ=new float[numPointsH];  // The radius of each horizontal circle (that you will multiply with coorX and coorZ)

  for (int i=0; i<numPointsW ;i++) {  // For all the points around the width
    float thetaW=i*2*PI/(numPointsW-1);
    coorX[i]=sin(thetaW);
    coorZ[i]=cos(thetaW);
  }

  for (int i=0; i<numPointsH; i++) {  // For all points from top to bottom
    if (int(numPointsH_2pi/2) != (float)numPointsH_2pi/2 && i==numPointsH-1) {  // If the numPointsH_2pi is odd and it is at the last pt
      float thetaH=(i-1)*2*PI/(numPointsH_2pi);
      coorY[i]=cos(PI+thetaH); 
      multXZ[i]=0;
    } 
    else {
      //The numPointsH_2pi and 2 below allows there to be a flat bottom if the numPointsH is odd
      float thetaH=i*2*PI/(numPointsH_2pi);

      //PI+ below makes the top always the point instead of the bottom.
      coorY[i]=cos(PI+thetaH); 
      multXZ[i]=sin(thetaH);
    }
  }
}

void textureSphere(float rx, float ry, float rz, PImage t) { 
  // These are so we can map certain parts of the image on to the shape 
  float changeU=t.width/(float)(numPointsW-1); 
  float changeV=t.height/(float)(numPointsH-1); 
  float u=0;  // Width variable for the texture
  float v=0;  // Height variable for the texture

  beginShape(TRIANGLE_STRIP);
  texture(t);
  for (int i=0; i<(numPointsH-1); i++) {  // For all the rings but top and bottom
    // Goes into the array here instead of loop to save time
    float coory=coorY[i];
    float cooryPlus=coorY[i+1];

    float multxz=multXZ[i];
    float multxzPlus=multXZ[i+1];

    for (int j=0; j<numPointsW; j++) { // For all the pts in the ring
      normal(-coorX[j]*multxz, -coory, -coorZ[j]*multxz);
      vertex(coorX[j]*multxz*rx, coory*ry, coorZ[j]*multxz*rz, u, v);
      normal(-coorX[j]*multxzPlus, -cooryPlus, -coorZ[j]*multxzPlus);
      vertex(coorX[j]*multxzPlus*rx, cooryPlus*ry, coorZ[j]*multxzPlus*rz, u, v+changeV);
      u+=changeU;
    }
    v+=changeV;
    u=0;
  }
  endShape();
}

希望这是一个好的开始,但更笼统地说:Stack Overflow 并不是真正为一般的“我该怎么做”类型的问题而设计的。它更适用于特定的“我尝试过 X,预期 Y,但得到了 Z”类型的问题。您可以发布您尝试过的任何内容吗?你的Minimal, Complete, and Verifiable example在哪里?

如果您不知道如何开始,那就从小处着手:您能否将图像映射到矩形?如果遇到困难,请从那里开始工作并发布。祝你好运。

【讨论】:

  • 非常感谢@Kevin,我也有你的笔记正在处理中,实际上我是这里的新手,不完全了解如何打开票和如何响应,请告诉我如何邀请现在可能回答特定主题的人
  • @Hamidsk 这真的不是 Stack Overflow 的工作方式。您可以通过电子邮件向他们发送问题的链接,但如果您正在谈论通过 Stack Overflow 发送消息,那并没有真正完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 2013-06-16
  • 1970-01-01
  • 2023-03-05
  • 2013-01-13
  • 2011-11-21
  • 1970-01-01
相关资源
最近更新 更多