●Shade書捨てスクリプト

2010年12月 9日    

Shade12が発売になりましたね
今まで10.5を使っていましたがアップデートして色々試してみています
ただ自分の使うスクリプトでクラッシュしたりするので移行はまだまだ先かな
ムービーを作るのに使う使い捨てスクリプトをメモ

最初にバインド設定したものの上の階層の設定を足したい場合に使うスクリプト

# coding: utf-8
#選択形状でループ
for shape_ in xshade.scene().active_shapes:
	#コントロールポイントでループ
	for i in xrange(shape_.total_number_of_control_points):
		#ポリゴンメッシュのみを処理対象に
		if shape_.type != 7 :continue
		vind_list = []
		#頂点のバインドの数を取得
		target = shape_.vertex(i)
		bind_num = target.skin.number_of_binds
		for j in xrange(bind_num):
			bind = target.skin.get_bind(j)
vind_list.append([bind.shape,bind.weight]) target.skin.append_bind() #target.skin.get_bind(0).shape = target.skin.get_bind(0).shape.parent #0番のバインドを削除する for j in xrange(bind_num): target.skin.get_bind(j+1).shape = vind_list[j][0]
target.skin.get_bind(j+1).weight = vind_list[j][1]
shape_.update_skin_bindings()

Shade12から追加されたプリミティブ形状を作成するスクリプト
スクリプトではカプセル形状を親子階層になったボールジョイントの位置に作成

# coding: utf-8
#xshade.scene().create_primitive_capsule(None,「プリミティブ:0,自由曲面:1,ポリゴンメッシュ:3」,True,「U方向の分割数:16」,「V方向の分割数:16」,「開始位置の中心座標」,「直径」, 1, 「終了位置の相対座標」)
scene_ = xshade.scene()
shape_ = xshade.scene().active_shape()
if shape_.type == 2 and shape_.part_type == 10:
	if shape_.parent.type == 2 and shape_.parent.part_type == 10:
		point1 = shape_.parent.ball_joint.position
		point2 = shape_.ball_joint.position
		pos_2 = map((lambda x,y:x-y),point2,point1)
		size1 = shape_.ball_joint.size
		scene_.create_primitive_capsule(None,3,True,20,16,point1,size1,1,pos_2)

座標変換とかには対応してないので

ボールジョイントを回転等をさせると明後日の位置に作成されてしまいますがメモってとこで

●Shadeの線形状をコミスタの定規に

2010年9月11日    

ComicStudioの3Dレイヤに続き定規レイヤーのデータの解析をしてみました
フォトショップのパスやShadeの線形状と同じベジェも使えるようなので

過去の自作スクリプトを活用してカメラウィンドウの表示のまま
Shadeの線形状をコミスタのレイヤーファイルとして書き出すスクリプトを
書いてみました。
146514837.jpg
本当はもう少し使いやすいものに仕上げたかったのですが
しばらくいじっていられそうにないので 暫定版の書捨てスクリプトのまま公開
line_to_cru100911.lzh
Shadeのブラウザ上で選択している線形状が書き出し対象になります
スクリプトを実行して生成された拡張子.cruのファイルを
ComicStudioでファイル>読み込み>レイヤーファイルで読み込みます
定規のレイヤーフォルダを選択した状態だと定規レイヤーとして
画像レイヤーを選択した状態だと そのレイヤーのサブ定規として読み込まれるようです

●Shadeのカメラ情報をComicStudioに

2010年8月 8日    

先に公開していたSketchUpのカメラをComicStudioに書き出すものに続いて
ShadeのカメラデータをComicStudioに書き出すスクリプトを作成してみました
ExportCSD.py
フリーウェアですがソースコードの再利用に関してはご一報ください

カメラデータのみの書き出しで形状書き出しは未搭載です
形状の書き出しは別記事で紹介している
LWOエクスポートスクリプトをご利用ください

このスクリプトだけでは寂しいのでもうひとつ

作りだめしている小物の中から肉まんの蒸し器をUPしました
10080701.jpg
季節外れも甚だしいですが
よろしければご利用ください

