この前、オーバーニーソックスやTシャツを作ろうとして、
身体のポリゴンメシュ形状をコピー後ひとまわり大きくしようとした時のこと
画像1の形状に対して、画像2の点線のような形状が欲しくて均等拡大したら、
画像3の点線のような形状になってしまった。当たり前といえば当たり前なんだけど・・・
画像1 | 画像2 |
画像3 | |
他の方法を調べてみる。
「ベベル」・・・使えるのかどうかよくわからない。
「厚みをつける」は非常におしかったけどやりたいこととちょっと違った。(というか別の手間が生じた・・・)
仕方がないので久々にPythonスクリプトを作ることにした。
「Shade Python スクリプトリファレンスで検索したい!」で紹介した方法で「法線」を検索してみると、
頂点の法線を取得できるようにする命令 setup_normal を見つけた。
確か頂点の法線は、その頂点を含む面の全ての面の面法線ベクトルを足した後、
単位ベクトル(SHADEでは1mm?)化したものだ。各頂点から頂点法線を描くと画像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 |
このスクリプトを使って作ったLioのオーバーニーのストッキング!
殆ど手をかけていないのにいい感じ。
こんなに簡単にできるなら早く作っておけばよかった。
それにしても、
←ストッキングのパッケージ写真みたい・・・