しおんの部屋

3DCG とか スクリプト とか…

Pythonの小技 形状をひとまわり大きくしたい!(SHADE版)

2014年04月06日 | SHADE

この前、オーバーニーソックスやTシャツを作ろうとして、
身体のポリゴンメシュ形状をコピー後ひとまわり大きくしようとした時のこと

画像1の形状に対して、画像2の点線のような形状が欲しくて均等拡大したら、
画像3の点線のような形状になってしまった。当たり前といえば当たり前なんだけど・・・

画像1 画像2
1 2
画像3
3

他の方法を調べてみる。

「ベベル」・・・使えるのかどうかよくわからない。

「厚みをつける」は非常におしかったけどやりたいこととちょっと違った。(というか別の手間が生じた・・・)

仕方がないので久々にPythonスクリプトを作ることにした。

Shade Python スクリプトリファレンスで検索したい!」で紹介した方法で「法線」を検索してみると、
頂点の法線を取得できるようにする命令 setup_normal を見つけた。

確か頂点の法線は、その頂点を含む面の全ての面の面法線ベクトルを足した後、
単位ベクトル(SHADEでは1mm?)化したものだ。各頂点から頂点法線を描くと画像4となる。
どうやら各頂点の座標に頂点法線ベクトルの倍数を足せば画像5のようになり、目的が達成できそうだ。

画像4 画像5
4 5

Pythonのスクリプトはこんな感じ。

#
# z_頂点法線方向に拡大縮小
#
# ポリゴンメッシュを選んで実行すると
# コピーしたポリゴンメッシュの各頂点を頂点の法線ベクトルの方向に M mm 移動する事で、形状全体を拡大縮小する。
# 頂点の法線ベクトルは、通常、形状の外向きで長さ1mm(単位ベクトル)
#
M=1
#
def Vadd(A,B): return (A[0]+B[0],A[1]+B[1],A[2]+B[2])
def Vmul(A,B): return (A[0]*B   ,A[1]*B   ,A[2]*B   )
#
xshade.message_view().clear_message() #メッセージウインドウの内容を消去
xshade.scene().enter_modify_mode() #形状編集モードに入る。
while(1):
  #
  sh0 = xshade.scene().active_shape()
  if( sh0.type != 7 ): print "type != 7"; break
  #
  xshade.scene().copy_object( [0,0,0] , [1,1,1] , [0,0,0] , [0,0,0] )
  sh1 = xshade.scene().active_shape()
  sh1.name=sh1.name+"_cp"
  #
  print " M=",M
  sh0.setup_normal() #選択形状に法線を設定する
  for i in range(sh0.total_number_of_control_points):
    sh1.vertex(i).position=Vadd(sh0.vertex(i).position,Vmul(sh0.vertex(i).normal,M)) # 頂点の法線のM倍を加える
  #
  break

Lio140325a_b2 このスクリプトを使って作ったLioのオーバーニーのストッキング!
殆ど手をかけていないのにいい感じ。
こんなに簡単にできるなら早く作っておけばよかった。

それにしても、
←ストッキングのパッケージ写真みたい・・・

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« Shade Python スクリプトリフ... | トップ | artist side 人体モデリング ... »

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

SHADE」カテゴリの最新記事