<< 3/8 >>

四角すいの回転

Metasequoia Python APIで物体を回転させる方法、何とかできました。
回転する角度(ここではpitch 45度←ラジアンでなくてOK)を指定して、行列を作ってあげる。かけあわせて、各座標位置を求めます。
移動と回転を組み合わせると、変化が楽しめます。
先に四角すいをつくっておいて、オブジェクトパネルで物体を選択しておいて、下記のPythonスクリプトを実行します。

# show local coordinate of vertices
# meta_rot.py
from math import *
doc = MQSystem.getDocument()

curidx = doc.currentObjectIndex
if curidx != -1:
obj = doc.object[curidx]
if not (obj is None):
MQSystem.println(obj.name)
# show global inverse matrix
mtx = doc.getGlobalInverseMatrix(obj)
for r in range(1,5):
MQSystem.println("|%(a) .3f %(b) .3f %(c) .3f %(d) .3f|" % {"a":mtx.get(r,1), "b":mtx.get(r,2), "c":mtx.get(r,3), "d":mtx.get(r,4)})

MQSystem.println(str(obj.rotation))
rot=obj.rotation
rot.head= 0
rot.pitch=45 #45度
rot.bank= 0
obj.rotation=rot
MQSystem.println(str(obj.rotation))

mtx2 = doc.getGlobalMatrix(obj)
MQSystem.println(str(mtx2))

obj2 = MQSystem.newObject()

# show vertices
numVert = obj.numVertex
for i in range(0,numVert):
pos = obj.vertex[i].getPos()
MQSystem.println(" v[" + `i` + "] " + str(mtx2.mult(pos)))
obj2.addVertex(mtx2.mult(pos))

obj2.addFace([0,3,2,1]) #4kakusui
obj2.addFace([4,1,2])
obj2.addFace([4,2,3])
obj2.addFace([4,3,0])
obj2.addFace([4,0,1])
doc.deleteObject(curidx)
doc.addObject( obj2 )


rot1.jpg
出力例

[0.000, 45.000, 0.000]
[[1.000, 0.000, 0.000, 0.000] [0.000, 0.707, 0.707, 0.000] [0.000, -0.707, 0.707, 0.000] [0.000, 0.000, 0.000, 1.000]]
v[0] [-50.000, 70.711, -70.711]
v[1] [50.000, 70.711, -70.711]
v[2] [50.000, 0.000, 0.000]
v[3] [-50.000, 0.000, 0.000]
v[4] [0.000, 141.421, 70.711]
  • -
  • -

四角すいの拡大縮小

メタセコイアのPythonインターフェイスで、拡大縮小Scalingをやってみた。先に四角すいを作っておき、オブジェクトパネルで選択しておいて、下記のスクリプトを実行します。それぞれの頂点が変換行列でガシガシとうごいてくれます。使い方が広がります。パイソンスクリプト面白くなってきた。


# meta_scale2.py
doc = MQSystem.getDocument()

curidx = doc.currentObjectIndex
if curidx != -1:
obj = doc.object[curidx]
if not (obj is None):
MQSystem.println(obj.name)
# show global inverse matrix
mtx = doc.getGlobalInverseMatrix(obj)
for r in range(1,5):
MQSystem.println("|%(a) .3f %(b) .3f %(c) .3f %(d) .3f|" % {"a":mtx.get(r,1), "b":mtx.get(r,2), "c":mtx.get(r,3), "d":mtx.get(r,4)})

MQSystem.println(str(obj.scaling))
scl=obj.scaling
scl.x= 2 #x方向拡大率
scl.y= 0.5 #y方向拡大率
scl.z= 1.5 #z方向拡大率
obj.scaling=scl
MQSystem.println(str(obj.scaling))

mtx2 = doc.getGlobalMatrix(obj)
MQSystem.println(str(mtx2))

obj2 = MQSystem.newObject()

# show vertices
numVert = obj.numVertex
for i in range(0,numVert):
pos = obj.vertex[i].getPos()
MQSystem.println(" v[" + `i` + "] " + str(mtx2.mult(pos)))
obj2.addVertex(mtx2.mult(pos))

obj2.addFace([0,3,2,1]) #4kakusui
obj2.addFace([4,1,2])
obj2.addFace([4,2,3])
obj2.addFace([4,3,0])
obj2.addFace([4,0,1])
doc.deleteObject(curidx)
doc.addObject( obj2 )


