2016-09-27 17 views
-4

実際に私はArduino Neopixelのファンであり、球形POVを実行しようとしました。 POVを実行するには、各イメージを各回転で使用される行数に変換する必要があります。私はplannerを変換すると思います。POVは、ピクセルベースの行をjavaベースで処理するために難しくはありません。球形のイメージをイメージラインに変換しました。私は本当にどんなコメントでもお礼を言います。3D画像マッピングのための処理を使用して

+0

クロスポスト間をリンクしてください:https://forum.processing.org/two/discussion/18313/using-processing-for-3d-image-mapping –

+0

スタックオーバーフローは実際には一般的には設計されていません "どうすればいいですか?この "タイプの質問。それは具体的に設計されたものです。「私はXを試しましたが、Yは期待されましたが、代わりにZがあります。試したことは何でも投稿できますか?あなたの[mcve]はどこですか?どのように起動するのか分からない場合は、小さくしてください:画像を長方形にマッピングできますか?もしあなたが立ち往生したら、そこからあなたのやり方で仕事をしてください。がんばろう。 –

答えて

0

Processingエディタには、テクスチャイメージを球にマップするサンプルが付属しています。これは、球を三角形に分割し、texture()vertex()関数を使用してテクスチャ付き球を描画することで行います。うまくいけば、これは良いスタートですが、より一般的に

/** 
* 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(); 
} 

textured sphere

あなたがここにFile > Examples > Topics > Textures > TextureSphereに行くことによって処理エディタからコードを取得することができますが、コードのスタックオーバーフローISN私はこのタイプの質問をどのように行うのですか?それは具体的に設計されたものです。「私はXを試しましたが、Yは期待されましたが、代わりにZがあります。試したことは何でも投稿できますか?あなたのMinimal, Complete, and Verifiable exampleはどこですか?

開始方法がわからない場合は、小さくしてください。画像を長方形にマッピングできますか?もしあなたが立ち往生したら、そこからあなたのやり方で仕事をしてください。がんばろう。

+0

本当に感謝@ケビン、また私は処理中にあなたのメモを持っている、実際には私はここで初心者であり、どのようにチケットを開いて、どのように応答することを認識していない、特定のトピック –

+0

@ Hamidskそれは本当にスタックオーバーフローの仕組みではありません。あなたはそれらに質問へのリンクをメールで送ることができますが、スタックオーバーフローを介してメッセージを送信することについて話しているのであれば、それは実際には行われません。 –

関連する問題