1/1

面法線と頂点法線

前回の記事のリンク先を参考に、頂点法線を求めてみた。とんでもなく面倒だけど、考え方がちょっとわかりました。

以下は、cgkitを利用してベクトルを求め、外積、そして正規化を行った。
メタセコイアでモデルを作り、各頂点の法線をRIBエクスポートするPolyconv(cnv)やmtrで出してみた。
normal01.jpg

C:\Python26>python
Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.

cgkit起動

>>> from cgkit.all import *


頂点座標を入力
>>> a0=vec3(50,20,0)
>>> a1=vec3(50,0,-100)
>>> a2=vec3(-50,0,-100)
>>> a3=vec3(-50,20,0)
>>> a4=vec3(-50,0,100)
>>> a5=vec3(50,0,100)

----------------------------
a1の頂点法線を求める
ベクトル算出
>>> v1=a0-a1
>>> v2=a2-a1
外積 反時計回り
>>> n0=v2.cross(v1)
a1の頂点法線
>>> a1n=n0.normalize()
>>> a1n
(0, 0.980581, -0.196116)

-----------------------------
a2の頂点法線を求める
>>> v1=a1-a2
>>> v2=a0-a2
外積 反時計回り
>>> n0=v2.cross(v1)

>>> v1=a0-a2
>>> v2=a3-a2
外積 反時計回り
>>> n1=v2.cross(v1)
>>> n0
(0, 10000, -2000)
>>> n1
(0, 10000, -2000)

各法線を加える
>>> n2=n0+n1
正規化する
>>> a2n=n2.normalize()
a2の頂点法線
>>> a2n
(0, 0.980581, -0.196116)

-------------------------------
a3の頂点法線を求める
>>> v1=a2-a3
>>> v2=a0-a3
>>> n0=v2.cross(v1)
>>> n0
(0, 10000, -2000)
>>> v1=a0-a3
>>> v2=a4-a3
>>> n1=v2.cross(v1)
>>> n1
(-0, 10000, 2000)

各法線を加える
>>> n2=n0+n1
>>> n2
(0, 20000, 0)
正規化する
>>> a3n=n2.normalize()
a3の頂点法線
>>> a3n
(0, 1, 0)

----------------------------
a4の頂点法線を求める
>>> v1=a3-a4
>>> v2=a0-a4
>>> n0=v2.cross(v1)
>>> n0
(0, 10000, 2000)

>>> v2=a5-a4
>>> v1=a0-a4
>>> n1=v2.cross(v1)
>>> n1
(-0, 10000, 2000)

各法線を加える
>>> n2=n0+n1
正規化する
>>> a4n=n2.normalize()

a4の頂点法線
>>> a4n
(0, 0.980581, 0.196116)

----------------------------
a5の頂点法線を求める
>>> v2=a0-a5
>>> v1=a4-a5
>>> n0=v2.cross(v1)
>>> n0
(0, 10000, 2000)
正規化する
>>> a5n=n0.normalize()

a5の頂点法線
>>> a5n
(0, 0.980581, 0.196116)
-----------------------------
a0の頂点法線を求める
>>> v2=a4-a0
>>> v1=a5-a0
>>> n0=v2.cross(v1)
>>> n0
(0, 10000, 2000)
>>> v2=a3-a0
>>> v1=a4-a0
>>> n1=v2.cross(v1)
>>> n1
(0, 10000, 2000)
>>> v2=a2-a0
>>> v1=a3-a0
>>> n2=v2.cross(v1)
>>> n2
(0, 10000, -2000)
>>> v2=a1-a0
>>> v1=a2-a0
>>> n3=v2.cross(v1)
>>> n3
(0, 10000, -2000)

各法線を加える
>>> nn=n0+n1+n2+n3
正規化する
>>> a0n=nn.normalize()

a0の頂点法線
>>> a0n
(0, 1, 0)
  • -
  • -

面法線と頂点法線 その2 RIB出力

ということで、変換したRIBは以下のとおり、
ちょっとだけ、3Delightでエラー表示が出ますが、レンダリングはできます。


##RenderMan RIB-Structure 1.0
version 3.03
Format 512 300 1
PixelSamples 3 3
ShadingRate 1
Display "image.tif" "file" "rgb"
Projection "perspective" "fov" 5.963
ConcatTransform [
0.423401210556 -0.592993260602 -0.684901750458 0
0 0.756010361246 -0.654559648686 0
-0.905942280115 -0.277141347635 -0.320095702145 0
-4.13227435274e-005 5.57033550876e-005 1499.99997798 1
]

WorldBegin
LightSource "ambientlight" 0 "intensity" [ 0.10 ] "lightcolor" [ 1 1 1 ]
LightSource "distantlight" 1 "intensity" [ 0.80 ] "lightcolor" [ 1 1 1 ] "from" [ -1 1 -1 ] "to" [ 0 0 0 ]
LightSource "distantlight" 2 "intensity" [ 0.45 ] "lightcolor" [ 1 1 1 ] "from" [ 1 1 2.5 ] "to" [ 0 0 0 ]
LightSource "distantlight" 3 "intensity" [ 0.35 ] "lightcolor" [ 1 1 1 ] "from" [ 1 -1 -1 ] "to" [ 0 0 0 ]

AttributeBegin
Attribute "identifier" "name" ["obj1"]
Color [1 0 0]
Surface "plastic"
PointsPolygons [ 3 3 3 3 ] [ 0 1 2 0 2 3 4 5 0 4 0 3 ]
"P" [
50 20 0
50 0 -100
-50 0 -100
-50 20 -0
-50 0 100
50 0 100
]
"N" [ 0 1 0
0 0.980581 -0.196116
0 0.980581 -0.196116
0 1 0
0 0.980581 0.196116
0 0.980581 0.196116 ] "st" [ 1 0 1 1 0 1 1 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0 0 ]
AttributeEnd

WorldEnd



image_tif.jpg
  • -
  • -

面法線と頂点法線 その3

Sitex Airでレンダリングしたら、
WARNING: "cnv_men_test2.rib" (24) Bad parameter list: st Parameter length mismatch - 24 found, 12 expected

stが長すぎたのでした。
"st" [ 1 0 1 1 0 1 1 0 0 1 0 0 ]
としました。

「RenderManを使いこなしていくためには、先駆者の経験を学び、
決まりごとを覚え、そして理屈で攻める。のが一番の早道です。」
              CTC RenderManの基礎より(2002)
コツコツと勉強していくことでわかってくるし、続けることですね。面白くなってきました。ありがとうございます。
  • -
  • -

Metasequoia Python 面インデックスと座標

メタセコイア Pythonを使って、面をきめるインデックス番号と頂点座標位置を表示する。
metasequoia pythonスクリプトとしては、基本となる。
あらかじめ、物体を作っておき、オブジェクトパネルで選択されていること。

以下のスクリプトまだきれいではありませんが、確認できます。ありがとうございます。

#face_index.py
doc=MQSystem.getDocument()
out=MQSystem.println

obj=doc.object[doc.currentObjectIndex]
out(str(obj.name))


for face in obj.face:
for aIndex in face.index:
out(str(aIndex))

for vert in obj.vertex:
pos=vert.getPos()
out(str(pos.x)+","+str(pos.y)+","+str(pos.z))

続きを読む>>
  • -
  • -

1/1