1/3 >>

Lightflowインストール

mixiのLightflowコミュで自分が書き込んだ記事を掲載します。::

■Lightflow インストール
まず,Lightflowの本家で配っているPython1.5.1はXPで起動しませんでした。そこで,Pythonの本家でPython1.5.2をダウンロードします。
・Python 1.5.2 installer for Windows (5.0 MB)

http://www.python.org/download/releases/1.5/

・Tcl/Tkモジュールはインストールできなかったので,最初のインストール時にチェックを外してインストールします。
pythoninst2.jpg

C:\Lightflowディレクトリをつくり,ダウンロードしたLightFlowをおきます。

・Python1.5.2はc:\program files\pythonにインストールされているので,この中のDllsフォルダにLightflowPM.dllを置きます。 (Windows7でも動きます。64bitだと、Pythonのインストールと実行先は、C:\Program Files (x86)\Pythonになる。)

・次にWindowsディレクトリのsystemフォルダにLightflow.dllを置きます。

マイコンピュータのアイコンを右クリックし,詳細設定→環境変数を開き,
新規をクリックして,変数名PYTHONPATH 変数値C:\Program files\Pythonを入れます。
path00.jpg
既に別のPythonをインストールしている場合はセミコロンを入れてパスを加えます。

同じように新規で以下のものを加えます。
LIGHTFLOWPATH
path01.jpg

LIGHTFLOW_SE_MEMORYとLIGHTFLOW_VE_MEMORY
path02.jpg

注意!! PATHはすでに書いてあるものを間違って消さないように、一番後ろに追加します。
path03.jpg

まとめると、以下のものを環境変数に加えます。
変数名を正確に入れてください。またコピーして入れる場合など空白スペースが入っていたりします。半角スペース1つ入っているだけで、エラーで動きませんから、注意してください。

変数名            変数値
PYTHONPATH C:\Program files\Python ユーザ環境変数欄に追加
LIGHTFLOWPATH     C:\Lightflow ユーザ環境変数欄に追加
LIGHTFLOW_SE_MEMORY  32000 ユーザ環境変数欄に追加
LIGHTFLOW_VE_MEMORY  32000 ユーザ環境変数欄に追加
PATH         ;%LIGHTFLOWPATH%;%PYTHONPATH% を追加する。システム環境変数

すべて記入したら,OK,OKを押します。

一度,再起動して,

スタート→アクセサリ→コマンドプロンプトを右クリックしてコピーします。

C:\Lightflowディレクトリを開いて,
C:\Lightflow\PM\Examplesフォルダを開き,右クリックして「貼り付け」をします。コマンドプロンプトが作成されます。

このコマンドプロンプトアイコンを右クリックして「プロパティ」を開けます。

作業フォルダの欄にC:\Lightflow\PM\Examplesと入れます。
OKを押します。

コマンドプロンプトアイコンをダブルクリックして,
>"c:\program files\python\python" ball1.py
と打ち込んで,レンダリングが始まれば,できました。

■下記のエラーメッセージの場合
c:\Lightflow\PM\Examples>python ball1.py
Traceback (innermost last):
File "ball1.py", line 3, in ?
from lightflowPM import *
ImportError: No module named lightflowPM

Python1.5.2のc:\program files\pythonのDllsフォルダにLightflowPM.dllをコピーしてください。


レンダリング後にTGA画像が作成されています。

CPUの処理速度が上がった分。速くなりましたね。

閉鎖したサイトにあったものをまとめました。大変役に立ちます。ありがとうございます。
■Lightflow インストール Linuxでのインストール方法
http://rman.sakura.ne.jp/sfx/lf_man/lightflow-install.html
Windows7 64bitにVirtualBox 64bitをインストールし、VirtualBoxの中にDebian6.0.3をインストール、LightFlowをインストールしてみました。
2012年1月9日
http://rman.sakura.ne.jp/sb/log/eid440.html 続きを読む>>
  • -
  • -

最初のNVIDIA Gelatoその1

最初は簡単な球を表示してみましょう。

コマンドプロンプトから、下記のように打つとレンダリングか始まる。
>gelato -iv my_first.pyg


