« 2010年3月 | メイン | 2010年5月 »

●SketchUpのシーンをComicStudioに

2010年4月30日    

以前の記事
スケッチアップのカメラ設定のみを書き出すプラグインを公開していましたが
同時に3D形状も書き出すものを作成しました
export_csd1_2.rbs
いくつかの致命的なバグがあったので修正しましたくわしくはこちら

ダウンロードしたファイルを
Windows の場合:C:/Program Files/Google/Google SketchUp 7/Plugins
MacOSXの場合:起動ドライブの/ライブラリ/Application Support/Google SketchUp 7/SketchUp/Plugins
にコピーして SketchUpを再起動すれば
『プラグイン』メニューに『ComicStudioデータ書き出し』という項目が追加されます

作成される拡張子.csdのファイルをコミックスタジオ/イラストスタジオで読み込んでください
(同時に生成される拡張子.objのファイルは3D形状のデータです)
10042901.jpg


  • スケッチアップのカメラ設定をコミックスタジオに書き出し

  • Wavefront Object形式で3D立体形状を書き出し

  • スケッチアップで非表示の形状を出力しない

  • スケッチアップの線形状を立体化することで書き出し


といった機能を備えています
穴空けやコンポーネントには対応していない等一部不備がありますが
(1.4で対応しました)
線の書き出しは単純ながら作画のアタリには使えるかと思います

どうぞお試しください

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

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()