●ランダム生成した頂点を結んで三角ポリゴンに

2010年4月 7日    

後々のために計算で生成した頂点座標から
三角ポリゴンで分割した形状を作るためのテストプログラムを書き捨て

#ランダム生成した頂点を結んで三角ポリゴンに
import random #ランダム生成のモジュール
import math

#交差判定
def closs_line(pos_1_1, pos_1_2, pos_2_1, pos_2_2):
#交差を判定するベクトルを求める
vec_0 = [pos_1_2[0] - pos_1_1[0], pos_1_2[1] - pos_1_1[1]]
vec_1 = [pos_2_1[0] - pos_1_1[0], pos_2_1[1] - pos_1_1[1]]
vec_2 = [pos_2_2[0] - pos_1_1[0], pos_2_2[1] - pos_1_1[1]]
#外積計算
normal_1 = vec_0[0]* vec_1[1]-vec_0[1]* vec_1[0]
normal_2 = vec_0[0]* vec_2[1]-vec_0[1]* vec_2[0]
#法線の方向が異なる場合延長線とは交差している
if normal_1* normal_2 < 0:
vec_4 = [pos_2_2[0] - pos_2_1[0], pos_2_2[1] - pos_2_1[1]]
vec_5 = [pos_1_1[0] - pos_2_1[0], pos_1_1[1] - pos_2_1[1]]
vec_6 = [pos_1_2[0] - pos_2_1[0], pos_1_2[1] - pos_2_1[1]]
#外積計算
normal_1 = vec_4[0]* vec_5[1]-vec_4[1]* vec_5[0]
normal_2 = vec_4[0]* vec_6[1]-vec_4[1]* vec_6[0]
if normal_1* normal_2 < 0:return 1
else:return 0
else:return 0

#点の座標を生成
vec2_point_list = []
for i in xrange(50):
pos_x = random.uniform(-100,100)
pos_y = random.uniform(-100,100)
vec2_point_list.append([pos_x, pos_y])
#print vec2_point_list
###稜線情報生成
##点列の頭から頂点同士の接続を調べる
edge_dic = {}#頂点番号:[接続先の頂点番号リスト] の辞書
for i in xrange(len(vec2_point_list)):
edge_i = []
pos_1_1 = vec2_point_list[i]#基準の頂点座標
#for j in xrange(i+1,len(vec2_point_list)):
for j in xrange(len(vec2_point_list)):
if i == j :continue
pos_1_2 = vec2_point_list[j]#接続確認先の頂点座標
#引く線分の長さ
length_1 = math.hypot(pos_1_2[0]- pos_1_1[0],pos_1_2[1]- pos_1_1[1])
closs_flag = 0
for k in xrange(i):
if closs_flag != 0 :continue
closs_list = []
edge_k_list = edge_dic[k]
edge_k_list2 = edge_k_list
pos_2_1 = vec2_point_list[k] #交差する線分の頂点1
for l in edge_k_list:
if l == i or l == j : continue
if l in closs_list: continue
pos_2_2 = vec2_point_list[l]#交差する線分の頂点2
#これまで生成された線分と新しく生成する線分の交差を判定
#交差した線がある場合 短い線を残し長い方の稜線を削除
closs = closs_line(pos_1_1, pos_1_2, pos_2_1, pos_2_2)
if closs == 1:
length_2 = math.hypot(pos_2_2[0]- pos_2_1[0],pos_2_2[1]- pos_2_1[1])
if length_1 closs_list.append(l)
#print "del: %i => %i(closs %i %i)" % (k,l,i,j)
else:closs_flag += 1
if closs_flag == 0:
#交差方向のエッジをリストから取り除く
for m in closs_list:edge_k_list2.remove(m)
edge_dic[k] = edge_k_list2
if closs_flag == 0:
edge_i.append(j)
edge_i = list(set(edge_i))
edge_dic[i] = edge_i

