1/1

はじめてのFujiyama Renderer その22

物体の回転軸について検討してみました。

■先ずカメラは、原点上、0 1 0 から -Z方向を見ています。
si.SetSampleProperty3('cam1', 'translate', 0, 1, 0, 0)

次に3つの立方体を配置、両側cubeはX軸中心に回転しています。
デフォルトの変換の順番はORDER_SRTであり、変換はスケール、回転、移動の順になります。

青色
si.SetProperty3('cube3', 'translate', -1.5,1.1, -8)
si.SetProperty3('cube3', 'rotate', -45,0, 0)


緑色
si.SetProperty3('cube2', 'translate', 1.5,1.1, -8)
si.SetProperty3('cube2', 'rotate', 30,0,0)
povbasic0.jpg

Pythonサンプル

#!/usr/bin/env python

#export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.6/site-packages/:$HOME/Fujiyama-Renderer/bin/
from colorinc import si
import fujiyama

#si = fujiyama.SceneInterface()

#plugins
si.OpenPlugin('ConstantShader')
si.OpenPlugin('PlasticShader')

#Camera
si.NewCamera('cam1', 'PerspectiveCamera')
#Calculate python fujicam.py 0 1 0 0 1 0
#si.SetSampleProperty3('cam1', 'rotate',0.00, 180, 0.00,0)
si.SetSampleProperty3('cam1', 'translate', 0, 1, 0,0)
si.SetProperty1('cam1', 'fov', 30)

#Light
si.NewLight('light1', 'SphereLight')
si.SetProperty3('light1', 'translate', -10, 10, 10)
si.SetProperty3('light1', 'scale', .5, .5, .5)
si.SetProperty1('light1', 'intensity', 1)
si.SetProperty1('light1', 'sample_count', 16)

si.NewLight('light2', 'SphereLight')
si.SetProperty3('light2', 'translate', 10, 10, 10)
si.SetProperty3('light2', 'scale', .5, .5, .5)
si.SetProperty1('light2', 'intensity', 1)
si.SetProperty1('light2', 'sample_count', 16)

#Texture
si.NewTexture('tex1', '../mip/pisa.mip')

#Shader
si.NewShader('dome_shader', 'ConstantShader')
si.AssignTexture('dome_shader', 'texture', 'tex1')

si.NewShader('floor_shader', 'PlasticShader')
si.SetProperty3('floor_shader', 'diffuse', .9, .2, .2)

intensity = 0
si.NewShader('sphere_shader', 'PlasticShader')
si.SetProperty3('sphere_shader', 'diffuse', intensity, intensity, intensity)
si.SetProperty1('sphere_shader', 'ior', 40)

#Mesh
si.NewMesh('dome_mesh', '../mesh/dome.mesh')
si.NewMesh('floor_mesh', '../mesh/floor.mesh')
si.NewMesh('sphere_mesh', '../mesh/sphere.mesh')
si.NewMesh('cube_mesh', '../mesh/cube.mesh')

#ObjectInstance
si.NewObjectInstance('cube1', 'cube_mesh')
si.AssignShader('cube1', 'DarkTurquoise_shader')
si.SetProperty3('cube1', 'translate', 0,1.1, -8)

si.NewObjectInstance('cube2', 'cube_mesh')
si.AssignShader('cube2', 'ForestGreen_shader')
si.SetProperty3('cube2', 'translate', 1.5,1.1, -8)
si.SetProperty3('cube2', 'rotate', 30,0,0)

si.NewObjectInstance('cube3', 'cube_mesh')
si.AssignShader('cube3', 'Blue_shader')
si.SetProperty3('Blue_shader', 'reflect', 0.5, 0.5, 0.5)
si.SetProperty3('cube3', 'translate', -1.5,1.1, -8)
si.SetProperty3('cube3', 'rotate', -45,0, 0)

si.NewObjectInstance('dome1', 'dome_mesh')
si.SetProperty3('dome1', 'rotate', 0, 0, 0)
si.SetProperty3('dome1', 'scale', 2, 2, 2)
si.AssignShader('dome1', 'dome_shader')

si.NewObjectInstance('floor1', 'floor_mesh')
si.SetProperty3('floor1', 'scale', 50, 50, 50)
si.AssignShader('floor1', 'floor_shader')

#ObjectGroup
si.NewObjectGroup('group1')
si.AddObjectToGroup('group1', 'cube1')
si.AddObjectToGroup('group1', 'cube2')
si.AddObjectToGroup('group1', 'cube3')
si.AssignObjectGroup('cube1', 'shadow_target', 'group1')
si.AssignObjectGroup('cube2', 'shadow_target', 'group1')
si.AssignObjectGroup('cube3', 'shadow_target', 'group1')
si.AssignObjectGroup('floor1', 'shadow_target', 'group1')

