<< 8/8
面白いことをやってみよーその6
メタセコのPythonスクリプトをやってみよー4で新しいスクリプトが出ました。良いですね。
以前の記事で書いた
ワイヤーフレーム表示は、頂点色のアルファ値が0.0になってしまうということで、解決できてうれしいです。ありがとうございます。
平面をつくり、セグメントを増やして。押し出しで、箱を作り、スクリプトを実行しました。配置されたブツは、移動して調整して、parthenon rendererでレンダリングしました。
出典「三次元CG@七葉(http://nanoha.kirara.st/3dcg/)」ファイル保管庫@七葉 人気ダウンロードからnh0095.zip
もやしもんオリゼーを使った。ありがとうございます。
Metasequoia PythonのバージョンはPython2.2
だから、python2.2のインタラクティブモードで
>>> a="hacker"
>>> a
'hacker'
>>> "a" in a
1
>>> "hac" in a
Traceback (most recent call last):
File "", line 1, in ?
TypeError: 'in ' requires character as left operand
とエラーが出てしまう。
日ごろ、python2.5を使っていて、
>>> a="hacker"
>>> "c" in a
True
>>> "hac" in a
True
が当たり前と思って、メタセコイアpythonで組もうとしたら、
TypeError: 'in
' requires character as left operand
のエラーでした。
検索したら、ヒントがありました。ありがとうございます。
以下、python2.2のインタラクティブモードで
>>> class S(str):
... def __contains__(self,x):
... for i in range(len(self)):
... if self.startswith(x,i): return 1
...
>>> s=S("hacker")
>>> "ack" in s
1
>>> "tac" in s
0
助かります。ベスト尽くします。
ありがとうございます。
直線の始点、終点の座標を求める
Metasequoia Pythonで
メタセコイアの「面の作成」で「辺」をクリックし、一本の直線を描画する。オブジェクトパネルで、オブジェクト名をobj1_lightとする。
この直線がRenderManのライトの向きにしようかと検討中。
それで、始点と終点の座標を出力するスクリプトを作ってみた。
ありがとうございます。
助かります。
以下はMetasequoia Pythonスクリプトです。
オブジェクト名にlightを含む文字列であること。頂点は2個以内であること。で、座標を出力します。
#face_index22.py
class S(str):
def __contains__(self,x):
for i in range(len(self)):
if self.startswith(x,i): return 1
doc=MQSystem.getDocument()
out=MQSystem.println
#obj=doc.object[doc.currentObjectIndex]
#out(str(obj.numFace))
#out(str(obj.numVertex))
#out(str(obj.name))
num = doc.numObject
for n in range(0,num):
obj = doc.object[n]
out(str(obj.name))
if obj is None: continue
for face in obj.face:
for aIndex in face.index:
out(str(aIndex))
if obj.numVertex>2: continue
if "light" in S(str(obj.name)):
for k in range(0,obj.numVertex):
out(str(obj.vertex[k].pos.x)+","+str(obj.vertex[k].pos.y)+","+str(obj.vertex[k].pos.z))
Tkinter使えない??
メタセコイアpythonでTkinter実験君。
単にウインドウを表示しようとしたが、うまくいかない。
def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return
for arg in args:
MQSystem.println(str(arg))
import traceback
import sys
from Tkinter import *
try:
r=Tk()
except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))
エラーは以下のとおり・・・・残念??
exceptions.AttributeError
'module' object has no attribute 'argv'
('C:\\Users\\makura\\Documents\\tk_error.py', 19, '?', 'r=Tk()')
('c:\\Python22jp\\Lib\\lib-tk\\Tkinter.py', 1507, '__init__', 'baseName = os.path.basename(sys.argv[0])')
Metasequoia PythonでPxrDisneyマテリアル設定
Metasequoia Pythonを使って、RenderMan RIS用のマテリアルPxrDisneyを設定してみました。ありがとうございます。
import random
def p(*args):
"""
プリント関数
複数の引数を渡せる。
"""
if len(args)==0:
# 改行させる
MQSystem.println("")
return
for arg in args:
MQSystem.println(str(arg))
# 基本図形、新規オブジェクトで立方体複数つくる
#meta_cube_def_rndc.py
doc = MQSystem.getDocument()
out = MQSystem.println
#
def unitcube(L=50,x=0,y=0,z=0):
obj = MQSystem.newObject() #新規オブジェクト
num=doc.numObject
a=num
obj.name="cube_%d" % a #オブジェクト名をつける
obj.addVertex(x-L/2.0,y-L/2.0,z+L/2.0) #0 頂点番号
obj.addVertex(x+L/2.0,y-L/2.0,z+L/2.0) #1
obj.addVertex(x+L/2.0,y+L/2.0,z+L/2.0) #2
obj.addVertex(x-L/2.0,y+L/2.0,z+L/2.0) #3
obj.addVertex(x-L/2.0,y-L/2.0,z-L/2.0) #4
obj.addVertex(x-L/2.0,y+L/2.0,z-L/2.0) #5
obj.addVertex(x+L/2.0,y+L/2.0,z-L/2.0) #6
obj.addVertex(x+L/2.0,y-L/2.0,z-L/2.0) #7
obj.addFace([0,3,2,1])
obj.addFace([1,2,6,7])
obj.addFace([4,7,6,5])
obj.addFace([0,4,5,3])
obj.addFace([3,5,6,2])
obj.addFace([0,1,7,4])
doc.addObject( obj )
mat1=MQSystem.newMaterial()
doc.addMaterial(mat1) #マテリアルをドキュメントに追加
num0 = doc.numMaterial #現在の材質数を数える
numm=num0-1 #マテリアル番号は一つ少ない
doc.material[numm].shader=5
doc.material[numm].shaderFilename="PxrDisney"
doc.material[numm].color=MQSystem.newColor(random.random(),random.random(),random.random())
doc.material[numm].specular=0.5
doc.material[numm].reflection=0.75
for face in obj.face:
face.material=numm #マテリアルnumm番を面に割り当てる
import traceback
import sys
#dist=0
try:
for dist in range(0,600,200):
for dist2 in range(0,600,200):
#out(str(i))
out(str(dist))
unitcube(100,50+dist,50,dist2)
except:
info=sys.exc_info()
p(info[0])
p(info[1])
p(*traceback.extract_tb(info[2]))
num = doc.numObject #オブジェクトの数
out("オブジェクトの数 %d" % num) #オブジェクトの数を表示
<< 8/8