2018年06月

2018年06月28日

ビットマップペイントツールのチュートリアルをやってみた その153 3dsmax 2018

引き続きMAXScriptマニュアルに載っている「チュートリアル-ビットマップペイントツールを9つの簡単なステップで作成する」 の続きを考えて見たい。

前回プログラムを作ってる時になぜかRGBの値が(222,222,222)、(223,223,223)の時だけビットマップの色がおかしくなるのに気付いた。

下のプログラムはそれを検証するためのものだ。

(
  global Test_CanvasRollout
  try (destroyDialog Test_CanvasRollout) catch()
  local isDrawing = false
  local bitmapX = bitmapY =250
  local theCanvasBitmap = bitmap bitmapX bitmapY color:white
 
  rollout Test_CanvasRollout "Paint Test"
  (
    bitmap theCanvas width:bitmapX height:bitmapY bitmap:theCanvasBitmap
    spinner col "gray scale" range:[0,255,220] type:#integer

    fn draw val = (
      theCanvasBitmap  = bitmap bitmapX bitmapY color:white
      for y = 25 to 225 do (
        for x = 25 to 225 do (
          c = color val val val
          setPixels theCanvasBitmap  [x,y] #(c)
        )
      )
      theCanvas.bitmap = theCanvasBitmap 
    )

    on col changed val do 
    (
      draw val
    )
  
    on Test_CanvasRollout open do (
      draw col.value
    )
  )
  createDialog Test_CanvasRollout bitmapX  (bitmapY + 40)
)

起動すると下のダイアログが表示され、スピナーでグレースケールの値を変えると、その値をRGB値にした色でビットマップがペイントされる。下の画面は(220,220,220)でペイントしたものだ。

fig01

グレースケールなら(0,0,0)から(255,255,255)にかけて黒から白に徐々に変化していくはずだけど、なぜか222、223で下のようにまるで下のダイアログの背景色が透けたようになってしまう。

fig02

これはいったいなんだろう?

続きはまた次回。

maxまとめページ



take_z_ultima at 11:30|この記事のURLComments(0)3ds Max | CG

2018年06月27日

パーティクル系のアセンブリプリセットについて調べてみた その6 modo12

引き続き「presets」パネルの「Particles」にあるアセンブリを調べてみたい。

今回は「Flock of Seagulls」を調べてみたい。

このアセットは下の画像のようにかもめの群れを生成する。

fig01

シーンに読み込むと下のようにいろいろなアイテムが読み込まれる。

fig02

下の画像の円錐状の「Radial Emitter」で円錐状のエリア方向にパーティクルを生成して、「body」「body(2)」「body(3)」を「Replicator」で割り当てている。

fig03

「body」はその下に「wingR」「wingL」がペアレントされていて、下のようにかもめの胴体と羽にパーツが別れている。

fig04

このかもめの3つのボディは「birds」と言う名前でグループ化されていて、

fig08

「Replicator」の「原型となるアイテム」として指定され、「子アイテムを含む」がONになっているので、パーティクルには3種類のかもめのモデルが羽ごと割り当てられる事になる。

fig07

続きはまた次回。

modo10-11ブログ目次



take_z_ultima at 11:30|この記事のURLComments(0)modo | CG

2018年06月26日

ビットマップペイントツールのチュートリアルをやってみた その152 3dsmax 2018

引き続きMAXScriptマニュアルに載っている「チュートリアル-ビットマップペイントツールを9つの簡単なステップで作成する」 の続きを考えて見たい。

今のところどうやってエッジのパターンを広げてペイントしたらいいか考え中なので、とりあえずプログラムを確認するためのテストプログラムを書いてみた。

(
 global Test_CanvasRollout
 try (destroyDialog Test_CanvasRollout) catch()
 local isDrawing = false
 local bitmapX = bitmapY =250
 local theCanvasBitmap = bitmap bitmapX bitmapY color:white
 
 rollout Test_CanvasRollout "Paint Test"
 (
   bitmap theCanvas width:bitmapX height:bitmapY bitmap:theCanvasBitmap
   spinner toX "0 to X" range:[0,100,100] type:#float
   spinner toY "0 to Y" range:[0,100,100] type:#float
   button testButton "Test" 
    
  fn pcol px py = (
    x = px - bitmapX/2
    y = bitmapY/2 - py 
    r =  sqrt(x*x+y*y) / 100.0
    if r>1.0 then r = 1.0
    c = (1.0 - cos(90*r)^2)*255
    return (color c c 255)
  )
  
  fn is_in px py = (
    x = px - bitmapX/2
    y = bitmapY/2 - py
    dstx = toX.value
    dsty = toY.value
    if dstx == 0.0 then (
      if x<0.0 then  false else true 
    ) else (
      if (y > dsty/dstx * x) then  false else true 
    )
  )

  fn overdraw = (
    dstx = toX.value
    dsty = toY.value
  )
  
  on testButton pressed do 
  (
    theCanvasBitmap  = bitmap bitmapX bitmapY color:white
    for y = 25 to 225 do (
      for x = 25 to 225 do (
        if (is_in x y) then (
          c = pcol x y
          setPixels theCanvasBitmap  [x,y] #(c)
        )
      )
    )
    overdraw
    theCanvas.bitmap = theCanvasBitmap 
  )
 )
 createDialog Test_CanvasRollout bitmapX  (bitmapY + 80)
)

