- 締切済み
3Dグラフィック 多数の球の描画
3次元で多数の球の描画をしたいのですが、何か良い方法はありませんでしょうか? 目の前に、障害物があった場合、その障害物の大きさ、数量の違いでどの程度視野が違うかを視覚的に表したいと考えています。 そのため、X座標、Y座標、Z座標とバブル径の寸法まで統一したいと思っています。 (各座標間隔が示す1とバブルの半径が示す1を見た目で同じサイズにしたいです。) よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- wek00
- ベストアンサー率61% (91/147)
やりたいことがはっきりとは分かりません。 視覚的に表して、どうしたいのですか? また、見た目で同じサイズにしたいとのことですが、 遠いと小さく見える現象との兼ね合いはどうするのですか。 広い視野をカバーする場合は画面の枚数を増やすか印刷する かして立体的に配置、といった手法を採らないといけないでしょう。 画面が1枚でそこに表示するだけなら難しくはないと思います。 しかし、それだと大画面でも視野角は90度辺りが限界です。 それで事足りるのでしょうか。 以下、画面1枚に球を描画するVCSSLのサンプルコード(差分のみ。diffで作成) とその実行結果です。VCSSLはドキュメントがよく整備されているのでいいですね。 7a8,11 > import Math; //random > > > // 元ファイル:VCSSL v3.3r18 標準添付のGraphics3DFrameworkTest.vcssl 18c22 < const bool TEST_2D_RENDERING = true; --- > const bool TEST_2D_RENDERING = false; 32c36 < testGetWindowSize(); --- > // testGetWindowSize(); 36c40 < testGetMagnification(); --- > // testGetMagnification(); 55c59 < int axis = newAxisModel(3.0, 3.0, 3.0); --- > int axis = newAxisModel(0.15, 0.15, 0.15); 59,60c63,64 < int cone = newConeModel(1.4, 1.4, 2.0, 20, 14); < moveModel(cone, 2.0, 0.0, -1.0); --- > int cone = newConeModel(0.14, 0.14, 0.2, 20, 14); > moveModel(cone, 0.2, 0.0, -0.1); 66c70 < sphere = newSphereModel(1.4, 1.4, 1.4, 20, 14); --- > sphere = newSphereModel(0.025, 0.025, 0.025, 20, 14); 68d71 < moveModel(sphere, 1.0, 0.0, 0.0); 69a73,85 > > int npcs = 32; > int sphereids[npcs]; > for( int i=0; i<npcs; i=i+1 ){ > sphereids[i] = newSphereModel(0.02, 0.02, 0.02, 10, 7); > setModelColor(sphereids[i], 255, 160, 64, 255); > moveModel(sphereids[i], (random()-0.5)/5, (random()-0.5)/5, (random()-0.5)/5); > mountModel(sphereids[i], renderer); > setModelEmissive( sphereids[i], 0.5 ); > } > setViewLocation( renderer, 0.0, 0.0, 0.5 ); // 視点の初期値は原点の手前0.5にする > setGraphics3DClip( renderer, 0.01, 30000.0 ); // 視点の至近からかなり遠くまで省略せず描画する > 79a96,97 > //視点を移動してみる > rotViewY(renderer, 0.01 ); 143c161,167 < setMagnification(1400.0); --- > setMagnification(0.5 * 100 / 2.54 * 120); //うちのキカイは120dpiだった > // 1 [inch] = 2.54 [cm] > // 1m 先の半径 1mの円は > // d m先のスクリーン上の d mの円と同寸に見える > // n [pixel] 上記の円のサイズをドット数で > // x [dpi] スクリーン解像度(画素密度) > // n / x = d * 100 / 2.54 [inch]
お礼
ご回答ありがとうございました。 VCSSLを知らなかったので、非常に参考になりました。 ご質問いただいた >視覚的に表して、どうしたいのですか? について、 障害物をどれだけ取り除けば、もしくは、障害物をどれだけおいても、視界が確保されるかをビジュアル的に説明したかったのです。 視野というか、視界の方が適切な言葉でしょうか? 質問に適切に回答できていないかもしれませんが、上記の目的です。 また、まずはある単位体積のみのビジュアル的な描画だけでもと思っておりますので、ご回答頂いた内容が参考となりました。