見出し画像

【Processing】画面内を3Dと2Dのエリアに分割して使いたい

【状況】3D表示をしつつ,文字情報は右半分の2Dで表示したい.3D空間に文字を置いてもいいけど,文字に3Dの設定が及ばないようにするとか面倒なので,完全に独立させたかった(なんだか使ったことがないProcessingをやることになってしまった).(Processing 4.3)
【対処】createGraphicsで3D, 2D用の画面を個別に作って親画面内に配置するのが一番簡単みたい,のメモ.
もちろん,3Dと3D, 2Dと2Dも可です.

各表示画面を作って配置

マルチウィンドウに~みたいな記事はいろいろありましたが,画面は一つで画面内で分割して,みたいなのが見つからず.余計な計算が必要になるので座標系が独立になる方法を探索.ここでは,メインのキャンバスを作り,createGraphicsで各画面を作成し,imageで配置しました.3Dの箱はクルクル回っています.

PGraphics pg2D;
PGraphics pg3D;

void setup() {
  size(800, 400, P2D); // メインのキャンバス

  // 2DのPGraphicsオブジェクトを作成
  pg2D = createGraphics(400, 400, P2D);

  // 3DのPGraphicsオブジェクトを作成
  pg3D = createGraphics(400, 400, P3D);
}

void draw() {
  // 3D画面に箱を描画
  pg3D.beginDraw();
  pg3D.background(0);
  pg3D.lights();
  pg3D.fill(0, 0, 255);
  pg3D.translate(pg3D.width / 2, pg3D.height / 2);  // 画面中央
  pg3D.rotateX(frameCount * 0.01);                  // x軸回り回転量
  pg3D.rotateY(frameCount * 0.01);                  // y軸回り回転量
  pg3D.box(50);
  pg3D.endDraw();

  // 2D画面に文字を描画
  pg2D.beginDraw();
  pg2D.background(200);  
  pg2D.fill(0);                   // テキストの色
  pg2D.textAlign(CENTER, CENTER);
  pg2D.text("Hello, Processing!", pg2D.width / 2, pg2D.height / 2);  // 画面中央
  pg2D.endDraw();

  // 各PGraphicsオブジェクトを画面に表示(左側に2D,右側に400ずらして2D)
  image(pg3D, 0, 0);
  image(pg2D, 400, 0);
}
左が3D,右が2Dで座標系が独立した画面

位置関係を変えたければ,imageの座標をいじるだけ.

  image(pg3D, 400, 0);
  image(pg2D, 0, 0);
左が2D,右が3D

もっと画面数を増やしたければ,メインキャンパスを大きくして,キャンパスを追加して再配置するだけでできますね.

日本語を表示するにはフォント設定が必要

日本語を入れたら何も出ず.なるほど,デフォルトではASCII文字しか表示できないのね.日本語フォントを設定する必要がありました.

PGraphics pg2D;
PGraphics pg3D;
PFont japaneseFont;  // 日本語フォント

  pg2D.textAlign(CENTER, CENTER);
  pg2D.textFont(japaneseFont);    // 日本語フォントを設定
  pg2D.text("どすこい,Processing!", pg2D.width / 2, pg2D.height / 2);  // 画面中央
  pg2D.endDraw();
日本語も表示されました

単純な表示以外は試していないので,いろいろやろうとすると問題が起きるかも?
とりあえず基本形はできたから,よし♪

この記事が気に入ったらサポートをしてみませんか?