Rendering学習日記

日々3DCGの世界は進歩しているけど、勉強して理解したことをまとめていきたい。RenderMan互換レンダラーやグローバル・イルミネーション。いろんなことに好奇心を持ち面白くなってくる。目指せShader書き!!

はじめてのFujiyama Renderer その28

Fujiyama Renderer0.1.3リリースされた。
SSS(Subsurface scattering shader)が使えるようになりました。皮膚や牛乳のような物質の表現ができる。

試しにTeapotを4つの設定でやってみる。光の当て方と視点を検討。
レンダリング時間 1h 28m 45s
teapotscn02.jpg

以下はPythonサンプル


#!/usr/bin/env python
# -*- coding: utf-8 -*-

#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')
si.OpenPlugin('SSSShader')

#Camera
si.NewCamera('cam1', 'PerspectiveCamera')
si.SetProperty3('cam1', 'rotate', -30, 0.00, 0.00)
si.SetProperty3('cam1', 'translate', 0.00, 6.00, 7.00)
si.SetProperty1('cam1', 'fov', 35)

#Light
"""
si.NewLight('lighta', 'PointLight')
si.SetProperty3('lighta', 'translate', -5, 4, 5)
si.SetProperty1('lighta', 'intensity', 0.03)

si.NewLight('lightb', 'SphereLight')
si.SetProperty3('lightb', 'translate', 5, 4, 5)
si.SetProperty3('lightb', 'scale', .5, .5, .5)
si.SetProperty1('lightb', 'intensity', 0.03)
"""
#Light
si.NewLight( 'light0', 'PointLight')
si.SetProperty3( 'light0', 'translate', 0.900771, 12, 4.09137)
si.SetProperty1( 'light0', 'intensity', 0.03125)
si.NewLight( 'light1', 'PointLight')
si.SetProperty3( 'light1', 'translate', 2.02315, 12, 5.28021)
si.SetProperty1( 'light1' ,'intensity', 0.03125)
si.NewLight( 'light2', 'PointLight')
si.SetProperty3( 'light2', 'translate', 10.69, 12, 13.918)
si.SetProperty1( 'light2', 'intensity', 0.03125)
si.NewLight( 'light3', 'PointLight')
si.SetProperty3( 'light3', 'translate', 4.28027, 12, 7.58462)
si.SetProperty1( 'light3', 'intensity', 0.03125)
si.NewLight( 'light4', 'PointLight')
si.SetProperty3( 'light4', 'translate', 12.9548, 12, 1.19914)
si.SetProperty1( 'light4', 'intensity', 0.03125)
si.NewLight( 'light5', 'PointLight')
si.SetProperty3( 'light5', 'translate', 6.55808, 12, 2.31772)
si.SetProperty1( 'light5', 'intensity', 0.03125)
si.NewLight( 'light6', 'PointLight')
si.SetProperty3( 'light6', 'translate', 0.169064, 12, 10.9623)
si.SetProperty1( 'light6', 'intensity', 0.03125)
si.NewLight( 'light7', 'PointLight')
si.SetProperty3( 'light7', 'translate', 1.25002, 12, 4.51314)
si.SetProperty1( 'light7', 'intensity', 0.03125)
si.NewLight( 'light8', 'PointLight')
si.SetProperty3( 'light8', 'translate', 2.46758, 12, 5.73382)
si.SetProperty1( 'light8', 'intensity', 0.03125)
si.NewLight( 'light9', 'PointLight')
si.SetProperty3( 'light9', 'translate', 3.55644, 12, 6.84334)
si.SetProperty1( 'light9','intensity', 0.03125)
si.NewLight( 'light10', 'PointLight')
si.SetProperty3( 'light10', 'translate', 4.76112, 12, 8.00264)
si.SetProperty1( 'light10', 'intensity', 0.03125)
si.NewLight( 'light11', 'PointLight')
si.SetProperty3( 'light11', 'translate', 13.3267,12, 9.10333)
si.SetProperty1( 'light11', 'intensity', 0.03125)
si.NewLight( 'light12', 'PointLight')
si.SetProperty3( 'light12', 'translate', 14.4155, 12, 2.68084)
si.SetProperty1( 'light12', 'intensity', 0.03125)
si.NewLight( 'light13', 'PointLight')
si.SetProperty3( 'light13', 'translate', 8.10755, 12, 3.79629)
si.SetProperty1( 'light13', 'intensity', 0.03125)
si.NewLight( 'light14', 'PointLight')
si.SetProperty3( 'light14', 'translate', 9.21103, 12, 4.9484)
si.SetProperty1( 'light14', 'intensity', 0.03125)
si.NewLight( 'light15', 'PointLight')
si.SetProperty3( 'light15', 'translate', 2.83469, 12, 6.09221)
si.SetProperty1( 'light15', 'intensity', 0.03125)
si.NewLight( 'light16', 'PointLight')
si.SetProperty3( 'light16', 'translate', 4.00945, 12, 7.18302)
si.SetProperty1( 'light16', 'intensity', 0.03125)
si.NewLight( 'light17', 'PointLight')
si.SetProperty3( 'light17', 'translate', 12.6072, 12, 0.832089)
si.SetProperty1( 'light17', 'intensity', 0.03125)
si.NewLight( 'light18', 'PointLight')
si.SetProperty3( 'light18', 'translate', 6.21169, 12, 1.98055)
si.SetProperty1( 'light18', 'intensity', 0.03125)
si.NewLight( 'light19', 'PointLight')
si.SetProperty3( 'light19', 'translate', 7.39599, 12, 10.5563)
si.SetProperty1( 'light19', 'intensity', 0.03125)
si.NewLight( 'light20', 'PointLight')
si.SetProperty3( 'light20', 'translate', 8.52421, 12, 4.15086)
si.SetProperty1( 'light20', 'intensity', 0.03125)
si.NewLight( 'light21', 'PointLight')
si.SetProperty3( 'light21', 'translate', 9.5891, 12, 5.39715)
si.SetProperty1( 'light21', 'intensity', 0.03125)
si.NewLight( 'light22', 'PointLight')
si.SetProperty3( 'light22', 'translate', 3.18967, 12, 13.9542)
si.SetProperty1( 'light22', 'intensity', 0.03125)
si.NewLight( 'light23','PointLight')
si.SetProperty3( 'light23', 'translate', 4.41432, 12, 0.082813)
si.SetProperty1( 'light23', 'intensity', 0.03125)
si.NewLight( 'light24', 'PointLight')
si.SetProperty3( 'light24', 'translate', 5.48803, 12, 1.21856)
si.SetProperty1( 'light24', 'intensity', 0.03125)
si.NewLight( 'light25', 'PointLight')
si.SetProperty3( 'light25', 'translate', 6.57647, 12, 2.31432)
si.SetProperty1( 'light25', 'intensity', 0.03125)
si.NewLight( 'light26', 'PointLight')
si.SetProperty3( 'light26', 'translate', 0.265098, 12, 10.9453)
si.SetProperty1( 'light26', 'intensity', 0.03125)
si.NewLight( 'light27', 'PointLight')
si.SetProperty3( 'light27', 'translate', 8.84422, 12, 12.1117)
si.SetProperty1( 'light27', 'intensity', 0.03125)
si.NewLight( 'light28', 'PointLight')
si.SetProperty3( 'light28', 'translate', 10.0154, 12, 5.67625)
si.SetProperty1( 'light28', 'intensity', 0.03125)
si.NewLight( 'light29', 'PointLight')
si.SetProperty3( 'light29', 'translate', 11.0907, 12, 14.4043)
si.SetProperty1( 'light29', 'intensity', 0.03125)
si.NewLight( 'light30', 'PointLight')
si.SetProperty3( 'light30', 'translate', 4.71726, 12, 7.98851)
si.SetProperty1( 'light30', 'intensity', 0.03125)
si.NewLight( 'light31', 'PointLight')
si.SetProperty3( 'light31', 'translate', 13.3907, 12, 9.08986)
si.SetProperty1( 'light31', 'intensity', 0.03125)