拡大率に-1を入れれば、裏返し反転ですね。CGの基礎基本勉強になります。ありがとうございます。
scale1.jpg
  • -
  • -

■マテリアル情報を取得する

メタセコイア付属のPythonサンプルスクリプトを試してみる。
1.基本図形から平面を作成
2.材質パネルから新規で赤色を入れたmat1を作成
3.選択部処理で平面にmat1を割り当てる。
4.平面を選択したままスクリプトエディタより、material.pyを実行する。
以下のように情報が出力された。
mat1
color : [1.000, 0.043, 0.122]
dif : 0.800
amb : 0.600
emi : 0.000
spc : 0.000
pow : 5.000
mapping : 0 (UV)
vertex-color : 0
shader : 3 (Phong)
  • -
  • -

■カラーを変更する

平面に割り当てたマテリアルをmetasequoia python scriptで変更する。
当初colorを出力するのに、
MQSystem.println(str(doc.material[0].color))
と記述すると
[0.220, 0.420, 0.620]
とリストで出てくるので、color[0],color[1],color[2]とできると思い込んでいました。
Inappropriate argument type.やAttributeエラーが出てしまい困りました。
ヘルプを参照したら、colorは、red,green,blueではありませんか。

MQSystem.println(str(doc.material[0].color.green))
doc.material[0].color.red=0.22
doc.material[0].color.green=0.42
doc.material[0].color.blue=0.62

と表記すれば、カラー変更が可能になりました。

最初に平面を作成し、mat1を作成し、平面に割り当てておき、以下のスクリプトを実行すると、カラー等が変更されます。

doc = MQSystem.getDocument()
num = doc.numMaterial
for x in range(0,num):
mat = doc.material[x]
if mat is None: continue
MQSystem.println(mat.name)
MQSystem.println(" color : " + str(mat.color))
MQSystem.println(" dif : %(#).3f" % {"#":mat.diffuse})
MQSystem.println(" amb : %(#).3f" % {"#":mat.ambient})
MQSystem.println(" emi : %(#).3f" % {"#":mat.emissive})
MQSystem.println(" spc : %(#).3f" % {"#":mat.specular})
MQSystem.println(" pow : %(#).3f" % {"#":mat.power})
if mat.mapType == 0:
MQSystem.println(" mapping : 0 (UV)")
elif mat.mapType == 1:
MQSystem.println(" mapping : 1 (flat)")
elif mat.mapType == 2:
MQSystem.println(" mapping : 2 (cyrindical)")
elif mat.mapType == 3:
MQSystem.println(" mapping : 3 (spherical)")
if mat.mapType != 0:
MQSystem.println(" map-scaling : " + str(mat.mapScaling))
MQSystem.println(" map-angle : " + str(mat.mapAngle))
MQSystem.println(" map-position : " + str(mat.mapPosition))
MQSystem.println(" vertex-color : %(#)d" % {"#":mat.vertexColor})
MQSystem.println(" shader : %(#)d (" % {"#":mat.shader} + mat.shaderName + ")")
if mat.textureMap != "":
MQSystem.println(" texture-map : " + mat.textureMap)
path = mat.getTextureMapPath()
if not (path is None):
MQSystem.println(" texture-map-path : " + path)
if mat.alphaMap != "":
MQSystem.println(" alpha-map : " + mat.alphaMap)
path = mat.getAlphaMapPath()
if not (path is None):
MQSystem.println(" alpha-map-path : " + path)
if mat.bumpMap != "":
MQSystem.println(" bump-map : " + mat.bumpMap)
path = mat.getBumpMapPath()
if not (path is None):
MQSystem.println(" bump-map-path : " + path)

MQSystem.println(str(doc.material[0].color))
doc.material[0].diffuse=0.2
doc.material[0].ambient=1.0
doc.material[0].emissive=0.5
doc.material[0].specular=0.2
MQSystem.println(str(doc.material[0].color.green))
doc.material[0].color.red=0.22
doc.material[0].color.green=0.42
doc.material[0].color.blue=0.62


mat2=MQSystem.newMaterial()
mat2.name="mat_test"
doc.addMaterial(mat2)
num = doc.numMaterial
MQSystem.println(str(num))

