<< 8/8

面白いことをやってみよーその6

メタセコのPythonスクリプトをやってみよー4で新しいスクリプトが出ました。良いですね。
以前の記事で書いたワイヤーフレーム表示は、頂点色のアルファ値が0.0になってしまうということで、解決できてうれしいです。ありがとうございます。

平面をつくり、セグメントを増やして。押し出しで、箱を作り、スクリプトを実行しました。配置されたブツは、移動して調整して、parthenon rendererでレンダリングしました。
出典「三次元CG@七葉(http://nanoha.kirara.st/3dcg/)」ファイル保管庫@七葉 人気ダウンロードからnh0095.zip
 もやしもんオリゼーを使った。ありがとうございます。
oryzae0.jpg

oryzae1.jpg


 
  • -
  • -

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を設定してみました。ありがとうございます。
boxesrnd.jpg


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