これを実行すると下のようなパネルが表示されて、「Test」ボタンを押すと円のグラデーションのパターンが半分だけ描かれる。このグラデーションの中心を通る線をエッジとしてそのパターンのまま広げてペイントするプログラムを考えるわけだ。その部分は上のプログラムの「overdraw()」に記述する予定。この切断面は下の2つのスピナーの値によって角度が変えられる。デフォルトでは(0,0)から(100,100)を通る直線になっている。

fig01

続きはまた次回。

maxまとめページ



take_z_ultima at 11:30|この記事のURLComments(0)3ds Max | CG

2018年06月25日

パーティクル系のアセンブリプリセットについて調べてみた その5 modo12

引き続き「presets」パネルの「Particles」にあるアセンブリを調べてみたい。

今回は「Circular Emitter」を調べてみたい。下の画像がアセンブリだ。

fig01

これをシーンに追加して、同じく追加した「Particle Simulation」と下のように繋いでシミュレーションを実行してみると、

fig02

シーンに追加された円の中からパーティクルが発生するのが確認できる。

fig03

アセンブリのアイテム構成は下のようになっていて、シーンに円として表示されているのはロケータの形状だ。そしてその下に非表示の状態で24角形のポリゴン「circleEmitter_geo」が配置されている。

fig04

「circleEmitter_geo」を表示状態にして横に移動させてみると下のようになる。

fig05

アセンブリの中身は下のようになっていてとても単純だ。

fig06

アセンブリの外部に公開されたチャンネルはほぼ「サーフェスエミッター」ノードにそのまま接続されていて、「circleEmitter_geo」のポリゴンが「サーフェスエミッター」の発生場所になっている。そして「Emitter Radius」チャンネルの値は2倍にされて、タイプが「スケール」の「マトリクス構築」ノードのXとZチャンネルに入力されてX−Z平面で「Emitter Radius」チャンネルの値の2倍の値でスケーリングされる変換マトリクスが生成されて、「Circle Emitter」のワールドスケールチャンネルに入力されて、ロケータとポリゴンの直径がスケーリングされる。

fig07

これでパーティクルが噴出する円のサイズが「Emitter Radius」チャンネルを半径サイズとして調整出来るようになるわけだ。

続きはまた次回。

modo10-11ブログ目次



take_z_ultima at 11:30|この記事のURLComments(0)modo | CG

2018年06月21日

ビットマップペイントツールのチュートリアルをやってみた その151 3dsmax 2018

引き続きMAXScriptマニュアルに載っている「チュートリアル-ビットマップペイントツールを9つの簡単なステップで作成する」 の続きを考えて見たい。

前回までの変更で「paintFace()」の中でどのエッジが不連続UVエッジなのかのデータが「side」と「cap」の各頂点座標データの3番目に入っている状態になった。

不連続境界部分をはみ出してペイントするためには多角形のペイントが終わった後で、このデータを参考に、ペイントした多角形の1周ぶんのエッジを順に調べて、不連続エッジのものについて、エッジ上のピクセルのカラーパターンをそのまま外側に広げるようにペイントする必要がある。

fig01

このペイントは簡単なようで結構面倒だ。エッジの外側に平行に線を描こうとすると、ピクセルに隙間が出来そうだし、線上のピクセルをサンプリングする時もペイントされてないピクセルをサンプリングするような事も起きそうだ。平行線で隙間が出来るなら線を描く間隔を詰めて重ね塗りする方法も考えられるし、1ピクセル塗る時に少し範囲を大きく塗って行く方法や、塗り潰す範囲を多角形にしてその中のピクセルを順に塗り潰すようにして、各ピクセルに対応するエッジ上の位置を求めてその位置のピクセルの色をサンプリングして塗る方法も考えられる。

とりあえずいろいろ作って試してみる必要がありそうだな。

続きはまた次回。

maxまとめページ



take_z_ultima at 11:30|この記事のURLComments(0)3ds Max | CG
Archives