#Texture
si.NewTexture( 'tex1', '../mip/ennis.mip')
si.NewTexture('tex2', '../mip/uvmap.mip')

#Shader
si.NewShader('floor_shader', 'PlasticShader')
si.NewShader('dome_shader', 'ConstantShader')
#Shader
si.NewShader('teapot_shader1', 'SSSShader')
si.SetProperty3('teapot_shader1', 'reflect', 0, 0, 0)
si.SetProperty1('teapot_shader1', 'enable_single_scattering', 1)
si.SetProperty1('teapot_shader1', 'enable_multiple_scattering', 0)
si.SetProperty1('teapot_shader1', 'single_scattering_samples', 1)
si.SetProperty1('teapot_shader1', 'multiple_scattering_samples', 1)
si.SetProperty3('teapot_shader1', 'scattering_coefficient', .007, .018, .003)
si.SetProperty3('teapot_shader1', 'absorption_coefficient', .097, .0061, .145)

si.NewShader('teapot_shader2', 'SSSShader')
si.SetProperty3('teapot_shader2', 'reflect', 0, 0, 0)
si.SetProperty1('teapot_shader2', 'enable_single_scattering', 1)
si.SetProperty1('teapot_shader2', 'enable_multiple_scattering', 0)
si.SetProperty1('teapot_shader2', 'single_scattering_samples', 1)
si.SetProperty1('teapot_shader2', 'multiple_scattering_samples', 1)
si.SetProperty3('teapot_shader2', 'scattering_coefficient', .07, .122, .19)
si.SetProperty3('teapot_shader2', 'absorption_coefficient', .00014, .00025, .00142)
si.SetProperty3('teapot_shader2', 'specular', .01, .01, .01)