#Shadeのポリゴンメッシュ生成
xshade.scene().begin_creating()
xshade.scene().begin_polygon_mesh(None)
for i in vec2_point_list:
pos = [i[0], 0, i[1]]
xshade.scene().append_polygon_mesh_vertex(pos)
for i in xrange(len(edge_dic)):
if edge_dic[i]:
for j in edge_dic[i]:
xshade.scene().append_polygon_mesh_edge(i, j)
xshade.scene().end_polygon_mesh()
xshade.scene().end_creating()


●LWOエクスポート/インポートスクリプト バージョンアップです

2009年12月29日    

Shadeで.lwo(LightWave3D object file)をインポート/エクスポートするスクリプトをアップデートしました
Shade11への対応とUVの入出力に対応しました
通常Professionalでしか扱うことのできないlwoの形状データを扱うことができるようになります

Shade10/11のWidget形式となります
Shade10とShade11では別バイナリとなっています

ダウンロードしたファイルを解凍してできる
お使いのバージョンに合ったフォルダを開き
中にあるLWO_toolsフォルダごとShadeのWidgetsフォルダにコピーして
Shadeを再起動すれば利用可能になるかと思います
(詳しいインストール方法はShadeのマニュアルを参照してください)

http://artistside.com/?m=pc&a=page_fh_content&target_c_diary_id=15359

インポートは指定した形状のレイヤを一つのポリゴンメッシュとして作成
エクスポートはブラウザ上で選択した形状を選択形状毎に
ポリゴンメッシュに変換後それぞれをlwoとして出力します(複数形状可)

UVの入出力 テクスチャーの出力に対応しました
出力では距離UVのUV値と レイヤ1のテクスチャーデータをLWOに設定した状態で出力します
入力ではパラメタUVと距離UVの両方に同じUV値を設定します

テクスチャ出力の確認には(株)セルシスが販売しているComicStudioを利用しました
UV設定がされたポリゴンメッシュならばテクスチャー込みでコミスタ等に受け渡すことができるかと思います

●書き捨てスクリプト メモ

shadeの自作スクリプトのバグチェックのための書き捨てスクリプトをメモ

ポリゴンメッシュのuv値を(面id,頂点id):uv値 と出力するスクリプト


shd_shape = xshade.scene().active_shape()
for i in range(shd_shape.number_of_faces):
vertex_id_list =shd_shape.face(i) .vertex_indices#面を構成する頂点のid
uv_list = shd_shape.face(i).parameter_uv#パラメターUVの値を距離UVに
for j in xrange(len(uv_list)):
print "(" + str(i) + "," + str(vertex_id_list[j])+ ")" + str(uv_list[j])

●ShadeのUVをフォトショップの選択範囲に

2009年12月 1日    

書捨て状態だったスクリプトを公開
MacOSXのShadeとPhotoshop環境以外では使いようがないけれど
何かの参考に


import sys
import commands

##ApleScript部分ここから##
AppleScript_="""
on run argv
set argv_ to item 1 of argv
set point_list to {}
tell application "Adobe Photoshop CS3"
--activate
set width_ to width of current document as pixels
set Height_ to height of current document as pixels
if ((count word of argv_) mod 2) = 1 then
return
else
repeat with i from 1 to (count word of argv_) div 2
set a1 to (word (i * 2 - 1) in argv_ as number) * width_
set a2 to (word (i * 2) in argv_ as number) * Height_
set end of point_list to {a1, a2}
end repeat
end if
--選択範囲を追加
select current document region point_list combination type extended
end tell
end run
"""
##AppleScript部分ここまで##

##選択されている面のUVを取得
shd_shape = xshade.scene().active_shape()
f=commands.getoutput('osascript -e \'tell application \"Adobe Photoshop CS3\" to deselect selection of current document\'')
for i in range(shd_shape.number_of_faces):
if (shd_shape.face(i).active):
UV_list = shd_shape.face(i).distance_uv #距離UV
#UV_list = shd_shape.face(i).parameter_uv #パラメータUV値
argv_ = ""
for j in range(len(UV_list)):
(u,v) = UV_list[j]
argv_ = argv_ + str(u) + " " +str(v) + " "
(u,v) = UV_list[0]
argv_ = argv_ + str(u) + " " +str(v)
#print argv_
f=commands.getoutput('osascript -e \'' + AppleScript_ + '\' \''+ argv_ +'\'')
#print f
f=commands.getoutput('osascript -e \'tell application \"Adobe Photoshop CS3\" to activate\'')

