やっと、なんとなくの基本が分かってきたところで、もう少し複雑な物体を作ってみようと思います。
今回 [超ど素人がRendarManをいじってみる~RIBファイルを作成編~]
(http://qiita.com/tagosaku324/items/6a900ea324baea70ae01)
で参考にさせてもらった
seesaawiki.jp
またまたお世話になりました。
複数の物体を作成
サンプルを作って実行してみました。# sample3.rib : sample3 rib file
Display "moving01.tiff" "file" "rgba"
Projection "perspective"
WorldBegin
Translate 0 0 2
Translate -1 0 0
Color [1 0 0]
Sphere 1 -1 1 360 # 赤色の球
Translate 1 0 0
Color [0 1 0]
Sphere 1 -1 1 360 # 緑色の球
WorldEnd
なんでくっついちゃうんだろう??
「Translateなどの変換は、最後に実行されたものが最初に図形に適用されます。」
緑色の球は「Traslate 1 0 0」→「Translate -1 0 0」→「Translate 0 0 2」の順
赤色の球は「Translate -1 0 0」→「Translate 0 0 2」の順
で変換が適用される。
適用される順に中心を考えると、
緑色の球の中心は(0,0,2)=(1+(-1)+0,0+0+0,0+0+2)、
赤色の球の中心は(-1,0,2)=(1+0,0+0,0+2)
になっちゃうんです。だから緑色の球体は中心が真ん中にきちゃうんです。
ってことは以下のようにすればいいはず!
# sample3.rib : sample3 rib file
Display "moving01.tiff" "file" "rgba"
Projection "perspective"
WorldBegin
Translate 0 0 2
Translate -1 0 0
Color [1 0 0]
Sphere 1 -1 1 360 # 赤色の球
Translate 2 0 0
Color [0 1 0]
Sphere 1 -1 1 360 # 緑色の球
WorldEnd
なった!けど、これ計算が大変じゃない??って思ったら、グループ化っていうことができることがわかりました。
# sample3.rib : sample3 rib file
Display "moving01.tiff" "file" "rgba"
Projection "perspective"
WorldBegin
# 全体を2だけ後ろを移動させる
Translate 0 0 2
TransformBegin # 現在の状況(座標系の)を保存
Translate -1 0 0
Color [1 0 0]
Sphere 1 -1 1 360 # 赤色の球
TransformEnd #保存した状況(座標系の)に戻す
TransformBegin # 現在の状況(座標系の)を保存
Translate 1 0 0
Color [0 1 0]
Sphere 1 -1 1 360 # 緑色の球
TransformEnd # 保存した状況(座標系の)に戻す
WorldEnd
同じ結果が得られます!
これで平行移動の変な計算はしなくてすみます。
さて、球体じゃなくて、楕円っぽくみえているのは
Projection "perspective"
の指定をしているからです。
平行投影("orthographic")をすると球体になるのですが、
シーン位置の問題がでてくるので、枠からはみ出ます。
# sample3.rib : sample3 rib file
Display "moving01.tiff" "file" "rgba"
# Projection "perspective"
Projection "orthographic"
WorldBegin
# 全体を2だけ後ろを移動させる
Translate 0 0 2
TransformBegin # 現在の状況(座標系の)を保存
Translate -0.5 0 0
Color [1 0 0]
Sphere 0.5 -1 1 360 # 赤色の球
TransformEnd #保存した状況(座標系の)に戻す
TransformBegin # 現在の状況(座標系の)を保存
Translate 0.5 0 0
Color [0 1 0]
Sphere 0.5 -1 1 360 # 緑色の球
TransformEnd # 保存した状況(座標系の)に戻す
WorldEnd
球体の半径を小さくすることで全体の枠内に収まるようにし、球体同士をくっつけるようにするために、Translateの移動を球体の半径と同じにしました。
綺麗に丸くなりました!
さぁ、応用だ!
変なのでーきた 今までの応用で組み合わせてみました。
初めて使ったのは
# 緑トーラス
Torus 1.7 0.2 360 0 360
トーラス(Torus)っていうのは簡単に言えばドーナツ型のことです。
中心は原点で
1番目、トーラスの半径
2番目、トーラスのチューブの半径
3番目、4番目、phiminとphimaxでチューブの出来る範囲
5番目、トーラスで出来る範囲=>[0-360]で設定360度にすれば1周する
# 水色円柱 半透明
AttributeBegin #属性グループ化
Opacity [0 0.5 0.5] #不透明度設定
Cylinder 2 1 -1 360
AttributeEnd #属性を戻す
Opacityは赤緑青のそれぞれに不透明度を設定できるものです。
不透明度の数値は0から1の間の実数で設定できます。
こういった指定をした場合、変更した属性が他の属性に影響しないようにするために
AttributeBegin~AttributeEndでここだけの指定をします。
Cylinderは円柱の指定です。
xy平面に平行に底面があり、z軸が高さ方向
1番目、円柱の半径
2番目、片側の底面
3番目、もう片側の面
4番目、側面
回転させることで、円柱とわかるようになります。
# 紫円錐
Rotate -90 1 0 0 #回転:angle, dx,dy,dz
Cone 1 0.5 360
Coneは円錐の指定です。
1番目、高さ
2番目、底面の半径
3番目、円錐の作られる範囲
高さはz軸方向に向いているので回転することで円錐だとわかるようになります。
# sample4.rib : sample4 rib file
Display "oden.tiff" "file" "rgba"
Projection "perspective"
# Projection "orthographic"
WorldBegin
# 全体を2だけ後ろを移動させる
Translate 0 0 2
# 赤球右
TransformBegin # 現在の状況(座標系の)を保存
Translate -0.5 0.5 0.5
Color [1 0 0]
Sphere 0.5 -0.5 1 360 #球:半径 上部高さ 下部高さ 描画範囲の角度
TransformEnd #保存した状況(座標系の)に戻す
# 赤球左
TransformBegin # 現在の状況(座標系の)を保存
Translate 0.5 0.5 0.5
Color [1 0 0]
Sphere 0.5 -0.5 1 360 # 球
TransformEnd # 保存した状況(座標系の)に戻す
# 黄色四角
TransformBegin # 現在の状況(座標系の)を保存
Translate 0 0 0
Color [1 1 0]
Polygon "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 ] #左上
TransformEnd # 保存した状況(座標系の)に戻す
# 水色円柱 半透明
AttributeBegin #属性グループ化
TransformBegin # 現在の状況(座標系の)を保存
Translate 0 0 2
Color [0 1 1]
Rotate -90 1 0 0 #回転
Opacity [0 0.5 0.5] #不透明度設定
#円柱:半径(radius) 底面z座標値(zmin) 上面z座標値(zmax) 側面(sweepangle)
Cylinder 2 1 -1 360
TransformEnd # 保存した状況(座標系の)に戻す
AttributeEnd #属性を戻す
# 紫円錐
TransformBegin # 現在の状況(座標系の)を保存
Translate 0 0.75 0
Color [1 0 1]
Rotate -90 1 0 0 #回転:angle, dx,dy,dz
#円錐:高さ(height) 底面の半径(radius) 円錐の作られる範囲(thetamax)
Cone 1 0.5 360
TransformEnd #保存した状況(座標系の)に戻す
# 緑トーラス
TransformBegin # 現在の状況(座標系の)を保存
Translate 0 -2 3
Color [0.2 0.5 0.2]
#トーラス(ドーナツ型):
#半径 チューブの半径 チューブ範囲(phimin) (phimax) トーラス範囲(thetamax)
Torus 1.7 0.2 360 0 360
TransformEnd # 保存した状況(座標系の)に戻す
WorldEnd
おでんを作ろうと最初は思ったんですけどね。。
複数の物体で何かできることはわかりました。