#my_first.pyg
Output ("my_first01.tif", "tiff", "rgb", "camera", "float gain", 1, "float gamma",
1, "string filter", "gaussian", "float[2] filterwidth", (2, 2))
Attribute ("string projection", "perspective")
Attribute ("float fov", 45)
Attribute ("int[2] resolution", (640, 480))
Light ("light1", "ambientlight", "float intensity", 0.1)
Light ("light2", "distantlight", "point from", (1, 1, -1), "point to", (0, 0, 0)
, "float intensity", 1.5)
Translate (0, 0, 10)
World ()
Attribute ("color C", (1, 0, 0))
Shader ("surface", "plastic")
Sphere (3, -3, 3, 360)
Render()

my_first01.jpg
  • -
  • -

最初のNVIDIA Gelatoその2

>gelato -iv -threads 4 my_first2.pyg
クアッドCPUで4スレッド使用してレンダリング速い!!
2つの球体をちょっと移動して配置する。
#my_first2.pyg
Output ("my_first02.tif", "tiff", "rgb", "camera", "float gain", 1, "float gamma", 1, "string filter", "gaussian", "float[2] filterwidth", (2, 2))
Attribute ("string projection", "perspective")
Attribute ("float fov", 45)
Attribute ("int[2] resolution", (640, 480))
Light ("light1", "ambientlight", "float intensity", 0.1)
Light ("light2", "distantlight", "point from", (1, 1, -1), "point to", (0, 0, 0)
, "float intensity", 1.5)
Translate (0, 0, 5)
World ()

PushTransform ()
Attribute ("color C", (1, 0, 0))
#Shader ( "surface", "metal","string envname","reflection" )
Shader ("surface", "plastic")
Translate ( 1.2, 0, 0)
Sphere (1, -1, 1, 360)
PopTransform ()

PushTransform ()
Attribute ("color C", (0, 0, 1))
Shader ("surface", "plastic")
Translate ( -1.2, 0, 0)
Sphere (1, -1, 1, 360)
PopTransform ()

Render()


my_first02.jpg
  • -
  • -

NVIDIA GelatoへのReadArchive

Ribelato-1.0.0.24.win.zipをダウンロードし、
libフォルダにrib.generator.dllを入れておくと、

たとえば、立方体
Patch "bilinear" "P" [-0.5 0.5 -0.5 0.5 0.5 -0.5 -0.5 -0.5 -0.5 0.5 -0.5 -0.5]
Patch "bilinear" "P" [-0.5 -0.5 -0.5 0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 -0.5 0.5]
Patch "bilinear" "P" [-0.5 0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 -0.5 -0.5 0.5]
Patch "bilinear" "P" [0.5 0.5 -0.5 -0.5 0.5 -0.5 0.5 0.5 0.5 -0.5 0.5 0.5]
Patch "bilinear" "P" [0.5 -0.5 -0.5 0.5 0.5 -0.5 0.5 -0.5 0.5 0.5 0.5 0.5]
Patch "bilinear" "P" [-0.5 -0.5 0.5 0.5 -0.5 0.5 -0.5 0.5 0.5 0.5 0.5 0.5]

以上をたとえばBoxGeom.ribという名前で保存しておく。
呼び出し方は、同じディレクトリに置いて、
Input ("BoxGeom.rib")
で良い。

同じく、平面は
Patch "bilinear" "P" [-5.0 -5.0 0.0 5.0 -5.0 0.0 -5.0 5.0 0.0 5.0 5.0 0.0]

以上をたとえばPlaneGeom.ribで保存しておく。
呼び出し方は、同じディレクトリに置いて、
Input("PlaneGeom.rib")
で良い。
  • -
  • -

BOXを表示する。その1

RIBを呼び出す形で、以下のように記述する。
なお、カメラ位置は、placecam.exeを使って算出。10,5,-10から原点を見ている。
#box0.pyg
Output ("box01.tif", "tiff", "rgb", "camera", "float gain", 1, "float gamma",
1, "string filter", "gaussian", "float[2] filterwidth", (2, 2))
Attribute ("string projection", "perspective")
Attribute ("float fov", 20)
Attribute ("int[2] resolution", (640, 480))
#placecam 10 5 -10 0 0 0
Rotate (-19.47, 1.00, 0.00, 0.00)
Rotate (45.00, 0.00, 1.00, 0.00)
Translate (-10.00, -5.00, 10.00)
World ()
Light ("light1", "pointlight", "float intensity", 350, "point from", (-10, 10, -10))
Light ("light2", "pointlight", "float intensity", 350, "point from", (10, 10, -10))

PushTransform ()
Attribute ("color C", (1, 1, 0))
Shader ("surface", "plastic")
Translate ( 0, 0.5, 0)
Input ("BoxGeom.rib")
PopTransform ()