si.NewShader('teapot_shader3', 'SSSShader')
si.SetProperty3('teapot_shader3', 'reflect', 0, 0, 0)
si.SetProperty1('teapot_shader3', 'enable_single_scattering', 1)
si.SetProperty1('teapot_shader3', 'enable_multiple_scattering', 0)
si.SetProperty1('teapot_shader3', 'single_scattering_samples', 1)
si.SetProperty1('teapot_shader3', 'multiple_scattering_samples', 1)
si.SetProperty3('teapot_shader3', 'scattering_coefficient', .074, .088, .101)
si.SetProperty3('teapot_shader3', 'absorption_coefficient', .0032, .017, .048)
si.SetProperty3('teapot_shader3', 'specular', .1, .1, .1)
si.SetProperty1('teapot_shader3', 'roughness', .2)

si.NewShader('teapot_shader4', 'SSSShader')
si.SetProperty3('teapot_shader4', 'reflect', 0, 0, 0)
si.SetProperty1('teapot_shader4', 'enable_single_scattering', 1)
si.SetProperty1('teapot_shader4', 'enable_multiple_scattering', 0)
si.SetProperty1('teapot_shader4', 'single_scattering_samples', 1)
si.SetProperty1('teapot_shader4', 'multiple_scattering_samples', 1)
si.SetProperty3('teapot_shader4', 'scattering_coefficient', .255, .321, .377)
si.SetProperty3('teapot_shader4', 'absorption_coefficient', .00011, .00024, .0014)


#Mesh
si.NewMesh('teapot_mesh', '../mesh/teapot.mesh')
si.NewMesh('floor_mesh', '../mesh/floor2.mesh')
si.NewMesh('dome_mesh', '../mesh/dome.mesh')

#ObjectInstance
#ObjectInstance
si.NewObjectInstance('teapot1','teapot_mesh')
si.SetProperty3('teapot1', 'translate', -1.7, 0.5, -3)
si.SetProperty3('teapot1', 'scale', 1.6, 1.6, 1.6)
si.AssignShader('teapot1','teapot_shader1')

si.NewObjectInstance('teapot2','teapot_mesh')
si.SetProperty3('teapot2', 'translate', 1.7, 0.5, -3)
si.SetProperty3('teapot2', 'scale', 1.6, 1.6, 1.6)
si.AssignShader('teapot2','teapot_shader2')

si.NewObjectInstance('teapot3','teapot_mesh')
si.SetProperty3('teapot3', 'translate', 1.7, 0.5, 0)
si.SetProperty3('teapot3', 'scale', 1.6, 1.6, 1.6)
si.AssignShader('teapot3','teapot_shader3')

