1/1

PythonからRenderManを使う その1

RenderManはC APIで記述されているが、cgkitと3Delightを使えば、次のように球体を表示、レンダリングできます。
本来ならば、C言語を使ってコンパイルしてやりますが、Python良いですね。便利です。

以下はcgkitを使って3Delightで直接レンダリングしました。3DelightのLibフォルダの3Delight.libが働いてくれます。


#min.py
import cgkit.cri

ri = cgkit.cri.loadRI("3Delight")
cgkit.cri.importRINames(ri, globals())

RiBegin(RI_NULL)
RiDisplay("min.tif", RI_FRAMEBUFFER, RI_RGB)
RiProjection(RI_PERSPECTIVE)
RiTranslate(0,0,1.5)
RiWorldBegin()
RiLightSource("ambientlight","intensity",0.4)
RiLightSource("distantlight")
RiSurface("plastic")
RiColor((1,0.2,0.2))
RiSphere(1,-1,1,360)
RiWorldEnd()
RiEnd()



ri = cgkit.cri.loadRI("3Delight")の部分を
オープンソースRenderMan互換レンダラのAqsis Renderer1.6を使用するならば、


ri = cgkit.cri.loadRI("aqsis_ri2rib")


コマンドプロンプトから、
>min.py
と打ち込むと、RIBが生成されて表示されるだけです。
なので、パイプを使います。こんな感じ・・
>min.py |aqsis

prmanの場合も、cgkitを使う場合は、
ri = cgkit.cri.loadRI("libprman")
>min.py |prman
となります。直接レンダリングではないので、
RenderManProServer-14からついているimport prmanを利用します。


# set PYTHONPATH=C:\Python25;C:\Python\Scripts;%RMANTREE%\bin
#min_pr.py
import prman
ri=prman.Ri()
rendertarget="min_pr.rib"
ri.Begin(ri.RENDER)
ri.Imager("background", {"color color":(.2,.4,.6)})
ri.Display("min_pr.tif", "framebuffer", "rgb")
ri.Format(640,480,1)
ri.Projection(ri.PERSPECTIVE, {ri.FOV: 90})
ri.Translate(0,0,1.5)
ri.WorldBegin()
ri.LightSource("distantlight", {ri.HANDLEID: "1"})
ri.LightSource("ambientlight", {ri.HANDLEID: "2", "intensity":[0.4]})
ri.Color((1,0.2,0.2))
ri.Surface("plastic")
ri.Sphere(1,-1,1,360)
ri.WorldEnd()
ri.End()


>min.pyと打ち込む前に
>set PYTHONPATH=C:\Python25;C:\Python\Scripts;%RMANTREE%\bin
でパスを通しておきます。
以下はレンダリング結果。
min_pr.jpg
  • -
  • -

「実践CGへの誘い」例題をPythonで行う その1

「実践CGへの誘い」p.18
Listing 2.1

cgkitと3Delightを使って
Python APIによるRenderManのシーン記述です。
4角形の表示です。



#list21.py
#/* Copyrighted Pixar 1989 */
#/* From the RenderMan Companion p. 18 */
#/* Listing 2.1 A minimal program using RenderMan */

import cgkit.cri
from cgkit.cgtypes import *

# Load the RenderMan API.
# Replace the library name with whatever renderer you want to use.
ri = cgkit.cri.loadRI("3delight")
cgkit.cri.importRINames(ri, globals())

square=[.5,.5,.5,.5,-.5,.5,-.5,-.5,.5,-.5,.5,.5]

RiBegin(RI_NULL)
RiFormat(640,480,1)
RiDisplay("list21.tif", RI_FRAMEBUFFER, RI_RGB)
#RiPixelSamples(3,3)
#RiProjection(RI_ORTHOGRAPHIC)
#RiScale(vec3(0.8))
#RiTranslate(0,0.55,5)
RiWorldBegin()
RiSurface("constant",RI_NULL)
RiPolygon(P=square)
RiWorldEnd()
RiEnd()


コマンドプロンプトから
>list21.py
と打ち込むと3delightでレンダリングして表示されます。
はじめの一歩ですね。
  • -
  • -

「実践CGへの誘い」例題をPythonで行う その2

「実践CGへの誘い」p.20
Listing 2.2




#list22.py
#/* Copyrighted Pixar 1989 */
#/* From the RenderMan Companion p. 20 */
#/* Listing 2.2 Control over viewer and color */

import cgkit.cri
from cgkit.cgtypes import *

# Load the RenderMan API.
# Replace the library name with whatever renderer you want to use.
ri = cgkit.cri.loadRI("3delight")
cgkit.cri.importRINames(ri, globals())

square=[.5,.5,.5,.5,-.5,.5,-.5,-.5,.5,-.5,.5,.5]

color=(.2,.4,.6)

RiBegin(RI_NULL)
RiLightSource("distantlight",RI_NULL)
RiProjection(RI_PERSPECTIVE)
RiTranslate(0.0,0.0,1.0)
RiRotate(40,-1,1,0)
RiDisplay("list22.tif", RI_FRAMEBUFFER, RI_RGB)
RiWorldBegin()
RiColor(color)
RiSurface("constant",RI_NULL)
RiPolygon(P=square)
RiWorldEnd()
RiEnd()

  • -
  • -

「実践CGへの誘い」例題をPythonで行う その3

「実践CGへの誘い」p.25
Listing 2.3
list23.jpg


#list23.py
# Copyrighted Pixar 1989
# From the RenderMan Companion p. 25
# Listing 2.3 Control over viewer and color

import cgkit.cri
from cgkit.cgtypes import *

# Load the RenderMan API.
# Replace the library name with whatever renderer you want to use.
ri = cgkit.cri.loadRI("3delight")
cgkit.cri.importRINames(ri, globals())

L= -.5 #* For x: left side */
R= .5 # /* For x: right side */
D= -.5 # /* For y: down side */
U= .5 # /* For y: upper side */
F= .5 # /* For z: far side */
N= -.5 # /* For z: near side */

#/* UnitCube(): define a cube in the graphics environment */
def UnitCube():
Cube=[
[ [L,D,F], [L,D,N], [R,D,N], [R,D,F] ], #/* Bottom face */
[ [L,D,F], [L,U,F], [L,U,N], [L,D,N] ], #/* Left face */
[ [R,U,N], [L,U,N], [L,U,F], [R,U,F] ], #/* Top face */
[ [R,U,N], [R,U,F], [R,D,F], [R,D,N] ], #/* Right face */
[ [R,D,F], [R,U,F], [L,U,F], [L,D,F] ], #/* Far face */
[ [L,U,N], [R,U,N], [R,D,N], [L,D,N] ] #/* Near face */
];
for i in range(6):
RiPolygon(P=Cube[i])


#square=[.5,.5,.5,.5,-.5,.5,-.5,-.5,.5,-.5,.5,.5]

color=(.2,.4,.6)

RiBegin(RI_NULL)
RiDisplay("list23.tif", RI_FRAMEBUFFER, RI_RGB)
RiFormat(640,480, -1.0)
RiShadingRate(1.0)
RiLightSource("distantlight", RI_NULL)
RiProjection(RI_PERSPECTIVE)
RiWorldBegin()
RiTranslate(0.0, 0.0, 1.5)
RiRotate(40.0, -1.0, 1.0, 0.0)
RiSurface("matte",RI_NULL)
RiColor(color)
UnitCube()
#RiPolygon(P=square)
RiWorldEnd()
RiEnd()

  • -
  • -

1/1