Rendering学習日記

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

Structure Synthのtriangle

Structure Synthのtriangleは、templateでの出力には、対応していない。

triangleを使って、pyramidを作る。x軸周りに-90回転、y軸方向に8倍したruleを定義。


// Write EisenScript code here...
rule pyramid {
triangle[0,0,0;1,0,0;0.5,0.5,0.5]
triangle[1,0,0;1,1,0;0.5,0.5,0.5]
triangle[1,1,0;0,1,0;0.5,0.5,0.5]
triangle[0,1,0;0,0,0;0.5,0.5,0.5]
}


rule p2 { { y 4 s 3 8 3 rx -90 color green} pyramid
}
p2
5 * { x 5 }p2

{y -1 s 100 1 100 color white }box


pyramid.png

template出力した。RIBを編集する。
いろいろ、工夫次第です。


ObjectBegin "bbox"
Polygon "P" [0 0 0 1 0 0 0.5 0.5 0.5]
Polygon "P" [1 0 0 1 1 0 0.5 0.5 0.5]
Polygon "P" [1 1 0 0 1 0 0.5 0.5 0.5]
Polygon "P" [0 1 0 0 0 0 0.5 0.5 0.5]
ObjectEnd

Bxdf "PxrDisney" "obj1_mat1" "color baseColor" [0.1 0.4 0.6]
TransformBegin
ConcatTransform[ 3 0 0 0 0 0 -3 0 0 8 0 0 19 0.5 18 1]
ObjectInstance "bbox"
TransformEnd


ありがとうございます。
prmanからの出力、4つのPxrRectLight使用。
structuresynth06.jpg


Structure Synth and RenderMan24.3
structuresynth04.jpgpyramid.png
  • -
  • -

Structure Synth

オープンソースのStructure SynthからRenderMan RIBを出せるようにちょっとやってみた。
http://structuresynth.sourceforge.net/

市松模様づくり参考に試してみました。
http://kyle-in-jp.blogspot.com/2009/07/structure-synth_10.html
RenderMan RIBも出力できるようにテンプレート調整してみた。
structuresynth_.jpg

こちらの記事も参考にしてみた。
http://shin-ishimaru.cocolog-nifty.com/blog/2009/03/structure-syn-1.html
structuresynth2.jpg
地面のレンダリングがずれてしまうので、RIBのTransformをいじってみた。
TransformBegin
Translate 0 -1 0
Scale 300 1 300
#ConcatTransform[ 300 0 0 0 0 1 0 0 0 0 300 0 -149.5 -1 -149.5 1]
ObjectInstance "box"
TransformEnd

RenderMan24.4でレンダリングしました。
ライトは4つ。
Light "PxrRectLight" "light4" "color lightColor" [1 1 1] "float intensity" [3] "float exposure" [0.5] "int traceLightPaths" [1]
ishimaru2.jpg


デフォルトのデータは、こんな感じ
structuresynth.jpg

ということで、カメラ周りは逆行列を求めないといけないので、
python cgkitを使って、ConcatTransformを求めてみました。
以下は、テンプレート抜粋

#placecam.py {CamPosX} {CamPosY} {CamPosZ} {CamTargetX} {CamTargetY} {CamTargetZ}
#up {CamUpX} {CamUpY} {CamUpZ}
# cgkit commandline
# V=mat4(1).lookAt(pos=({CamPosX}, {CamPosY}, {CamPosZ}),target=({CamTargetX}, {CamTargetY}, {CamTargetZ}),up=({CamUpX}, {CamUpY}, {CamUpZ}))
# vt=(V.inverse()).transpose()
# fov {fov}
Scale -1 1 1
ConcatTransform [{CamColumnMatrix}]


ConcatTransform [{CamColumnMatrix}]部分は逆行列にしないとダメなんで、Structure SynthからExportした後、
以下python2.7のインタラクティブモードで、

from cgkit.all import *
V=mat4(1).lookAt(pos=(7.83552, 12.4411, 18.2554),target=(7.92488, -46.149, -34.0976),up=(-0.170831, 0.656364, -0.734849))
vt=V.inverse()
print("ConcatTransform ["+'{:.6f}'.format(vt[0][0])+' '+'{:.6f}'.format(vt[1][0])+' '+'{:.6f}'.format(vt[2][0])+' '+'{:.6f}'.format(vt[3][0])+' '+'{:.6f}'.format(vt[0][1])+' '+'{:.6f}'.format(vt[1][1])+' '+'{:.6f}'.format(vt[2][1])+' '+'{:.6f}'.format(vt[3][1])+' '+'{:.6f}'.format(vt[0][2])+' '+'{:.6f}'.format(vt[1][2])+' '+'{:.6f}'.format(vt[2][2])+' '+'{:.6f}'.format(vt[3][2])+' '+'{:.6f}'.format(vt[0][3])+' '+'{:.6f}'.format(vt[1][3])+' '+'{:.6f}'.format(vt[2][3])+' '+'{:.6f}'.format(vt[3][3])+' '+"]")

求めてみた。
以前、出力の順番を間違えていたので修正しました。ありがとうございます。
structuresynth0.jpg
  • -
  • -

Lightflow Rendering Tool C API for Linux 2018/10

2018/10/22記述
2020/5/12更新

LightflowのC APIについて、動いたLinux distributionを調べました。

Fedora28(64bit)をインストールしたノートパソコン(2012年 W255HPW)にVirtualBox5.2.20をインストール。