si.NewObjectInstance('teapot4','teapot_mesh')
si.SetProperty3('teapot4', 'translate', -1.7, 0.5, 0)
si.SetProperty3('teapot4', 'scale', 1.6, 1.6, 1.6)
si.AssignShader('teapot4','teapot_shader4')

si.NewObjectInstance('floor1','floor_mesh')
si.SetProperty3('floor1','translate', 0, 0, -2.5)
si.SetProperty3('floor1','scale', 1.1, 1.1, 1.1)
si.SetProperty3('floor1','rotate', 0, 0, 0)
si.AssignShader('floor1','floor_shader')
si.AssignTexture('floor_shader', 'diffuse_map', 'tex2')

si.NewObjectInstance('dome1','dome_mesh')
si.SetProperty3( 'dome1', 'scale', .5, .5, .5)
si.SetProperty3( 'dome1', 'rotate', 0 ,135, 0)
si.AssignShader( 'dome1', 'dome_shader')
si.AssignTexture( 'dome_shader' ,'texture', 'tex1')

#ObjectGroup
si.NewObjectGroup( 'group1')
si.AddObjectToGroup( 'group1', 'teapot1')
si.AddObjectToGroup( 'group1', 'teapot2')
si.AddObjectToGroup( 'group1', 'teapot3')
si.AddObjectToGroup( 'group1', 'teapot4')
si.AssignObjectGroup( 'teapot1','shadow_target', 'group1')
si.AssignObjectGroup( 'teapot2','shadow_target', 'group1')
si.AssignObjectGroup( 'teapot3','shadow_target', 'group1')
si.AssignObjectGroup( 'teapot4','shadow_target', 'group1')
si.AssignObjectGroup( 'floor1','shadow_target', 'group1')


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

#Properties
si.ShowPropertyList('Renderer')

#Renderer
si.NewRenderer('ren1')
si.AssignCamera('ren1', 'cam1')
si.AssignFrameBuffer('ren1', 'fb1')
si.SetProperty2('ren1', 'resolution', 640, 480)
#si.SetProperty2('ren1', 'resolution', 160, 120)

si.SetProperty1('ren1', 'raymarch_step', .01)
si.SetProperty1('ren1', 'raymarch_shadow_step', .02)
si.SetProperty1('ren1', 'raymarch_reflect_step', .02)

#Rendering
si.RenderScene('ren1')

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

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



teapot33.jpg
Fujiyama Renderer | - | -

Python CgkitでのTransform

Aqsisのサンプルが参考になったのでPythonインタラクティブモードで確認してみました。

