takashi42332007-05-14

旧バージョンでは引数が2つ(横幅,縦幅)のみだったのですが.バージョンアップして,3つの引数を取れるようになったんだって.折角だから,少し適当に訳してみました.


英語サイトのリファレンス
size() \ Language (API) \ Processing 3+

sizeの第3引数はレンダリングエンジンを選択するものです.もしあなたがwebで使う3次元の形を描きたいのであればP3Dを使い,OpenGLのプログラムとしてエクスポートしたいのであれば,OpenGLを引数に選びましょう.

  1. P2D(Processing 2D):Java 1.1にサポートされた2Dレンダリングです.
  2. P3D :webで早い3Dレンダリングです.
  3. JAVA2D:デフォルトのレンダリング,全体的に高いクオリティであるがP2Dよりも遅いです.
  4. OPENGL:もしOpenGL Graphic Cardがインストールされていれば,OpenGLのハードウェア加速器と調和して速度を高める事が出来ます.


もし,あなたが,ピクセルの操作(get()やblend()といったメソッドを使ったり,pixels[]配列を操作する)をするのであれば,P3D(同様にP2D)はデフォルト設定であるJAVA2DやOPENGL設定よりもより軽快に動きます.同様に,多くのイメージを処理する時や,ビデオの再生をする時は,P3Dはしばしば早くなるでしょう.

立て幅と横幅の最大値は,あなたのOSによって制限されます.そして,それは大抵あなたの実際のスクリーンの縦横値と同じです.いくつかのマシンでは,単純にあなたの現在のスクリーンのピクセルの数です.つまり,800x600の解像度のスクリーンを使っている場合,size(1600,300)を利用する事が可能という事を意味しています.

この変更により,あなたは自分自身が求めるものを見つけるまで,いろいろなサイズやレンダリングモデルを試みるべきである.また,もしあなたがより大きなサイズが必要になったならば,non-visual drawing surfaceを作り出す,createGraphicsを用いましょう.

とのことです.じゃぁ,早速試してみようじゃない.因に,おいらのiBookG4のビデオカードATI Mobility Radeon 9200(VRAM32M)です.

文末につけるプログラムを用いて「3次元のキューブ」を描画してみた,まずはP3Dで実行してみたところ,直ぐに描画されてその後もサクサク動く.次にOPENGLでやると,ライブラリーが足りませんって言われる.そこで,文頭に

import processing.opengl.*;

openglライブラリーをimportしてみると動いた........が,起動に物凄く時間がかかる...まぁRadeonだから仕方ないのかなぁ〜....動いてしまえばおおきな違いは無い様な感じがする...って,おいらが気づかないだけかな(汗


次に文末の「2次元平面」のプログラムを実行したらJAVA2DとP3Dでは動いたけど,P2Dが動かなかった.なんでだろうね?ただ,この程度だとさほど影響を受けない気がする....


あと,文末のプログラムに

  beginShape(QUADS);
  vertex(50, 50);
  vertex( 150, 50);
  vertex( 150, 150);
  vertex(50, 150);
  endShape();

beginShapeメソッドを用いています.引数には,頂点をどのように結ぶかを決めます.引数の詳細は以下のリンク先を参照してください.
beginShape() \ Language (API) \ Processing 3+



今回用いたサンプル
3次元キューブ

import processing.opengl.*;

float xmag, ymag = 0;
float newXmag, newYmag = 0; 
 
void setup() 
{ 
  size(200, 200, OPENGL);
  noStroke(); 
} 
 
void draw() 
{ 
  background(0.5, 0.5, 0.45);
  
  pushMatrix(); 

  //translateはローカル座標系の移動です,引数は(x方向,y方向,z方向)です. 
  translate(width/2, height/2, -30); 
  
  newXmag = mouseX/float(width) * TWO_PI;
  newYmag = mouseY/float(height) * TWO_PI;
  
  float diff = xmag-newXmag;
  if (abs(diff) >  0.01) { xmag -= diff/4.0; }
  
  diff = ymag-newYmag;
  if (abs(diff) >  0.01) { ymag -= diff/4.0; }
  
  rotateX(-ymag); 
  rotateY(-xmag); 

  //ローカル座標系のscaleを  
  scale(50);


  //beginShapeとendShapeの間に頂点を表示し,その間をどのように保管するかのパラメータを引数にとる
  beginShape(QUADS);

  vertex(-1,  1,  1);
  vertex( 1,  1,  1);
  vertex( 1, -1,  1);
  vertex(-1, -1,  1);

  vertex( 1,  1,  1);
  vertex( 1,  1, -1);
  vertex( 1, -1, -1);
  vertex( 1, -1,  1);

  vertex( 1,  1, -1);
  vertex(-1,  1, -1);
  vertex(-1, -1, -1);
  vertex( 1, -1, -1);

  vertex(-1,  1, -1);
  vertex(-1,  1,  1);
  vertex(-1, -1,  1);
  vertex(-1, -1, -1);

  vertex(-1,  1, -1);
  vertex( 1,  1, -1);
  vertex( 1,  1,  1);
  vertex(-1,  1,  1);

  vertex(-1, -1, -1);
  vertex( 1, -1, -1);
  vertex( 1, -1,  1);
  vertex(-1, -1,  1);

  endShape();
  
  popMatrix(); 
} 


2D平面

void setup() 
{ 
  size(200, 200, P2D);
  noStroke(); 
} 
 
void draw() 
{ 
  background(0.5, 0.5, 0.45);
  
  beginShape(QUADS);
  vertex(50, 50);
  vertex( 150, 50);
  vertex( 150, 150);
  vertex(50, 150);
  endShape();
  
}