●LWOエクスポート/インポートスクリプト作りました

2009年7月28日    

Shadeで.lwo(LightWave3D object file)をインポート/エクスポートするスクリプトを作成しました
通常Professionalでしか扱うことのできないlwoの形状データを扱うことができるようになります

Shade10のWidget形式となります
ダウンロードしたファイルを解凍してできるLWO_toolsフォルダごと
WidgetsフォルダにコピーしてShadeを再起動すれば利用可能になるかと思います
(詳しいインストール方法はマニュアルを参照してください)

インポートは指定した形状のレイヤを一つのポリゴンメッシュとして作成
エクスポートはブラウザ上で選択した形状を選択形状毎にポリゴンメッシュに変換後それぞれをlwoとして出力します

現状では形状データ以外のUV等は無視されますが 対応していく予定です
まだまだ未完成ですがご意見ご感想等お待ちしております

http://yukimi.moemoe.gr.jp/etc/LWO_tools.lzh

●コントロールポイント座標の記憶/適応

2009年7月10日    

形状操作する時に
コントロールポイントの座標を一時的に退避させておくのに使うスクリプトを書き捨て
スクリプトの実行内容はメモリに保持されるのでそれを利用


shape_ = xshade.scene().active_shape()

dialog1= xshade.create_dialog()
ibutton1 = dialog1.append_radio_button('/記憶/適応')
if dialog1.ask():
ask1 = dialog1.get_value(ibutton1)
if ask1 == 0:
#記憶
position_list = []
for i in xrange(shape_.total_number_of_control_points):
position_list.append(shape_.vertex(i).position)
elif ask1 == 1:
#適応
if ((shape_.total_number_of_control_points) == len(position_list)):
for i in xrange( len(position_list)):
shape_.vertex(i).position = position_list[i]

おまけ
Shadeの2つあるUVの値をもう片方の値へと設定するスクリプト


shd_shape = xshade.scene().active_shape()
for i in range(shd_shape.number_of_faces):
shd_shape.face(i).distance_uv = shd_shape.face(i).parameter_uv#パラメターUVの値を距離UVに
#shd_shape.face(i).parameter_uv = shd_shape.face(i).distance_uv#距離UVの値をパラメターUVに

●Shade-Pythonメモ-日本語コード,パートの開閉について

2009年4月10日    

ShadeでのPythonのデフォルトの文字コードはutf-8のようだけれど

他の文字コードを利用する時につまづいたのでメモ

#coding: utf-8

a = "てすと"
b=unicode(a,'utf-8').encode('shift-jis')

始めa.encode('shift-jis')って具合で変換できるものだと思っていたのだけれど・・・
Pythonの文字関係の処理はどうにも馴染めない

もうひとつ Shadeのパートの開閉に関するテスト


i=1
#全ての形状を調べる
while (scene.get_shape_by_ordinal(i)):
shape = scene.get_shape_by_ordinal(i)
if (shape.type == 2): #パート
if (shape..disclosed):print i #パートが開いている場合,序数を出力
i += 1

これで 閉じたパートの中に開いたパートを入れた場合でも
閉じたパート中の開いたパートも開いたパートとして認識する

ちなみに 空のパート リンクパートも開いたパートとして認識する

●Shade-Pythonメモ

2009年4月 2日    

パートに含まれるポリゴンメッシュを一つのポリゴンにまとめた時
どうなるか試した時のテストスクリプトをメモ


#ポリゴンメッシュに変換(分割なし)
xshade.scene().convert_to_polygon_mesh()

#
shape =xshade.scene().active_shape()
for i in xrange(shape.number_of_faces):
shape.face(i).active = 1
xshade.scene().update_figure_window()
#1/6秒静止(600=1秒)
xshade.sleep(100)
shape.face(i).active = 0

結合したものは元のOrdianl順に面の番号が再配置されるよう

●コミスタ用モデル

2008年10月 6日    

