Rendering学習日記

日々、3DCGの世界は進歩しています。勉強して理解したことをまとめていきます。RenderMan互換レンダラーやグローバル・イルミネーション。いろんなことに好奇心を持って、面白くなる。目指せShader書き!!
ありがとうございます。

四角すいの回転

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をやってみた。先に四角すいを作っておき、オブジェクトパネルで選択しておいて、下記のスクリプトを実行します。それぞれの頂点が変換行列でガシガシとうごいてくれます。使い方が広がります。Pythonスクリプト面白くなってきた。

# 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)
  • -
  • -
<< 24/30 >>