localhost ~]$ python
Python 2.6.6 (r266:84292, Sep 11 2012, 08:28:27)
[GCC 4.4.6 20120305 (Red Hat 4.4.6-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from cgkit.cgtypes import *
>>> from cgkit.ri import *
>>> from math import *
>>> transm = mat4 ( 1 )
>>> transm = transm.lookAt( (10,10,10), (0,0,0) )
>>> transm
[0.707107, -0.408248, -0.57735, 10]
[-0.707107, -0.408248, -0.57735, 10]
[-8.94467e-18, 0.816497, -0.57735, 10]
[0, 0, 0, 1]
>>> transm = transm.inverse()
>>> transm
[0.707107, -0.707107, 0, -0]
[-0.408248, -0.408248, 0.816497, 0]
[-0.57735, -0.57735, -0.57735, 17.3205]
[-0, 0, -0, 1]
>>> RiTransform ( transm )
Transform [0.707106781187 -0.408248290464 -0.57735026919 -0.0 -0.707106781187 -0.408248290464 -0.57735026919 0.0 0.0 0.816496580928 -0.57735026919 -0.0 -0.0 0.0 17.3205080757 1.0]
>>>
cgkit | - | -

はじめてのFujiyama Renderer その27

アンティーク扇風機のモデルをFujiyama Rendererでレンダリングした。
3DSフォーマットをBlenderでPlyに変換出力した。
mekas4.jpg

ありがとうございます。


#!/usr/bin/env python
from math import *
#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')
si.OpenPlugin('GlassShader')

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

#Calculate python fujicam.py -3 4 5 0 1.3 0
si.SetSampleProperty3('cam1', 'rotate', -24.85, -30.96, 0, 0)
si.SetSampleProperty3('cam1', 'translate', -3, 4, 5, 0)
#si.SetSampleProperty3('cam1', 'translate', 0, 1, 5, 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.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', 4)

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

si.NewShader('obj_shader', 'PlasticShader')
si.SetProperty3('obj_shader', 'diffuse', 0.2, 0.4, 0.6)
si.SetProperty3('obj_shader', 'reflect', 0.9, 0.9, 0.9)
si.SetProperty1('obj_shader', 'ior', 4)

si.NewShader('obj2_shader', 'PlasticShader')
si.SetProperty3('obj2_shader', 'diffuse', 1, 1, 0.1)
si.SetProperty1('obj2_shader', 'ior', 8)
#Mesh
si.NewMesh('dome_mesh', '../mesh/dome.mesh')
si.NewMesh('floor_mesh', '../mesh/floor.mesh')
si.NewMesh('senpuuki_mesh', '../mesh/senpuuki.mesh')

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

#ObjectInstance
si.NewObjectInstance('sen1', 'senpuuki_mesh')
si.AssignShader('sen1', 'obj_shader')
si.SetProperty3('sen1', 'scale',1,1,1)
si.SetProperty3('sen1', 'translate',0,0.1,0)
si.SetProperty3('sen1', 'rotate',-90,0,0)

#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')
si.AddObjectToGroup('group1', 'sen1')
si.AssignObjectGroup('sen1', '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', 4, 4)

#Rendering
si.RenderScene('ren1')

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

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


Fujiyama Renderer | - | -

はじめてのFujiyama Renderer その26

七葉3DCG保管庫にあるメカサワくんモデルを変換してFujiyama Rendererでレンダリングしてみた。
元データは3dsフォーマットであり、Blenderで3dsインポートし、部品ごとにplyエクスポートして、Fujiyama Rendererでれんだりんぐしてみたが、shaderのカラーが真っ黒で変更しても変わらないことがわかる。原因は、元データの面の向きが裏返しになっていた。Blenderで部品を選択しEdit modeでflip directionを行い、ply出力した。
今回部品は、次のように分けた。すべて法線フリップしてPly出力している。
ボディ、mekabody
目、mekame
手、mekate
と分けた。
mekas1.jpg

mekas2.jpg

mekas3.jpg
以下はPythonサンプル


#!/usr/bin/env python
from math import *
#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')
si.OpenPlugin('GlassShader')

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

#Calculate python fujicam.py 3 4 5 0 1 0
si.SetSampleProperty3('cam1', 'rotate', -27.23, 30.96, 0, 0)
si.SetSampleProperty3('cam1', 'translate', 3, 4, 5, 0)
#si.SetSampleProperty3('cam1', 'translate', 0, 1, 5, 0)

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

#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', 4)

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

si.NewShader('obj_shader', 'PlasticShader')
si.SetProperty3('obj_shader', 'diffuse', 0.2, 0.4, 0.6)
si.SetProperty3('obj_shader', 'reflect', 0.9, 0.9, 0.9)
si.SetProperty1('obj_shader', 'ior', 4)

si.NewShader('obj2_shader', 'PlasticShader')
si.SetProperty3('obj2_shader', 'diffuse', 1, 1, 0.1)
si.SetProperty1('obj2_shader', 'ior', 8)
#Mesh
si.NewMesh('dome_mesh', '../mesh/dome.mesh')
si.NewMesh('floor_mesh', '../mesh/floor.mesh')
si.NewMesh('mekaeye_mesh', '../mesh/mekame.mesh')
si.NewMesh('mekabody_mesh', '../mesh/mekabody.mesh')
si.NewMesh('mekate_mesh', '../mesh/mekate.mesh')


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

#ObjectInstance
si.NewObjectInstance('mekae1', 'mekaeye_mesh')
#si.SetProperty1('mekae1', 'transform_order', 'ORDER_STR')
si.AssignShader('mekae1', 'obj2_shader')
si.SetProperty3('mekae1', 'scale',1,1,1)
si.SetProperty3('mekae1', 'translate',0,0.1,0)
si.SetProperty3('mekae1', 'rotate',-90,0,0)


si.NewObjectInstance('mekab1', 'mekabody_mesh')
#si.SetProperty1('mekab1', 'transform_order', 'ORDER_STR')
si.AssignShader('mekab1', 'obj_shader' )
si.SetProperty3('mekab1', 'scale',1,1,1)
si.SetProperty3('mekab1', 'translate',0,0.1,0)
si.SetProperty3('mekab1', 'rotate',-90,0,0)


si.NewObjectInstance('mekat1', 'mekate_mesh')
#si.SetProperty1('mekab1', 'transform_order', 'ORDER_STR')
si.AssignShader('mekat1', 'obj_shader' )
si.SetProperty3('mekat1', 'scale',1,1,1)
si.SetProperty3('mekat1', 'translate',0,0.1,0)
si.SetProperty3('mekat1', 'rotate',-90,0,0)

#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')
si.AddObjectToGroup('group1', 'mekae1')
si.AddObjectToGroup('group1', 'mekat1')
si.AddObjectToGroup('group1', 'mekab1')
si.AssignObjectGroup('mekae1', 'shadow_target', 'group1')
si.AssignObjectGroup('mekat1', 'shadow_target', 'group1')
si.AssignObjectGroup('mekab1', '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', 4, 4)

#Rendering
si.RenderScene('ren1')

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

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


Fujiyama Renderer | - | -

はじめてのFujiyama Renderer その25

POV-Ray記事を参考に積み木をつくってみた。
参考サイト
http://monge.tec.fukuoka-u.ac.jp/cg_PovRay/box06A+6B.html

povsp8.jpg

以下はPythonサンプル例です。


#!/usr/bin/env python
from math import *
#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 20 20 0 0 0
si.SetSampleProperty3('cam1', 'rotate', -45, 0, 0, 0)
si.SetSampleProperty3('cam1', 'translate', 0, 20, 20, 0)
#si.SetSampleProperty3('cam1', 'translate', 0, 1, 10, 0)

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

#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', 4)

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('dome1', 'dome_mesh')
si.SetProperty3('dome1', 'rotate', 0, 0, 0)

#ObjectInstance
j=1
K=-5
bxname=[]
while(K<5):
bxname.append('cube'+str(j))
si.NewObjectInstance('cube'+str(j), 'cube_mesh')
si.SetProperty1('cube'+str(j), 'transform_order', 'ORDER_STR')
si.AssignShader('cube'+str(j), 'Blue_shader' )
si.SetProperty3('cube'+str(j), 'scale',1,3,1)
si.SetProperty3('cube'+str(j), 'translate',K,1.6,3)

K=K+1.75
j+=1

j=7
K=-3
while(K<5):
bxname.append('cube'+str(j))
si.NewObjectInstance('cube'+str(j), 'cube_mesh')
si.SetProperty1('cube'+str(j), 'transform_order', 'ORDER_STR')
si.AssignShader('cube'+str(j), 'ForestGreen_shader' )
si.SetProperty3('cube'+str(j), 'scale',1,3,1)
si.SetProperty3('cube'+str(j), 'translate',K-1,4.6,3)

K=K+1.75
j+=1

j=12
K=-2
while(K<5):
bxname.append('cube'+str(j))
si.NewObjectInstance('cube'+str(j), 'cube_mesh')
si.SetProperty1('cube'+str(j), 'transform_order', 'ORDER_STR')
si.AssignShader('cube'+str(j), 'Orange_shader' )
si.SetProperty3('cube'+str(j), 'scale',1,3,1)
si.SetProperty3('cube'+str(j), 'translate',K-1,7.6,3)

K=K+1.75
j+=1

j=16
K=-1
while(K<4):
bxname.append('cube'+str(j))
si.NewObjectInstance('cube'+str(j), 'cube_mesh')
si.SetProperty1('cube'+str(j), 'transform_order', 'ORDER_STR')
si.AssignShader('cube'+str(j), 'Coral_shader' )
si.SetProperty3('cube'+str(j), 'scale',1,3,1)
si.SetProperty3('cube'+str(j), 'translate',K-1,10.6,3)

K=K+1.75
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 bxname:
si.AddObjectToGroup('group1', i)

for i in bxname:
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', '../povsp8.fb')

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


Fujiyama Renderer | - | -

はじめてのFujiyama Renderer その24

球体を5つ並べてみました。くりかえし処理を使います。
sphereの X座標を変えていくことで、横に並びます。
povsp7.jpg
以下はPythonサンプルです。


#!/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', 45)

#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', 4)

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
X=-5
spname=[]

while (X<5):
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',X,0.75,0)
X=X+2
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', '../povsp7.fb')

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


Fujiyama Renderer | - | -

はじめての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()


Fujiyama Renderer | - | -

はじめての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 | - | -

はじめてのFujiyama Renderer その21

書籍「POV-Ray for Windows入門」を参考にしました。
くりかえし処理を利用して、らせん構造に球体を4185個生成しています。

カメラ画角を8にしました。
si.SetProperty1('cam1', 'fov', 8)
povsp5.jpg

si.SetProperty1('cam1', 'fov', 35)
地面floor位置をY軸-12に下げています。
povsp51.jpg

以下はPythonサンプルです。レンダリング時間は1分50秒でした。


#!/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 5 10 50 0 4 0
si.SetSampleProperty3('cam1', 'rotate', -5.68, 5.71, 0, 0) #4
si.SetSampleProperty3('cam1', 'translate', 5, 10, 50, 0) #4
si.SetProperty1('cam1', 'fov', 35)

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

si.NewLight('light2', 'SphereLight')
si.SetProperty3('light2', 'translate', -5, 0, 10)
si.SetProperty3('light2', 'scale', .5, .5, .5)
si.SetProperty1('light2', 'intensity', 1.25)
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', .2, .25, .3)

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
BaseIncAngle = 8

Limit = 360

AngleXY = -360

spname=[]

while (AngleXY <= Limit ):
RadXY=radians(AngleXY)

AngleXZ = 0

while (AngleXZ <= Limit):
RadXZ=radians(AngleXZ)

spname.append('sphere'+str(j))
si.NewObjectInstance('sphere'+str(j), 'sphere_mesh')
si.AssignShader('sphere'+str(j), 'sphere_shader' )
si.SetProperty3('sphere'+str(j), 'translate',cos(RadXZ) *2 * sin(RadXY) ,RadXY * 3.3 + RadXZ * 0.5,sin(RadXZ) *2 * sin(RadXY))
si.SetProperty3('sphere'+str(j), 'scale', 0.13,0.13,0.13)

AngleXZ = AngleXZ + BaseIncAngle
j+=1



AngleXY = AngleXY + BaseIncAngle





#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, -12, 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', 12, 12)

#Rendering
si.RenderScene('ren1')

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

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

Fujiyama Renderer | - | -

はじめてのFujiyama Renderer その20

「数学のいずみ」を参考にしました。ありがとうございます。
povsp4.jpg

球体によるばね状トーラス。'pixelsamples', 12, 12すると時間かかります。 レンダリング時間:1h 21m 15s
povsp40.jpg

以下はPythonサンプル。mathモジュール利用しています。


#!/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 16 12 0 0 0
si.SetSampleProperty3('cam1', 'rotate', -53.13, 0, 0, 0) #4
si.SetSampleProperty3('cam1', 'translate', 0, 16, 12, 0) #4
si.SetProperty1('cam1', 'fov', 23)

#Light
si.NewLight('light1', 'SphereLight')
si.SetProperty3('light1', 'translate', 0, 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', -5, 0, 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', .2, .25, .3)

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
spname=[]
MyCounter = -15*pi
while (MyCounter <= 15*pi):
spname.append('sphere'+str(j))
si.NewObjectInstance('sphere'+str(j), 'sphere_mesh')
si.AssignShader('sphere'+str(j), 'sphere_shader' )
si.SetProperty3('sphere'+str(j), 'translate', (3+0.9*cos(1.11*MyCounter))*cos(0.1*MyCounter),0.9*sin(1.11*MyCounter),(3+0.9*cos(1.11*MyCounter))*sin(0.1*MyCounter))
si.SetProperty3('sphere'+str(j), 'scale', 0.25,0.25,0.25)
MyCounter = MyCounter + 0.5
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, -1, 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', 12, 12)

#Rendering
si.RenderScene('ren1')

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

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


Fujiyama Renderer | - | -
1/2 >>