#FrameBuffer
si.NewFrameBuffer('fb1', 'rgba')

#Renderer
si.NewRenderer('ren1')
si.AssignCamera('ren1', 'cam1')
si.AssignFrameBuffer('ren1', 'fb1')
si.SetProperty2('ren1', 'resolution', 512, 384)
#si.SetProperty2('ren1', 'resolution', 160, 120)
#si.SetProperty2('ren1', 'pixelsamples', 12, 12)

#Rendering
si.RenderScene('ren1')

#Output
si.SaveFrameBuffer('fb1', '../povbasic0.fb')

#Run commands
si.Run()
#si.Print()


◆Z軸を中心に回転させると次のようになります。

si.NewObjectInstance('cube2', 'cube_mesh')
si.AssignShader('cube2', 'ForestGreen_shader')
si.SetProperty3('cube2', 'translate', 1.5,1.1, -8)
si.SetProperty3('cube2', 'rotate', 0,0,15)

si.NewObjectInstance('cube3', 'cube_mesh')
si.AssignShader('cube3', 'Blue_shader')
si.SetProperty3('Blue_shader', 'reflect', 0.5, 0.5, 0.5)
si.SetProperty3('cube3', 'translate', -1.5,1.1, -8)
si.SetProperty3('cube3', 'rotate', 0,0, -30)

povbasic00.jpg


■■続いて以下のように変換について
スケール、移動、回転の順に変更しています。
si.SetProperty1('cube2', 'transform_order', 'ORDER_STR')


si.NewObjectInstance('cube2', 'cube_mesh')
si.SetProperty1('cube2', 'transform_order', 'ORDER_STR')
si.AssignShader('cube2', 'ForestGreen_shader')
si.SetProperty3('cube2', 'translate', 2,1.1, -8)
si.SetProperty3('cube2', 'rotate', 0,0,15)

si.NewObjectInstance('cube3', 'cube_mesh')
si.SetProperty1('cube3', 'transform_order', 'ORDER_STR')
si.AssignShader('cube3', 'Blue_shader')
si.SetProperty3('Blue_shader', 'reflect', 0.5, 0.5, 0.5)
si.SetProperty3('cube3', 'translate', -2,1.1, -8)
si.SetProperty3('cube3', 'rotate', 0,0, -30)

Z軸を中心に回転しています。カメラはZ軸負方向を見ています。
povbasic1.jpg

■■■さらに変更します。以下はカメラを原点位置ちょっと上から、Z軸正の方向に向けています。
立方体もz軸位置8に置きました。
Cubeは、Z軸中心に回転させています。時計回りが+、反時計回りが-になります。
povbasic2.jpg

以下はPythonサンプルです。

#!/usr/bin/env python

#export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.6/site-packages/:$HOME/Fujiyama-Renderer/bin/
from colorinc import si
import fujiyama

#si = fujiyama.SceneInterface()

#plugins
si.OpenPlugin('ConstantShader')
si.OpenPlugin('PlasticShader')

#Camera
si.NewCamera('cam1', 'PerspectiveCamera')
#Calculate python fujicam.py 0 1 0 0 1 0
si.SetSampleProperty3('cam1', 'rotate',0.00, 180, 0.00,0)
si.SetSampleProperty3('cam1', 'translate', 0, 1, 0,0)
si.SetProperty1('cam1', 'fov', 30)

#Light
si.NewLight('light1', 'SphereLight')
si.SetProperty3('light1', 'translate', -10, 10, 10)
si.SetProperty3('light1', 'scale', .5, .5, .5)
si.SetProperty1('light1', 'intensity', 1)
si.SetProperty1('light1', 'sample_count', 16)

si.NewLight('light2', 'SphereLight')
si.SetProperty3('light2', 'translate', 10, 10, 10)
si.SetProperty3('light2', 'scale', .5, .5, .5)
si.SetProperty1('light2', 'intensity', 1)
si.SetProperty1('light2', 'sample_count', 16)

#Texture
si.NewTexture('tex1', '../mip/pisa.mip')

#Shader
si.NewShader('dome_shader', 'ConstantShader')
si.AssignTexture('dome_shader', 'texture', 'tex1')

si.NewShader('floor_shader', 'PlasticShader')
si.SetProperty3('floor_shader', 'diffuse', .9, .2, .2)

intensity = 0
si.NewShader('sphere_shader', 'PlasticShader')
si.SetProperty3('sphere_shader', 'diffuse', intensity, intensity, intensity)
si.SetProperty1('sphere_shader', 'ior', 40)