mat1.jpg
そのほか、拡散光や反射など設定を変更することもできます。いろいろと数値を変更して実験してみましょう。

出力結果例:
mat1
color : [0.620, 0.059, 0.059]
dif : 0.800
amb : 0.580
emi : 0.000
spc : 0.000
pow : 5.000
mapping : 0 (UV)
vertex-color : 0
shader : 3 (Phong)
[0.620, 0.059, 0.059]
0.0588235296309
  • -
  • -

■新規マテリアルの追加

前の記事の最後にスクリプトを書いておきましたが、
以下を追加して実行すると、マテリアルパネルに新規で
mat_testが追加されます。

mat2=MQSystem.newMaterial()
mat2.name="mat_test"
doc.addMaterial(mat2)

num = doc.numMaterial
MQSystem.println(str(num)) #マテリアルの数を表示

メタセコイアのPython scriptは、面倒なところもありますが、
基本をおさえてコツコツと便利に使えるように工夫すれば、可能性はひろがります。
ありがとうございます。
  • -
  • -

■四角すいの生成とマテリアル割り当て

メタセコイアPythonスクリプトを使って、新規オブジェクトで四角すいをつくり、面にマテリアルを割り当てる。色をつけるスクリプトです。
for face in obj.face:部分で、オブジェクトのすべての面にマテリアル0番の色情報を割り当てています。サンプルを参考につくってみました。


# 基本図形、新規オブジェクトで四角すいをつくる
#meta_4mat.py
doc = MQSystem.getDocument()

obj = MQSystem.newObject() #新規オブジェクト
out = MQSystem.println

out(obj.name)
num=doc.numObject
a=num

obj.name="sikakusui_%d" % a #オブジェクト名をつける

a0=obj.addVertex(-50.000000,0.000000,-100.000000) #0
a1=obj.addVertex(50.000000,0.000000,-100.000000) #1
a2=obj.addVertex(50.000000,0.000000,0.000000) #2
a3=obj.addVertex(-50.000000,0.000000,0.000000) #3
a4=obj.addVertex(0.000000,150.0000,-50.000000) #4


obj.addFace([0,3,2,1])
obj.addFace([4,1,2])
obj.addFace([4,2,3])
obj.addFace([4,3,0])
obj.addFace([4,0,1])

doc.addObject( obj )
num = doc.numObject #オブジェクトの数
out("オブジェクトの数 %d" % num) #オブジェクトの数を表示

mat1=MQSystem.newMaterial()
mat1.name="mat_test"
doc.addMaterial(mat1)
numm = doc.numMaterial
MQSystem.println("マテリアルの数 %d" % numm)
doc.material[0].color.red=0.92
doc.material[0].color.green=0.2
doc.material[0].color.blue=0.12

for face in obj.face:
face.material=0 #マテリアル0番を面に割り当てる



mat2.jpg
  • -
  • -

Metasequoia Python 立方体をつくる

メタセコイアのPythonの使い方として、立方体をつくってみた。一辺が50、原点を中心につくってみる。面の向きは、カメラから見て反時計回りに点を指定すると表向き、カメラから見えない面については、時計回りに点を指定することで、面が表向きになる。

以下はサンプルとなるpythonスクリプトです。


# 基本図形、新規オブジェクトで立方体をつくる
#meta_cube.py
doc = MQSystem.getDocument()

obj = MQSystem.newObject() #新規オブジェクト
out = MQSystem.println

out(obj.name)
num=doc.numObject
a=num

obj.name="cube_%d" % a #オブジェクト名をつける

a0=obj.addVertex(-25.000000,-25.000000,25.000000) #0
a1=obj.addVertex(25.000000,-25.000000,25.000000) #1
a2=obj.addVertex(25.000000,25.000000,25.000000) #2
a3=obj.addVertex(-25.000000,25.000000,25.000000) #3
a4=obj.addVertex(-25.000000,-25.0000,-25.000000) #4
a5=obj.addVertex(-25.000000,25.0000,-25.000000) #5
a6=obj.addVertex(25.000000,25.0000,-25.000000) #6
a7=obj.addVertex(25.000000,-25.0000,-25.000000) #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 )
num = doc.numObject #オブジェクトの数
out("オブジェクトの数 %d" % num) #オブジェクトの数を表示
  • -
  • -