32bitのLinuxをいくつかインストールしました。
Lightflow C APIが動いたのは、
VineLinux2.6(include python1.5, gcc2.95)
VineLinux3.2
VineLinux4.0
VineLinux4.2
VineLinux5.2
CentOS5.11
ここまで、画面が800*600で狭いのが難点。

Fedora32(64bit)にGnome Boxesを入れ、
Fedora-8-i386をインストール。
python1.5,gcc2.95,Lightflow動きました。
Lightflow C APIも動きました。
Linuxは、gccが4.1.2のディトりビューションが良いみたいです。
2020/5/12追記

動かなかったのは、
Scientific Linux6 i386
Fedora28 32bit

//** インストール方法
http://www.python.org/download/releases/1.5/
Python 1.5.2 sources (2.5 MB)をダウンロード
■python1.5.2をインストール。
$ ./configure
$ make
# make altinstall

■さらに次のファイルをダウンロードします。
compat-libstdc++-6.2-2.9.0.14.i386.rpm
http://rpm.pbone.net/index.php3/stat/4/idpl/14760/com/compat-libstdc++-6.2-2.9.0.14.i386.rpm.html

■gcc-2.95.3をインストール。
インストール先のディレクトリを作成しておく。
# mkdir /usr/local/gcc-2.95
$ ./configure --prefix=/usr/local/gcc-2.95 --enable-languages=c,c++
$ make
# make install
確認
$ /usr/local/gcc-2.95/bin/g++ --version
2.95.3

■Lightflowのダウンロード
Lightflowのサイトから
http://www.lightflowtech.com/

Linux RedHat 6.1 Version (1608 Kb)
lf_redhat.tgzをダウンロードします。
/home/ユーザ/Lightflow
で解凍します。

.bash_profileまたは.bashrcに記入
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/Lightflow
PYTHONPATH=$PYTHONPATH:$HOME/Lightflow
LIGHTFLOWPATH=$HOME/Lightflow
LIGHTFLOW_SE_MEMORY=32000
LIGHTFLOW_VE_MEMORY=32000

export LD_LIBRARY_PATH PYTHONPATH LIGHTFLOWPATH LIGHTFLOW_SE_MEMORY LIGHTFLOW_VE_MEMORY

以下を実行するとpython1.5でレンダリングできました。
Examples]$ python1.5 ball1.py


■C APIの設定。
http://www.knoerig.de/lightflow_en.html
「Rudi's Homepage - Lightflow」を参考にincludeファイルをダウンロードします。

$ mkdir simplescene
includeファイルを置きます。

C++-libraryをシンボリックリンクします。
# ln -s /home/ユーザ/Lightflow/libLightflow.so /usr/lib

以下Makefile


CC = /usr/local/gcc-2.95/bin/g++
INCLUDE=-I ./include
LNK = -lLightflow
CNV = convert

all: ball.jpg

ball.jpg: ball.tga
$(CNV) ball.tga ball.jpg

ball.tga: simplescene
simplescene

simplescene: main.cpp
$(CC) $(INCLUDE) $(LNK) main.cpp -o simplescene





main.cpp


#include < Lightflow/LfLocalSceneProxy.h >
#include

int main()
{
// create a new proxy
LfLocalSceneProxy *s = new LfLocalSceneProxy();
// this is a container object for storing the arguments passed to
// the renderer via the proxy
LfArgList list;

// define a light
list.Reset();
list << "position" << LfVector3(-4,-7,6);
list << "color" << LfVector3(450*1.0,450*1.0,450*0.8);
LfInt light = s->NewLight("soft",list);
s->LightOn(light);

// define a material (standard material, there are others)
list.Reset();
// ambient color
list << "ka" << LfColor(0,0,0.5);
// reflection color
list << "kc" << LfColor(1,0.5,0.5);
// diffuse reflection factor
list << "kd" << 0.5;
// specular reflection smoothness (0-polished,1-plastic)
list << "km" << 0.1;
// surface displacement
// LfInt is a long int representing a handle
LfInt plastic = s->NewMaterial("standard",list);

// define a sphere object
s->MaterialBegin(plastic);
list.Reset();
list << "radius" << 1.0;
LfInt ball = s->NewObject("sphere",list);
s->AddObject(ball);
s->MaterialEnd();

// specify the output object
list.Reset();
list << "file" << "ball.tga";
LfInt saver = s->NewImager("tga-saver",list);

// specify the rendering context
s->ImagerBegin(saver);
list.Reset();
// camera position
list << "eye" << LfPoint(0,-4,0);
// point to aim at
list << "aim" << LfPoint(0,0,0);
LfInt camera = s->NewCamera("pinhole",list);
s->ImagerEnd();

// start rendering
s->Render(camera,300,300);

delete s;
return 0;
}

一時的にPATHを通しても良いです。
$ export PATH=/usr/local/gcc-2.95/bin:$PATH

makeします。
$ make simplescene
$ ./simplescene
Lightflow Rendering Tools
Copyright (c) 1995-2000 by Jacopo Pantaleoni. All rights reserved

Pinhole Camera On
Objects : 1
LfSoftLight::Init()
00:00:00 - cell 418176 / 418176

Rendering 300 x 300 pixels
00:00:00 - 87.1%

$ convert ball.tga ball.jpg
$ eog ball.jpg
ball.jpg

Lightflowを設定していくことで、Linuxの勉強になりました。
ありがとうございます。
  • -
  • -
<< 4/184 >>