#Mesh
si.NewMesh('dome_mesh', '../mesh/dome.mesh')
si.NewMesh('floor_mesh', '../mesh/floor.mesh')
si.NewMesh('sphere_mesh', '../mesh/sphere.mesh')
si.NewMesh('cube_mesh', '../mesh/cube.mesh')

#ObjectInstance
si.NewObjectInstance('cube1', 'cube_mesh')
si.AssignShader('cube1', 'DarkTurquoise_shader')
si.SetProperty3('cube1', 'translate', 0,1.1, 8)

si.NewObjectInstance('cube2', 'cube_mesh')
si.SetProperty1('cube2', 'transform_order', 'ORDER_STR')
si.AssignShader('cube2', 'ForestGreen_shader')
si.SetProperty3('cube2', 'translate', 2,1.1, 8)
si.SetProperty3('cube2', 'rotate', 0,0,15)

si.NewObjectInstance('cube3', 'cube_mesh')
si.SetProperty1('cube3', 'transform_order', 'ORDER_STR')
si.AssignShader('cube3', 'Blue_shader')
si.SetProperty3('Blue_shader', 'reflect', 0.5, 0.5, 0.5)
si.SetProperty3('cube3', 'translate', -2,1.1, 8)
si.SetProperty3('cube3', 'rotate', 0,0, -30)

si.NewObjectInstance('dome1', 'dome_mesh')
si.SetProperty3('dome1', 'rotate', 0, 0, 0)
si.SetProperty3('dome1', 'scale', 2, 2, 2)
si.AssignShader('dome1', 'dome_shader')

si.NewObjectInstance('floor1', 'floor_mesh')
si.SetProperty3('floor1', 'scale', 50, 50, 50)
si.AssignShader('floor1', 'floor_shader')

#ObjectGroup
si.NewObjectGroup('group1')
si.AddObjectToGroup('group1', 'cube1')
si.AddObjectToGroup('group1', 'cube2')
si.AddObjectToGroup('group1', 'cube3')
si.AssignObjectGroup('cube1', 'shadow_target', 'group1')
si.AssignObjectGroup('cube2', 'shadow_target', 'group1')
si.AssignObjectGroup('cube3', 'shadow_target', 'group1')
si.AssignObjectGroup('floor1', 'shadow_target', 'group1')

#FrameBuffer
si.NewFrameBuffer('fb1', 'rgba')

#Renderer
si.NewRenderer('ren1')
si.AssignCamera('ren1', 'cam1')
si.AssignFrameBuffer('ren1', 'fb1')
si.SetProperty2('ren1', 'resolution', 512, 384)
#si.SetProperty2('ren1', 'resolution', 160, 120)
#si.SetProperty2('ren1', 'pixelsamples', 12, 12)

#Rendering
si.RenderScene('ren1')

#Output
si.SaveFrameBuffer('fb1', '../povbasic2.fb')

#Run commands
si.Run()
#si.Print()

いろいろと実験しながら、楽しいですね。
ありがとうございます。
  • -
  • -

はじめてのFujiyama Renderer その23

Fujiyama Rendererで物体の回転を検討します。今回は「3DCGをはじめようPOV-Ray入門」の繰り返し処理を参考にPythonサンプルを組んでみました。

変換の順序を変更できるFujiyama Rendererは便利です。
si.SetProperty1('sphere'+str(j), 'transform_order', 'ORDER_STR')
を記述しておきます。

以下はカメラ位置
si.SetSampleProperty3('cam1', 'translate', 0, 1, 10, 0)
から見たところです。
povsp60.jpg

繰り返しの記述は以下のようにしました。

j=0
Count=0
spname=[]
while (Count<10):
spname.append('sphere'+str(j))
si.NewObjectInstance('sphere'+str(j), 'sphere_mesh')
si.SetProperty1('sphere'+str(j), 'transform_order', 'ORDER_STR')
si.AssignShader('sphere'+str(j), 'sphere_shader' )
si.SetProperty3('sphere'+str(j), 'scale',0.75,0.75,0.75)
si.SetProperty3('sphere'+str(j), 'translate',3.5,0.75,0)
si.SetProperty3('sphere'+str(j), 'rotate', 0,36*Count,0)
Count=Count+1
j+=1


影を表示するため
以下の記述でグループにまとめています。

#ObjectGroup
si.NewObjectGroup('group1')
for i in spname:
si.AddObjectToGroup('group1', i)

for i in spname:
si.AssignObjectGroup(i, 'shadow_target', 'group1')
si.AssignObjectGroup('floor1', 'shadow_target', 'group1')