Metasequoia Python 立方体を定義する

立方体の辺の長さと位置を指定すれば、生成できるように、関数をつくって定義した。


# 基本図形、新規オブジェクトで立方体をつくる
#meta_cube_def.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 #オブジェクト名をつける

a0=obj.addVertex(x-L/2.0,y-L/2.0,z+L/2.0) #0
a1=obj.addVertex(x+L/2.0,y-L/2.0,z+L/2.0) #1
a2=obj.addVertex(x+L/2.0,y+L/2.0,z+L/2.0) #2
a3=obj.addVertex(x-L/2.0,y+L/2.0,z+L/2.0) #3
a4=obj.addVertex(x-L/2.0,y-L/2.0,z-L/2.0) #4
a5=obj.addVertex(x-L/2.0,y+L/2.0,z-L/2.0) #5
a6=obj.addVertex(x+L/2.0,y+L/2.0,z-L/2.0) #6
a7=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 )


unitcube(100,50,50,-50) # L:辺の長さ100 x,y,z座標位置

unitcube(50,-50,25,50) # L:辺の長さ50 x,y,z座標位置 2つめ配置


num = doc.numObject #オブジェクトの数
out("オブジェクトの数 %d" % num) #オブジェクトの数を表示

05.jpg
  • -
  • -

Metasequoia Python 立方体を複数つくる

複数つくってみる。
くりかえしfor文がちょっとエラー。
Inappropriate argument type.
メソッドに不適当な引数を渡したためということなんですが、
使わないで、動作確認。
メタセコイアpythonスクリプトは以下のようになります。


# 基本図形、新規オブジェクトで立方体複数つくる
#meta_cube_def2.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 #オブジェクト名をつける

a0=obj.addVertex(x-L/2.0,y-L/2.0,z+L/2.0) #0
a1=obj.addVertex(x+L/2.0,y-L/2.0,z+L/2.0) #1
a2=obj.addVertex(x+L/2.0,y+L/2.0,z+L/2.0) #2
a3=obj.addVertex(x-L/2.0,y+L/2.0,z+L/2.0) #3
a4=obj.addVertex(x-L/2.0,y-L/2.0,z-L/2.0) #4
a5=obj.addVertex(x-L/2.0,y+L/2.0,z-L/2.0) #5
a6=obj.addVertex(x+L/2.0,y+L/2.0,z-L/2.0) #6
a7=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 )

dist=60
unitcube(50,50+dist,50,-50)
dist=dist+60
unitcube(50,50+dist,50,-50)
dist=dist+60
unitcube(50,50+dist,50,-50)
dist=dist+60
unitcube(50,50+dist,50,-50)
dist=dist+60
unitcube(50,50+dist,50,-50)



num = doc.numObject #オブジェクトの数
out("オブジェクトの数 %d" % num) #オブジェクトの数を表示




06.jpg
  • -
  • -

Metasequoia Python 立方体を複数つくる その2

くりかえしfor文がうまくいかなかったので、while文にした。


dist=60
while dist<=300:
unitcube(50,50+dist,50,-50)
dist=dist+60



サンプルスクリプトは次のようになります。

# 基本図形、新規オブジェクトで立方体複数つくる その2
#meta_cube_def2.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 #オブジェクト名をつける

a0=obj.addVertex(x-L/2.0,y-L/2.0,z+L/2.0) #0
a1=obj.addVertex(x+L/2.0,y-L/2.0,z+L/2.0) #1
a2=obj.addVertex(x+L/2.0,y+L/2.0,z+L/2.0) #2
a3=obj.addVertex(x-L/2.0,y+L/2.0,z+L/2.0) #3
a4=obj.addVertex(x-L/2.0,y-L/2.0,z-L/2.0) #4
a5=obj.addVertex(x-L/2.0,y+L/2.0,z-L/2.0) #5
a6=obj.addVertex(x+L/2.0,y+L/2.0,z-L/2.0) #6
a7=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 )

dist=60
while dist<=300:
unitcube(50,50+dist,50,-50)
dist=dist+60

num = doc.numObject #オブジェクトの数
out("オブジェクトの数 %d" % num) #オブジェクトの数を表示
  • -
  • -

<< 3/8 >>