Attribute ("color C", (1, 1, 1))
Shader ("surface", "plastic")
Rotate (90.00, 1.00, 0.00, 0.00)
Input("PlaneGeom.rib")
Render()

box0.jpg
  • -
  • -

Pythonのインデント

エラーメッセージ
IndentationError: unindent does not match any outer indentation level
調べてみると・・・
インデントがきちんとしていると思っていたら、矢印キーでうろうろしてみると、2ヶ所、タブになっているところがありました。

  • スペースかタブかどちらかに統一して記述する。
    • -
    • -

    cgkitで変換を求める

    Pythonコマンドラインから、

    >>> from cgkit.all import *

    ちょっと時間がかかる・・・・。とりあえず球体!!!
    >>> s=Sphere()
    45度の回転行列を求める。
    >>> s.rot=mat3().fromEulerXYZ(0.25,0,0)
    >>> s.rot
    (1, 0, 0)
    (0, 0.968912, -0.247404)
    (0, 0.247404, 0.968912)

    >>> s.rot=mat3().fromEulerXYZ(0,0.25,0)
    >>> s.rot
    (0.968912, 0, 0.247404)
    (0, 1, 0)
    (-0.247404, 0, 0.968912)

    >>> s.rot=mat3().fromEulerXYZ(0,0,0.25)
    >>> s.rot
    (0.968912, -0.247404, 0)
    (0.247404, 0.968912, 0)
    (0, 0, 1)



    >>> for slot in s.iterSlots():
    ... print slot
    ...
    angularvel
    cog
    dynamics
    inertiatensor
    linearvel
    mass
    pos
    rot
    scale
    static
    totalmass
    transform
    visible
    worldtransform
    >>> s.radius
    1.0
    >>> s.pos
    (0, 0, 0)
    >>> s.rot
    (1, 0, 0)
    (0, 1, 0)
    (0, 0, 1)

    >>> s.static
    False
    >>> s.transform
    [1, 0, 0, 0]
    [0, 1, 0, 0]
    [0, 0, 1, 0]
    [0, 0, 0, 1]
    • -
    • -

    NVIDIA GelatoでBOXを表示する。その2

    同じオブジェクトをたくさん並べてみよう
    影も計算するように設定しました。
    whileのインデントはきちんと整えること。
    #box1.pyg
    Output ("box02.tif", "tiff", "rgb", "camera", "float gain", 1, "float gamma",
    1, "string filter", "gaussian", "float[2] filterwidth", (2, 2))
    Attribute ("string projection", "perspective")
    Attribute ("float fov", 20)
    Attribute ("int[2] resolution", (640, 480))
    #placecam 10 5 -10 0 0 0
    Rotate (-19.47, 1.00, 0.00, 0.00)
    Rotate (45.00, 0.00, 1.00, 0.00)
    Translate (-10.00, -5.00, 10.00)

    Attribute ("string geometryset", "+shadows")

    World ()
    Light ("light1", "pointlight", "float intensity", 350, "point from", (-10, 10, -10),"string shadowname", "shadows")
    Light ("light2", "pointlight", "float intensity", 350, "point from", (10, 10, -10),"string shadowname", "shadows")

    mypos=-3
    while mypos<=3:
    PushTransform ()
    Attribute ("color C", (1, 1, 0))
    Shader ("surface", "plastic")
    Translate ( 0, 0.5, mypos)
    Input ("BoxGeom.rib")
    PopTransform ()
    mypos+=1.3

    Attribute ("color C", (1, 1, 1))
    Rotate (90.00, 1.00, 0.00, 0.00)
    Shader ("surface", "plastic")
    Input("PlaneGeom.rib")
    Render()

    box1.jpg
    • -
    • -

    NVIDIA Gelatoでレンダリング その3

    スポットライトをあてる。
    shadingqualityを2にする。デフォルトは1。
    #sphere3.pyg
    Output ("sphere03.tif", "tiff", "rgb", "camera", "float gain", 1, "float gamma",
    1, "string filter", "gaussian", "float[2] filterwidth", (2, 2))
    Attribute ("float shadingquality",2)
    Attribute ("string projection", "perspective")
    Attribute ("float fov", 10)
    Attribute ("int[2] resolution", (640, 480))
    #placecam -20 15 0 0 0 0
    Rotate (-36.87, 1.00, 0.00, 0.00)
    Rotate (-90.00, 0.00, 1.00, 0.00)
    Translate (20.00, -15.00, 0.00)

    Attribute ("string geometryset", "+shadows")

    World ()
    #Light ("light1", "pointlight", "float intensity", 4000, "point from", (-20, 50, -20),"string shadowname", "shadows")

    Light ("light1", "spotlight", "string shadowname", "shadows", "point from", (-20, 50, -20), "point to", (0, 0, 0), "float intensity", 6000, "float coneangle", 90,"float shadowblur",0.01,"float shadowsamples", 4,"float shadowbias",0.1)

    PushTransform ()
    Attribute ("color C", (0, 0, 1))
    Shader ("surface", "plastic")
    Translate ( 0, 0.5, 0)
    Sphere (1, -1, 1, 360)
    PopTransform ()

    Attribute ("color C", (1, 1, 1))
    Shader ("surface", "plastic")
    Rotate (90.00, 1.00, 0.00, 0.00)
    Input("PlaneGeom.rib")
    Render()

    sphere3.jpg
    • -
    • -

    MayaのRIB exportを調べる

    mixi RenderManコミュから転載:

    MayaからプラグインのRIBexportでカメラは
    Transform [ ]で出ていますが、
    いろいろと調べてみました。

    RIBでの視野変換を以下のようにやるとして、
    Rotate RX 1 0 0
    Rotate RY 0 1 0
    Rotate RZ 0 0 1
    Translate -TX -TY TZ
    Scale SX SY -SZ

    行列は下から上へ、の順で乗算していき、逆行列を求めれば良いです。

    Translateの行列は、TX,TX,-TZで求め
    Rotate Yは、180-RYで求めました。

    以下はMayaのPerspのデフォルト位置を例として
    Python CGkitで求めてみました。

    Translate X: 28
    Translate Y: 21
    Translate Z: 28
    Rotate X: -27.938
    Rotate Y: 45
    Rotate Z: 0
    Scale X: 1
    Scale Y: 1
    Scale Z: 1


    C:\Python25>python
    >>> from cgkit.all import *
    >>> tr=mat4(1).translation(vec3(28,21,-28)) 
    >>> import math
    >>> rx=mat4(1).rotate(-27.938*math.pi/180,vec3(1,0,0))
    >>> rx
    [1, 0, 0, 0]
    [0, 0.883455, 0.468516, 0]
    [0, -0.468516, 0.883455, 0]
    [0, 0, 0, 1]
    >>> ry=mat4(1).rotate((180-45)*math.pi/180,vec3(0,1,0))
    >>> ry
    [-0.707107, 0, 0.707107, 0]
    [0, 1, 0, 0]
    [-0.707107, 0, -0.707107, 0]
    [0, 0, 0, 1]
    >>> v=tr*ry*rx
    >>> v
    [-0.707107, -0.331291, 0.624697, 28]
    [0, 0.883455, 0.468516, 21]
    [-0.707107, 0.331291, -0.624697, -28]
    [0, 0, 0, 1]
    >>> v.inverse() 逆行列
    [-0.707107, -2.77556e-017, -0.707107, 0]
    [-0.331291, 0.883455, 0.331291, -0.000275937]
    [0.624697, 0.468516, -0.624697, -44.8219]
    [0, 0, 0, 1]
    >>> v.inverse().transpose() 転置行列
    [-0.707107, -0.331291, 0.624697, 0]
    [-2.77556e-017, 0.883455, 0.468516, 0]
    [-0.707107, 0.331291, -0.624697, 0]
    [0, -0.000275937, -44.8219, 1]
    >>> s2=mat4(1).scaling(vec3(1,1,-1))
    >>> s3=mat4(1).scaling(vec3(-1,1,-1))
    >>> s2*v.inverse().transpose()*s3 スケールを両側からかけてみました。
    [0.707107, -0.331291, -0.624697, 0]
    [2.77556e-017, 0.883455, -0.468516, 0]
    [-0.707107, -0.331291, -0.624697, 0]
    [0, -0.000275937, 44.8219, 1]

    よって
    ConcatTransform [0.707107 -0.331291 -0.624697 0
    2.77556e-017 0.883455 -0.468516 0
    -0.707107 -0.331291 -0.624697 0
    0 -0.000275937 44.8219 1]

    ということで、cgkitで視野変換学べます。
    ありがとうございます。
    • -
    • -

    1/3 >>