#author("2023-02-27T14:40:42+09:00","default:kyo-in","kyo-in") #author("2023-04-26T15:01:47+09:00","default:kyo-in","kyo-in") **モデリング [#q1f9d010] 3次元図形を作っていきます. **beginShape,endShape関数 [#i7d5a84f] 3D空間は前回の続きで,以下のように設定します. #ref(../第1回/changecam.png,50%); void setup() { size(640, 480, P3D); } void draw() { background(127, 127, 127); camera(100, -100, 100, 0, 0, 0, 0, 1, 0); stroke(255, 0, 0); line(0, 0, 0, 100, 0, 0); stroke(0, 255, 0); line(0, 0, 0, 0, 100, 0); stroke(0, 0, 255); line(0, 0, 0, 0, 0, 100); } Processingでは図形を作成する方法として,以下のような方法があります. beginShape(); vertex(0, 0, 0); vertex(0, -50, 0); vertex(50, -50, 0); vertex(50, 0, 0); endShape(CLOSE); beginShape関数で,図形の作成の開始を宣言します.vertex関数で図形の頂点を作成し,すべての頂点を作成し終えたらendShape関数で図形の作成の終了を宣言します.endShape関数の引数CLOSEは,最初の頂点と最後の頂点を自動的につなげて図形を閉じるよう指示します. #ref(./verticies.png,50%); 2次元の図形と同じように,図形の輪郭線の色はstroke関数で,内部を塗りつぶす色はfill関数で変更できます. **PShapeクラス(*Ver.2.0以上) [#v3a3b7d2] 図形を作成するもう一つの方法としてPShapeクラスを用いる方法があります. PShape s; void setup() { ... s = createShape(); s.beginShape(); s.vertex(0, 0, 0); s.vertex(0, -50, 0); s.vertex(50, -50, 0); s.vertex(50, 0, 0); s.endShape(CLOSE); } void draw() { ... shape(s); } 色を除けばbeginShape,endShape関数と同じ実行結果が得られます. PShapeクラスのインスタンスをcreateShape関数で生成し,メソッドbeginShapeで図形の頂点の作成を開始,vertexメソッドで頂点を作成,endShapeメソッドで頂点の作成を終了します.使い方は先ほどのbeginShape,endShape関数とほぼ同じであることがわかります. 描画する際は,shape関数にPShapeクラスのインスタンスを引数に指定します. また色を変更したい場合はfillメソッド,strokeメソッドを使用します. s = createShape(); s.beginShape(); s.stroke(0, 255, 0); s.fill(0, 255, 255); s.vertex(0, 0, 0); s.vertex(0, -50, 0); s.vertex(50, -50, 0); s.vertex(50, 0, 0); s.endShape(CLOSE); **beginShape,endShape関数とPShapeクラスの使い分け [#u08a0662] beginShape,endShape関数による図形の作成は手軽に使えるという利点があります.しかしながら,描画前に毎回頂点の作成を行う必要があります.そのため,頂点数の多い図形ではCPUへの負荷が高くなります.また,同じ図形を再度描画したい場合には,再度同じ手順で頂点を作らなければいけません. PShapeクラスは,使用するために少し準備が必要です.しかしながら,事前にすべての頂点を作成しておけるため,頂点数の多い図形でも描画時の負荷が少なくなるという利点があります.また,再度同じ図形を描画したい場合にも頂点を再度作成する必要がありません. **図形を作成する関数 [#c76df6a5] 基本的な図形は,作成してくれる関数が用意されています. 四角形:box関数~ -http://www.processing.org/reference/box_.html 球:sphere関数~ -http://www.processing.org/reference/sphere_.html **図形の形状の変更 [#fb1ffda3] vertex関数,またはvertexメソッドで作成された頂点をどのように描画するかはbeginShape関数,メソッドの引数で指定することができます. 詳細はリファレンスを参照してください. -https://www.processing.org/reference/beginShape_.html **課題の提出先・提出方法 [#h475884f] 招待されているBoxアップロードフォルダ「第2回」に自身の学籍番号のフォルダ(アルファベット大文字,例:20FI999)を''自身で作成し'',その中に各課題,指定された名前で完成させたスケッチフォルダごとアップロードしてください. ''提出締め切り:11月19日(金) 23:59'' ''提出締め切り:5月3日(水) 23:59'' BOXアップロードフォルダの招待メールが来ていない,また,WebClassで本講義が見えない方は森谷まで連絡ください. **課題1 [#t0e83722] 円盤を作成せよ. 提出スケッチフォルダ名:BASIC2_1 #ref(./disk.png,50%); **課題2(*任意課題に変更) [#vb2a9c04] **課題2 [#vb2a9c04] 円柱を作成せよ. 提出スケッチフォルダ名:BASIC2_2 以下の画像では,側面の板をbeginShape(TRIANGLES);で作成しているが,beginShape(QUADS);でも構わない. #ref(./cylinder.png,50%); **課題3(任意) [#q99c737f] sphere関数を用いずに球のモデルを作成せよ(分割数などは任意でよい). 提出スケッチフォルダ名:ADVANCE2_1 -https://processing.org/reference/sphere_.html ヒント:「[[球 パラメータ形式:https://www.google.com/search?q=%E7%90%83+%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E5%BD%A2%E5%BC%8F&oq=%E7%90%83%E3%80%80%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E5%BD%A2%E5%BC%8F&aqs=chrome..69i57.5570j0j7&sourceid=chrome&ie=UTF-8]]」(google検索) ・実装例 #ref(./advance_2_1.png,50%); 上図に示す通り,経度,緯度方向に平面を並べて構成された球はUV Sphereなどと呼ばれる.実装が容易な一方で,極付近で平面が密になるため,3DCGにおいては用途に向かない場面もある.一方下図(Blenderより)のように三角面で構成される球もあり,Ico Shpereなどと呼ばれる.Ico Shpereは面が均等に分布し,各面を再分割することで表面を滑らかにすることができるなどの利点がある. #ref(./icosphere.png,50%);