955313100_65s.jpg
コミスタ用のデッサン人形をネットで配布されてたデータを元に
自分好みのモデルに作り直してみたり・・・

フォーマットとしては.lws(LightWaveシーンオブジェクト)と
(手とか脚とかの)個々のパーツが.lwo なんですが
手元にはシーンデータを読み書きできる環境がないので
lwoのパーツ単位を個々に読み込んでバランスを確認しつつ
ちまちま修正・・・ めんどくさいす

とりあえず一通り形になったのでUP
http://yukimi.moemoe.gr.jp/etc/03_lady_comicstudio.lzh
コミスタのデッサン人形使ってるヒトがどれだけ居るのか分からないけど

●e風呂がなにか始めてた

2008年10月 1日    

3DソフトのShadeを販売しているイーフロンティアが何か
SNSっぽいものを始めてた
http://artistside.com/

画像 動画 圧縮データのUPができるサイトで
UPしたデータにクリエイティブコモンズのライセンス設定ができるのが他とは違うところか?
自社製品限定というわけでもないようだし
やりたいと思っていることは分かるんだ
でも 事業としてはどうなんだろうな???

ユーザー離れが進んでいる中で コミュニティ機能のテコ入れによって活性化しようと思ったのだろうが
『これはウケル(www』と思って打った手なのか
サイト立ち上げて動かしておくだけならコストもかからないし とりあえず という手なのか
なんか こんな風↓に大々的にカウントダウンしてたあたり前者のような気がしてならない
http://shade.e-frontier.co.jp/
しかしカウントダウンが0000で止まったものを放置してあったり
そもそも このサイトがにぎわったところで自社製品の活性化につながるような手が打ってなかったり
相変わらずのちぐはぐっぷり   それだけ末期症状なのだと思ってしまう

●プログラムのバグがああああ

2008年6月27日    

前の日記にも出した3D形状変形プログラムに誤作動が発生して
苦戦中...
今週一週間何も進んでいない=□○_
どうしてもバグがとれないので愚痴書き込み

放置してもいいんだけど今後これが使えないとなると
予定が大幅に狂うし・・・
幸か不幸か仕事のデータが来るのが遅れていてよかった

っていうか 誤作動が発生しているのは一行のコードに特定できているし
ダンプさせた中間データも正常なのに なーぜーうごーかーなーい〜〜〜〜

6/29追記
コア中のコアに当たる基本ルーチンの変数名を間違えてた(笑
一回の実行で数万回実行される部分のルーチンが 添字の間違いとはいえ恐ろしい
今迄動いてたのが不思議なくらい

●自動モデリングですよ

2008年6月 4日    

827615700_237.jpg
3Dソフト上のカメラ方向から見た形状を
Photoshopで作ったパスの形状に変形するスクリプトです
上の図では球体(赤)を細長い形(青)に変形してます

構想1年 ちまちまと機能を開発/テストすること3ヶ月
やっとこさ動くモノができましたよヽ(゜▽゜≡゜ワ゜)ノ

Photoshop上でのマスク切り抜き作業を
クリッピングマスクでやっているので
条件がよければ Photoshpの作業の後のモデリング作業を自動化できるってわけです

これで作業時間の短縮に・・・ なるといいなぁ

●ShadeのUVをイメージを作成

2008年5月 9日    

# coding: utf-8
error_string = "Error: no image"
image_object_name = "UV_image"
image_size =(512,512)
paint_color =(1.0, 0.0, 0.0)

def draw_line(image_object,vec2_1,vec2_2,paint_color):
w=vec2_2[0] - vec2_1[0]; h=vec2_2[1] - vec2_1[1]
if w== 0:
for i in xrange(int(abs(h))):
x = int(vec2_1[0] ); y = int(vec2_1[1] + i*cmp(h,0))
image_object.image.set_pixel(x,y,paint_color)
elif abs(w) > abs(h) :
a = h/w
for i in xrange(int(abs(w))):
x = int(vec2_1[0] + i*cmp(w,0)); y = int(vec2_1[1] + i*a*cmp(w,0))
image_object.image.set_pixel(x,y,paint_color)
else:
a = w/h
for i in xrange(int(abs(h))):
x = int(vec2_1[0] + i*a*cmp(h,0)); y = int(vec2_1[1] + i*cmp(h,0))
image_object.image.set_pixel(x,y,paint_color)

scene = xshade.scene()
if scene.rendering.image:
image_object = scene.create_master_image(image_object_name)
image_object.image = xshade.create_image(image_size , 32)
else:
xshade.show_message_box(error_string, False)

for shape_ in xshade.scene().active_shapes:
for i in xrange(shape_.number_of_faces):
uv_list = shape_.face(i).distance_uv
for j in xrange(len(uv_list)):
vec2_1= (uv_list[j-1][0] * image_size[0] , uv_list[j-1][1] * image_size[1])
vec2_2= (uv_list[j][0] * image_size[0] , uv_list[j][1] * image_size[1])
draw_line(image_object,vec2_1,vec2_2,paint_color)
image_object.image.create_window()

●ShadeWidget 基本テンプレート

2008年4月 4日    

ShadeのWidgetでPythonとjavascriptが混在するのは美しくないので
外部のスクリプトファイルを実行すつように変更
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title></title>
<link href="shade_widget.css" type="text/css" />
<style type="text/css"></style>
<script src="shade_widget.js" type="text/javascript" charset="utf-8"></script>

<script type="text/javascript">
<!-- 起動時に呼び出す関数 -->
function initialize(){
	//Debug status
	document.debug = false;
	//window size parameter
	windowWidth = 300;
	windowHeight = 200;
	//Debug switch
	if (!document.debug){
	document.getElementById('debug').style.display= 'none';
	}
	//Window size set
	if (!document.debug){
	window.resizeTo( windowWidth , windowHeight );
	}
}
<!-- 絶対パスを取得 -->
function urlParser(path){
	var img=new Image();
	img.src=path;//相対パスをセット
	path=img.src;//絶対パスを保持
	img.src='#'; //実行しているhtmlのurlでロードを止める
	path = path.match(/file:\/\/(.+)/)[1];
	path = decodeURI(path);//URLエンコードされて値が得られるのでデコード
	return path;
}
<!-- 引数で与えられたPythonを実行 -->
function do_Python(f_name){
	f_path = urlParser("./") + f_name;
	py_scr = "execfile('" + f_path + "')";
	window.external.setScript(py_scr);
}
<!-- 引数で与えられたAppleScriptを実行 -->
function do_AppleScript(f_name){
	f_path = urlParser("./") + f_name;
	py_scr ="import commands\n";
	py_scr += "f=commands.getoutput('osascript \"" + f_path + "\" ')\n";
	py_scr += "print f"; //戻り値をメッセージウィンドウに表示
	window.external.setScript(py_scr);
}
</script>
</head>

 <!-- body onloadで起動時に実行する関数を呼び出す -->
 <!-- body onmouseover でWigetクリック時に関数が呼び出される -->
<body bgcolor="#cccccc" onload="javascript:initialize()">

<!-- Pythonスクリプトを呼び出す -->
<input type="button" value="do Pyrhon" onclick='do_Python("test.py");'><br>
<!-- AppleScriptを呼び出す -->
<input type="button" value="do AS" onclick='do_AppleScript("as_test.scpt");'>


</body>
</html>

●shadeに用意されているクラスを調べる

2008年3月14日    

dirコマンドで
用意されているクラスをたどる


def roop_(base,x):
for i in x:
global list_
if (str(i) not in list_):
list_.append(str(i))
base2 = str(base)+'.'+ str(i)
x2=dir(eval(base2))
print base2
roop_(base2,x2)

list_=['xshade']
base_= 'xshade'
x = dir(eval(base_))
text = roop_(base_,x)

800行をこえた....
全部調べるのは大変そうだ

●Shade10キター&発売日パッチ(笑

2008年3月 8日    

今仕事に3DソフトのShadeを使っているわけなのですが
(日付かわって昨日)最新版が出ました
今回はかなりの変更があることもあって 速攻アップデートを申し込み
発売日に入手しましたよ


.....が
何だこれは 形状操作が乱れる
旧バージョンで1フレーム2秒弱だったレンダリング速度が
1フレーム15秒 (wwwwwwww
さすがに真っ青になってしまいましたよ


と思ったら 夕方にアップデートパッチ発表
発売当日にパッチなんて どこかしらのエロゲメーカーですか(wwwww
とりあえず表立った不具合は治った上に
レンダリング速度も十分に速く(1フレーム1秒未満)
CPUの動作を見る感じではMacProの8コアがフルに動作しているようで
まだ 多少の不具合はあるけれど 一転使えるソフトになってました
これでしばらくはこの環境で戦えるっ!

●Shade-頂点 稜線に接する面を取得

2008年3月 6日    

Shadeで頂点や稜線に接する面を取得するコマンドがなかったので


shape_ = xshade.scene().active_shape()

#辞書として 初期化
vertex_shered_face={} #頂点と接する面のリスト
edge_shered_face = {} #稜線と接する面のリスト

#頂点番号をキーとする辞書を作る
for i in range(shape_.total_number_of_control_points):vertex_shered_face[i] = []

#頂点に接する面を探す
for i in range(shape_.number_of_faces):
for j in shape_.face(i).vertex_indices: vertex_shered_face[j].append(i)

#稜線番号をキーとする辞書を作る
for i in range(shape_.number_of_edges):
#対象となる頂点に接している面のリストを取得
face_list_v0 = vertex_shered_face[shape_.edge(i).v0]
face_list_v1 = vertex_shered_face[shape_.edge(i).v1]
edge_shered_face[i] = []
for j in face_list_v0:
if j in face_list_v1:edge_shered_face[i].append(j)

print edge_shered_face

●Python覚え書き

2008年3月 4日    

クリップボードの中のPythonScriptを実行する


import commands
f=commands.getoutput('osascript -e \'return the clipboard\'')
print f #戻り値をメッセージウィンドウに出力

クリップボード内のスクリプトで commandsをインポートするとエラーになるので注意
Windowsではwin32clipboardモジュールをインポートすることでクリップボードを扱えるらしい

Shadeでムービーを作成して
ムービープレーヤーで開く


import os
import sys , commands,time

f_name = "/test.mov"

##動画を閉じる
CloseMovieAS_="""
tell application "QuickTime Player"
repeat with i from 1 to (count documents)
if name of document i is "test.mov" then close document i
end repeat
end tell
"""

##動画再生ApleScript##
PlayMovieAS_="""
on run argv
tell application "QuickTime Player"
activate
open argv as POSIX file
play document 1
set looping of document 1 to true
end tell
end run
"""

#同名の動画が開かれている場合閉じる
commands.getoutput('osascript -e \'' +CloseMovieAS_ + '\' ')
time.sleep(0.1)

#保存するパスを設定
if shade.active_document:
f_path = os.path.dirname(shade.active_document) + f_name
else: f_path = "/Users/yukimi/Temp_items" + f_name

#シーンを取得
scene_= xshade.scene()

#アニメーションの開始フレームを取得
if scene_.animation_settings.starting_frame == -1: start_frame = 0
else: start_frame = scene_.animation_settings.starting_frame

#アニメーションの終了フレームを取得
if scene_.animation_settings.ending_frame == -1:
end_frame = 300
scene_.animation_settings.ending_frame = end_frame
else:end_frame = scene_.animation_settings.ending_frame

xshade.scene().inhibit_update() #画面の更新を止める
start_time=time.time()
#アニメーションの作成を開始
scene_.rendering.start_animation( f_path )
for flame_ in xrange(start_frame,(end_frame +1)):
scene_.sequence_value = flame_ #シーケンス値(フレーム)
scene_.rendering.render()
scene_.rendering.append_animation()
scene_.rendering.finish_animation()
end_time=time.time()
print str(end_time - start_time) + "sec" #経過時間を表示
#シーケンス値を0位置に
scene_.sequence_value = 0
xshade.scene().allow_update() #画面の更新を再開

#再生スクリプトを実行
commands.getoutput('osascript -e \'' + PlayMovieAS_ + '\' \''+ f_path +'\'')

●Blender(3Dソフト)試してみたけれど

2007年10月24日    

今使っているソフトの機能等に限界を感じたので
オープンソース系の3DソフトBlenderを試してみたのだけれど,,,挫折
搭載されている機能としてはそこそこなのだけれど
操作性が独特すぎて=□○_

Macで使える統合型3Dソフト(モデリングからレンダリング、アニメーションまで備えているソフト)は
Blender(?0) Shede(使用中) LightWave(10万) MaYa(28万)
調べてみた限りではLWは今やっていることはむずかしいっぽいし
となるとMaYaかぁ....
今後予定されてる仕事のことを考えれば資金的な問題はないのだけれど
これだけ高価なモノを買う価値があるのかどうかは悩んでしまう...
(買うにしても来年になってからだし)

しかし ソフトウェアの法定耐用年数は6年なんですねぇ....
ハイエンドの3Dソフトなんてバージョンアップを追いかけたら減価償却
が終わるまでに何回アップデートすることになるやら(_△_;;;

●雪見流背景作画法

2004年5月28日    

雪見流背景作画法
<<TopPage
はじめに
この作画法解説は 雪見月が知り合いの絵描きさんからの
「どうやって描いているか知りたい」との言葉をうけて、やり方をおおまかに綴ったものです。
フォトショップの基本操作や選択範囲の使い方の基本はもとより
クイックマスクやアルファチャンネル等の使い方を理解していることを前提に進めますので
 あしからず。
3Dで下絵
私は、3DCGで作った画像を下絵に背景を作成しています。
シーンに合わせて作りおきしておいたパーツや新しくモデリングしたりして組み上げます

今回の解説に使う3D画像と完成画像はこんな感じです。  なんか全然違いますね(笑
ビフォーアフター
普段はもう少し3Dの方で作り込むのですが、
今回は説明箇所を明解にするために簡単なレンダリングのみにしてみました
私はShadeという3Dソフトを利用していますが、これくらいの画像ならどんなソフトでも可能かと思います
3Dでマスク
下絵を作った3Dデータからマスク画像を作ります。
他の方法だと着色時間の6割を占めるマスク画像の作成が自動的にやれるというのが
3Dを下絵で作業する最大のメリットではないかと思います。
(a) (b) (c)
(a)3Dソフトの作業画面マスクを切りたい物の色を黒に設定して他のモノの色を白に設定します。
カゲを全く生成させないように設定をすることできれいなマスク画像が作られます(b)
当然、きちんと作り込んであれば 机の脚だけだとかという風に必要な部分のマスクを切ることもできます。
また、これとは別にシーン自体のXYZ方向のマスクも作ってPhotoshopのαチャンネルに保存しておきます(c)
ちなみに(c)はX方向を向いている面のみを抽出したものです.
着色
後はマスクを活用しつつ 地道に着色していきます。
(d) (e) (f)
机などの個々のマスクはαチャンネルに保存せずに 必要になった時にその都度レンダリングして
Photoshopのクイックマスクにコピー&ペーストしています
そのため 3DソフトとPhotoshopとを行き来しながらの作業になります

また、時には3Dの方で陰影をレンダリングして ディテールアップに使うこともあります。(e)
この扉の場合 レンダリングした画像をレイヤーとしてペーストして乗算やオーバーレイ等にして使用しています
どうやって素材を組み合わせていくかは カンが頼りです 色々試してカンを養っていくしかないですホント

バランスを確かめつつ 小物類も追加していきます(f)
今回は イスも小物扱いで後から追加しました。
全部最初から描いておいてもいいのですが 時間差分等 後の調整がしにくいので
どれを最初から描いておいてどれを小物として調整をするかは始めに考えておきます。
油よけも3Dで形状を作って 赤枠の画像をテクスチャとして適応しています
こういった変形した形状をうまく塗るのは至難の業ではないでしょうか..
ただし、レンダリング画像を直接使うとどうしても『浮く』ため
着色用のマスク画像として利用しています