<< 3/12 >>

3つのランダムな頂点を結ぶ三角形

まだまだ修行が足りませんが、imoceaのpython APIに関するドキュメントを参考にした。検討していかなくてはなりません。
勉強です。ありがとうございます。

# rnd_sankaku.py
# ランダムに配置された三角形メッシュを作るサンプル
#
from random import uniform, seed

# 乱数の種設定
seed()

# 三角形の数
tri_count = 1000

doc = MQSystem.getDocument()

num = doc.numObject
obj = MQSystem.newObject() #新規オブジェクト


# 三角形を配置する範囲
range_min = -1000
range_max = 1000

# 三角形中心から頂点までの最短・最長距離
tri_size_min = 10
tri_size_max = 300

# ランダムな三角形中心位置を作成する関数
def random_point():
return uniform(range_min, range_max),uniform(range_min, range_max), uniform(range_min, range_max)


obj.name = "Random Triangles" # 名前設定
a=random_point()
b=random_point()
c=random_point()
v=[]
v.append(obj.addVertex( MQSystem.newPoint(a[0],a[1],a[2])))
v.append(obj.addVertex( MQSystem.newPoint(b[0],b[1],b[2])))
v.append(obj.addVertex( MQSystem.newPoint(c[0],c[1],c[2])))
obj.addFace(v)


MQSystem.println("\tx %f y %f z %f" % (a[0],a[1],a[2]))
doc.addObject( obj )
  • -
  • -

シェルピンスキーのギャスケット

模擬実験録(仮)3DCGの備忘録的な何か」からコピーして実行してみた。
凄いですね。可能性を感じます。メタセコイアでPythonスクリプト作成、いろいろと研究しなければなりません。勉強します。
すばらしいスクリプト、ありがとうございます。

02.jpg

連続した頂点、結合、どうやるか、OpenGL本あたり調べて、勉強ですね。
ずっと勉強したい・・・・。
  • -
  • -

歯車 (メタセコイアマスターガイド)

ギアをつくってくれるスクリプトですが、重版未定のメタセコイアマスターガイドのサンプルをうちこんでみました。スクリプトを掲載することはできませんが、作成方法についてじっくり勉強していきます。
リスト内包表記や、lambdaが出てきたりして、Pythonインタラクティブモードでいろいろと動作を実験君しながら理解していきたいところです。
ヒントとなるサンプルありがとうございます。

03.jpg

奥が深いですね。勉強します。
  • -
  • -

連続した面の生成

メタセコイアPython API面白いです。
CGの基礎となる原理を理解するのに役立ちます。
二つの面をリストを設けて、そのつどaddFace()していると、面はばらばらでつながっていません。頂点が共有されていないです。
そこで、下記のようなモデルをつくり、Obj出力してみました。
men-1.jpg

# Created by Metasequoia

v 50.000000 0.000000 100.000000
v -50.000000 0.000000 100.000000
v -50.000000 0.000000 0.000000
v 50.000000 0.000000 0.000000
v -50.000000 0.000000 -100.000000
v 50.000000 0.000000 -100.000000
# 6 vertices

f 4 3 2 1
f 4 6 5 3
# 2 elements

頂点情報と面の情報が書かれています。
これを参考にしてMetasequoia Pythonで書いてみることにしました。
addFace()の中は
obj.addFace([a1,a2,a3,a4])
obj.addFace([a3,a5,a6,a4])
と書いてもリストで頂点のインデックス番号でもOKなんですね。
obj.addFace([0,1,2,3])
obj.addFace([2,5,4,3])
リストの中の順番が重要です。反時計回りに並んでます。
この番号は、以下のa5からa1まで順に記述した番号を0から5までを割り当てています。だから以下のa5をコメントアウトすると、次行のa6が0番になります。

以下、サンプルファイルです。実験君ですね。ありがとうございます。

# 基本図形、新規オブジェクトで平面をつくる
#meta_4men2.py
doc = MQSystem.getDocument()

obj = MQSystem.newObject() #新規オブジェクト
out = MQSystem.println
out(obj.name)
a=doc.getObjectIndex(obj) #オブジェクトのインデックスを取得

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

a5=obj.addVertex(-50.000000,0.000000,-100.000000) #0
a6=obj.addVertex(50.000000,0.000000,-100.000000) #1

a4=obj.addVertex(50.000000,0.000000,0.000000) #2
a3=obj.addVertex(-50.000000,0.000000,0.000000) #3
a2=obj.addVertex(-50.000000,0.000000,100.000000) #4
a1=obj.addVertex(50.000000,0.000000,100.000000) #5

#obj.addFace([a1,a2,a3,a4])
#obj.addFace([a3,a5,a6,a4])
obj.addFace([0,1,2,3])
obj.addFace([2,5,4,3])

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

#obj.deleteFace(1)
  • -
  • -

8角すいの生成

検索して見つけたサイトのサンプルは面が表示されていないワイヤーフレーム状態だったので、下記のように修正して面を張りました。頂点番号を順番に呼んであげるということですね。
底面については宿題です。

#kaku_8.py
segment = 8
radius=20.0

from math import *
crad = pi / 180 * 45
irad = 2*pi/segment

doc = MQSystem.getDocument()
obj = MQSystem.newObject();
obj.name = "circle_%d" % segment

for i in range(segment) :
obj.addVertex( MQSystem.newPoint( radius*sin(crad), 0.0, radius*cos(crad) ) )
crad += irad

obj.addVertex( MQSystem.newPoint( 0.0, 10.0, 0.0 ) )

for i in range(segment) :
obj.addFace( [(i+1)%segment,i,segment] ) #側面
#obj.addFace( [0,i, segment] )

doc.addObject( obj )

04.jpg
  • -
  • -

Metasequoia Python Interface

Pythonのバージョンを確認するスクリプト

import sys
MQSystem.println("%x" % sys.hexversion)

出力結果は
20203f0

メタセコイアが対応しているPythonのバージョンはVer2.2.3ということですね。
  • -
  • -

四角すいの生成

基本に立ち返り、面の向きを考えて記述してみる。


# 基本図形、新規オブジェクトで四角すいをつくる
#meta_4sui.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) #オブジェクトの数を表示


sui4.jpg
  • -
  • -

四角すいを移動する

変換行列を使ったエレガントなやり方があるのか勉強しているところです。とりあえず、無理矢理書いてみました。
前の記事で四角すいを描いておいて、オブジェクトパネルで選択しておく。スクリプトを実行すると移動して複製をつくる。そして選択していた四角すいは削除される。移動したように見える方法です。
各頂点の座標を平行移動変換行列にかけたもの。あまり良いとは言えませんが、とりあえず、動いた。ちょっと嬉しい。サンプルがほしい。ありがとうございます。


# show local coordinate of vertices
# meta_translate.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.translation))
trsl=obj.translation
trsl.x=100
trsl.y=0
trsl.z=-100
obj.translation=trsl
MQSystem.println(str(obj.translation))

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 )

  • -
  • -

四角すいの回転

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
  • -
  • -

<< 3/12 >>