povsp6.jpg

以下はPythonサンプルです。ありがとうございます。
floor_shaderのiorは2くらいに下げてください。

#!/usr/bin/env python
from math import *
#export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.6/site-packages/:$HOME/Fujiyama-Renderer/bin/
import fujiyama

si = fujiyama.SceneInterface()

#plugins
si.OpenPlugin('ConstantShader')
si.OpenPlugin('PlasticShader')

#Camera
si.NewCamera('cam1', 'PerspectiveCamera')

#Calculate python fujicam.py 0 10 10 0 0 0
si.SetSampleProperty3('cam1', 'rotate', -45, 0, 0, 0)
si.SetSampleProperty3('cam1', 'translate', 0, 10, 10, 0)
#si.SetSampleProperty3('cam1', 'translate', 0, 1, 10, 0)

si.SetProperty1('cam1', 'fov', 35)

#Light
si.NewLight('light1', 'SphereLight')
si.SetProperty3('light1', 'translate', 10, 10, 10)
si.SetProperty3('light1', 'scale', .5, .5, .5)
si.SetProperty1('light1', 'intensity', 1.5)
si.SetProperty1('light1', 'sample_count', 16)

si.NewLight('light2', 'SphereLight')
si.SetProperty3('light2', 'translate', -5, 10, 10)
si.SetProperty3('light2', 'scale', .5, .5, .5)
si.SetProperty1('light2', 'intensity', 1.5)
si.SetProperty1('light2', 'sample_count', 16)

#Texture
si.NewTexture('tex1', '../mip/pisa.mip')

#Shader
si.NewShader('dome_shader', 'ConstantShader')
si.AssignTexture('dome_shader', 'texture', 'tex1')

si.NewShader('floor_shader', 'PlasticShader')
si.SetProperty3('floor_shader', 'diffuse', .9, .2, .2)
si.SetProperty1('floor_shader', 'ior', 8)

intensity = 0
si.NewShader('sphere_shader', 'PlasticShader')
si.SetProperty3('sphere_shader', 'diffuse', intensity, intensity, intensity)
si.SetProperty1('sphere_shader', 'ior', 40)

#Mesh
si.NewMesh('dome_mesh', '../mesh/dome.mesh')
si.NewMesh('floor_mesh', '../mesh/floor.mesh')
si.NewMesh('sphere_mesh', '../mesh/sphere.mesh')

#ObjectInstance
si.NewObjectInstance('dome1', 'dome_mesh')
si.SetProperty3('dome1', 'rotate', 0, 0, 0)

j=0
Count=0

spname=[]

while (Count<10):
spname.append('sphere'+str(j))
si.NewObjectInstance('sphere'+str(j), 'sphere_mesh')
si.SetProperty1('sphere'+str(j), 'transform_order', 'ORDER_STR')
si.AssignShader('sphere'+str(j), 'sphere_shader' )
si.SetProperty3('sphere'+str(j), 'scale',0.75,0.75,0.75)
si.SetProperty3('sphere'+str(j), 'translate',3.5,0.75,0)
si.SetProperty3('sphere'+str(j), 'rotate', 0,36*Count,0)

Count=Count+1
j+=1


#si.SetProperty3('dome1', 'scale', -.5, .5, .5)
si.SetProperty3('dome1', 'scale', -2, 2, 2)
si.AssignShader('dome1', 'dome_shader')

si.NewObjectInstance('floor1', 'floor_mesh')
si.SetProperty3('floor1', 'scale', 50, 50, 50)
si.SetProperty3('floor1', 'translate', 0, 0, 0)
si.AssignShader('floor1', 'floor_shader')

#ObjectGroup
si.NewObjectGroup('group1')
for i in spname:
si.AddObjectToGroup('group1', i)

for i in spname:
si.AssignObjectGroup(i, 'shadow_target', 'group1')
si.AssignObjectGroup('floor1', 'shadow_target', 'group1')

#FrameBuffer
si.NewFrameBuffer('fb1', 'rgba')

#Renderer
si.NewRenderer('ren1')
si.AssignCamera('ren1', 'cam1')
si.AssignFrameBuffer('ren1', 'fb1')
si.SetProperty2('ren1', 'resolution', 512, 384)
#si.SetProperty2('ren1', 'resolution', 160, 120)
si.SetProperty2('ren1', 'pixelsamples', 2, 2)

#Rendering
si.RenderScene('ren1')

#Output
si.SaveFrameBuffer('fb1', '../povsp6.fb')

#Run commands
si.Run()
#si.Print()
  • -
  • -

1/1