3.9 Shape modifiers

 
シェイプの修飾はそのシェイプに個々のオペレーションを行うため、あるいは指定された属性を設定するあるいは変更するために使用する、Shape構造体(あるいはSolid構造体)内の命令文です。
回転、縮尺、移動 etc. のような一次変換を行う修飾もまたシェイプの修飾と見なされます、しかし類別は変形修飾です、なぜならそれらはエリア光源とシェーダにも適応できるからです。
どのようなシェイプ修飾定義も、結果としてのsolidにこれらの変更を設定するために、Solid構造体に適応可能です。
これらのシェイプ修飾は土台となるシェイプに作用し、そしてそれらが定義のどこに現れるかに関わらずどのような他のシェイプ修飾より前に適用されます。


3.9.1 Bound

 
Bound は多項式サーフェイスそして陰関数サーフェイスのような複雑なサーフェイスで良好な境界を定義するために提供されます。
これは同じく、光線がサーフェイスと交差するかどうかを決定することの処理の速度を上げる能率的な方法です。
なぜならbound は、オブジェクトは単純な想像上のシェイプによって完全に囲まれていることをレンダラに知らせるので、それが理由になります。

光線を追跡する時、光線は最初にこの単純なbounding boxに対してテストされます。
もしそれがbounding boxにぶつかるなら、光線はより複雑なオブジェクト内部に対してそれ以上のテストをします。それ以外ではでは全体の複雑なシェイプは省略されます、そしてそれは大いにレンダリング速度を上げます。
Boundで定義される見えないbounding box はカレントのオブジェクト座標系で指定されます。
サーフェイスは常にこのbounding box中に存在するでしょう。
Box指令のように、Bound指令は、2つの対角線の方向の反対側のコーナーの長方形の想像上のボリューム定義です、それはx,y,そしてz軸に揃えられたエッジを持ちます。
シンタックスは:

Bound (point corner1, point corner2)
 
もしcorner1が前-下-左のbounding boxコーナーを定義したのなら、cornner2は後-上-右コーナーでなければなりません。

bound使用サーフェイス定義例:
Shape [
    ImplicitSurface(y - 0.2 * log(x^2 + 2.0 * z^2))
    Bound((-2,-2,-2), (2,2,2))
]


3.9.2 Render bound


サーフェイスの選択された部分のみをレンダリングするために、u/v範囲の最小と最大値を調整する事を可能にします。
シンタックスは:

RenderBound (float umin, float vmin, float umax, float vmax)
 
全ての値はNURBS以外は、0.0 と 1.0 の間に含まれたいなければなりません。
umin は umax より小さくなければならず、vmin は vmax より小さくなければなりません。

サーフェイスの定義でこの指令を使用する例については、セクション3.8.12のParametricSurface指令を参照してください。


3.9.3 Shading attributes

 
8ビットのフラグをセットすることで各サーフェイスで行われるシェーディングの調整が可能です。
シェーディングフラグの各ビット値は次のような意味を持ちます:

bit   値  種類          注釈
 0    1   影投影        もしonならサーフェイスは影を投影。
 1    2   影受け        もしonなら他オブジェクトからの影はこのサーフェイスに生成。
 2    4   反射チェック  もしonならサーフェイスの反射がテストされる。
 3    8   屈折チェック  もしonならサーフェイスの屈折がテストされる。
 4   16   u/v チェック  もしonならレンダラは各点のuv座標を計算する。
 5   32   法線チェック  もしonならレンダラはライトの方に向かうポイントの不正な法線をはじく
 6   64   2-sided       もしonならライティングはサーフェイスの両面について行う(基本は法線)
 7  128  スムーズサーフェイス もしonならNURBS/BicubicPatch/ParametricSurfaceはスムーズ。


ビット7は NURBS, BicubicPatch and ParametricSurface プリミティブにのみ関係します。
デフォルトでは全てのシェイプは値が63のシェーディング属性を持ちます。(ビット0から5がon)
シンタックスは:

ShadingAttributes int flag

例えば、もしフラグに35が設定されていたなら、このサーフェイスの反射、屈折そしてu/v座標がoffになります、なぜならビット2,3と4は0がセットされるからです。
それがシェイプ修飾なら、ShadingAttributes指令はそれが指定されたシェイプにのみ影響を与えるだけです。


3.9.4 Shape subdivisions

 
一般的にシェイプの細分の量はレンダリングの品質を3つのケースで決定します。

-レンダリングモードが「陰線消去」あるは「OpenGL」が選択された時。
これは全てのシェイプに影響します、なぜならそれらは全てポリゴンに変換されるからです。

-BicubicPatch, NURBSそしてParametricSurfaceのように、シェイプが内部的に三角形セットとして格納された時。

-ImplicitSurface, Blobby,  ImplicitPlanarHeightField, ImplicitSphericalHeightField, PolynomialSurface, SurfaceOfRevolution, etc、のように、シェイプが陰関数あるいは多項式関数に基いている時。

これらのケースでは、ShapeSubdivisions はサーフェイスの全体を覆うためのポリゴンの数を調整することを可能にします。
細分数がより高いと最終的な出力はよりスムーズになります、しかしもちろんレンダリングにはより長く掛かります。
blobby、多項式関数、陰関数の等値面(isosurface)のレンダリングの近似値を抽出しサーフェイスを分離します。

シンタックスは:
 
ShapeSubdivisions (int u, int v)
or
ShapeSubdivisions (int u, int v, int w)
 
一般的に:
u はプリミティブの周囲(経度)あるいはx軸に沿っての細分数を記述します。
v はプリミティブに沿って(緯度)あるいはy軸に沿っての細分数を記述します。
w はz軸に沿っての細分数を記述します。この値はほとんどいつも、blobby、陰関数、多項式によって使用されます。

サーフェイス定義でこの指令の使用例に関しては、セクション3.8.12のParametricSurface指令を参照してください。


3.9.5 Root solver

 
4次方程式を解くために、VirtuaLightインターフェイスは4つの手法を提供します。
専門的には、4次サーフェイスは光線でせいぜい4つの交点を持てるに過ぎません。
これらの方法はこれらの交点を決定するために使用されます。
品質か速度かの調整が可能で、どちらを希望するかを指定します。

Ferrariの方法は最速ですが、数の不正確さのためサーフェイスに座瘡を発生させます。
これは時に "digital zits" と呼ばれ、黒いドットのように見えます。
FerrariSolver指令はそれを表します。

Vientaの方法は速度と正確さの間の良い折衷案です。
それがデフォルトでこれがしばしば使用される理由です。
VientaSolver指令はそれを表します。

最後の方法はSturmシーケンスと呼ばれます。
それは最も遅いけれども、最も正確で、最高の品質を必要とする時に使用されるべきです。
SturmSolver指令はそれを表します。

Sturmシーケンスを使用した場合でさえ、全ての多項式サーフェイスは全ての指示によって正確にはレンダリングされない事はしばしば起こります、
ただ多項式の次数が上がるにつれて、サーフェイスを正しくレンダリングするために必要とされる数の正確さも上がると言う事を念頭に置く必要があります。


3.9.6 Caustics

 
オブジェクトに caustic 属性を与える二つの方法があります、シェイプ修飾としてあるいはサーフェイス記述内、です。
シェイプ修飾としての場合は、この属性は修飾されるシェイプにのみ関係することを意味します。
サーフェイス記述としての場合は、この特徴は自動的にこのサーフェイスを含むシェーダを使用する全てのオブジェクトに属性付けられることを意味します。
さらにこの属性は、もし問題のサーフェイスが反射(Kr)あるいは/そして屈折(Kt)プロパティを含むなら、そしてもしPhotons指令が設定されたなら、その時のみ効果を表すだけでしょう。

シンタックスは:
 
Caustics float density
or
Caustics (float density, InternalCaustics)

densityパラメータはサーフェイスのフォトンの密度を設定します、それはPhotons指令(セクション3.5.7)の2番目の引数のローカルなバージョンです。
値は0.0から1.0の間に含まれていなければなりません。
Photonsの2番目の引数が0に設定されるとしても、値は絶対に要求されます。
より大きな値はそのサーフェイスに関して相対的により多くのフォトン(サーフェイスとメディア)を生成します。
InternalCausticsは透明のシェーダに時々有用です、なぜならそれはレンダラに可能な限りの全体の内部反射光のcausticsを計算する事を強いるからです。


3.9.7 Displacement mapping

 
Displacementマッピングは VirtuaLight 内のシェイプ修飾として実装されています。
基本的に2種類の式がこの指令で使用することが可能です。
シンタックスは:

DisplacementMapping (vector)
or
DisplacementMapping (float)

もしベクトル式が与えられたなら、レンダラはサーフェイス内の各頂点をはこの式の結果と置き換えるでしょう。
もし浮動小数点式が与えられたなら、それは法線の方向に沿ってサーフェイスを、式で与えられたものの総計と置き換えるでしょう。
テクスチャマッピングに応じてDisplacementマッピングを生成するために、PixelHeight関数もインターフェイスに追加されました。
シンタックスは:

 PixelHeight(ImageFile definition, point coord, int tile)

そのシンタックスは他のイメージマッピング関数(セクション3.13.4.5参照)と同じです、しかしPixelHeightはイメージマップの評価されたピクセルの高さを返します。
DisplacementMappingに送られたこの高さは、displace効果を実行します。

重要:

-シェイプ修飾指令 ShapeSubdivisionsがサーフェイスのDisplacement効果の詳細さのレベルをコントロールします、
大部分のケースで、それは良好な結果のためにかなり高く設定されるべきです。
しかしながら高い値は最終的なDisplacementを達成するために、より多くのリソース(メモリとレンダリング時間)を必要とします。

-DisplacementマッピングはBox、Polygon、三角形パッチのシェイプには効果がありません、また陰関数と多項式ベースのシェイプも同様です。
Displacementの結果はこれらのシェイプにより作成されたどのようなSolidにも計算されないでしょう。

Example showing the use of PixelHeight with DisplacementMapping:

Shape [
  Sphere((0, 1.5, 0), 1.5)
  DisplacementMapping (N*(PixelHeight(ImageFile("moon.tga", NORMALIZED), (u, 0, v)))*0.001)
  ShapeSubdivisions(128,128)
  MoonShader
]


3.10 Particle system

 
VirtuaLight インタフェースは次に述べる、運動のシンプルな規則による幾つかの自然な効果をシミュレートを可能にする、シンプルなパーティクルシステムを提供します。
基本的にこれらの規則はその速度に基いてオブジェクトのポジションを増加させ、そしてなんらかの加速によりその速度を増加させ、その加速はなんらかの固定点からオブジェクトまでの距離によってあるいはシーン中の他のオブジェクトから発せられたそれが受けた力によってそれはコントロールされます。

レンダラの全てのクロックの動作において、パーティクルは移動して、相互作用がチェックされて、そしてそれに従ってコントロール用の変数は修正されます。
このパーティクルシステムはたぶんインターフェイスの将来のリリースで改良されるだろうと言う事に注意してください。

このパーティクルシステムについて理解するためのふたつの情報があります:パーティクルジェネレータと、そしてパーティクル放射です。
ジェネレータはパーティクル束を産出します、それはこの瞬間にそれ自身の初期特性(initial properties)を受け取ります。
言葉を変えれば、それはコントロールしようとするパーティクルに自然な規則を設定することです。

シーン内でのジェネレータの数に制限はありません。
パーティクルはかつてジェネレータにより放射された、定義されたシェイプです。
それは誕生から死までジェネレータによるコントロール下にあります、そして続く規則の定義により移動します。
単一のジェネレータのパーティクルの数に制限はありません。
パーティクルシステムは、アニメーションが有効の時にのみ展開することが可能です。
アニメーションタイミングの調整の仕方についてはセクション3.3を参照してください。

パーティクルシステムで使用されるどの変数も、new 宣言リクエストで宣言されなければなりません。(詳細はセクション3.1.3参照)

同じ様に、ジェネレータ内で使用される幾つかの実行時変数はセクション3.2でリストされます。

Age    float   パーティクルの年齢
P      point   パーティクルの位置
x,y,z  floats  パーティクルの位置を表現している point の構成要素
V      vector  パーティクルの速度


これらの値はパーティクルの死の状態をチェックする時、そしてパーティクルの加速度を計算する時の二つの状況で使用されます。

ParticleSystem 指令はジェネレータを作成します。
シンタックスは:

ParticleGenerator [
    Shape string name
    Aging float ag
    Acceleration vector acc
    Velocity vector vel
    Location point loc
    Particles int count
    Birth conditional_expression_true/false
    Death conditional_expression_true/false
    CollisionDetection conditional_expression_true/false
]

ShapeとAgingを除く全ての指令の引数は式として取り扱う事が可能です。
それらの値はある条件に応じて変化させる(時間で)事が可能である事を意味します。
Shape指令はパーティクルのラッパー指定です。
name引数は、Declareあるいは静的リクエストで既に宣言されたシェイプの名前を参照します。
このシェイプはパーティクルとして使用されるでしょう。
solidもまたパーティクルとして使用されるべきです。

Agingは全てのフレームのためにどのくらいの時間が経過するかを決定します。
それぞれのパーティクルは age が 0 で開始し、それぞれのフレームの後に age はこの値でインクリメントされます。
より短い値はパーティクルの動作を遅くします。
この指令はオプションです。デフォルトではこの値は1.0がセットされます。

Accelerationは単位時間当たりの速度の変化率を示します。
このベクトルはしばしば重力をシミュレート(重力の加速度)するために使用されます。
この指令はオプションです。デフォルトではこのベクトルは(0,0,0)がセットされます。

Velocityはパーティクルの初期の運動の速さを示します。
パーティクルの速度(実行時変数 V)は毎フレーム後に決まったやり方によって更新されます。
V = V + Age * Acceleration
この指令はオプションです。デフォルトではこのベクトルは (0,0,0)がセットされます。

Locationはワールド座標内でのパーティクルの初期位置を決定します。
パーティクルの位置(実行時変数 P)は毎レーム後に決まったやり方によって更新されます。
P = P + Age * V
この指令はオプションです。デフォルトではこのポイントは(0,0,0)がセットされます。

Particlesはジェネレータが放射しなければならないパーティクルの数を設定します。
もしいずれかの組込関数がパーティクルジェネレータ内で velocity ベクトル、accelaration ベクトルあるいは location ポイントを決定するのに使用されていたなら、この関数により返されるおのおのの異なる値は、異なるパーティクルに割当てられるでしょう。
この指令はオプションです。デフォルトではこのカウントは1と等しい値です。

Birthはパーティクルがいつ生まれるかを定義する式を格納します。
この指令はオプションです。
デフォルトの birth の状態は、最初のフレームでのみパーティクルを生成します。

Deathはパーティクルがいつ死ななければならないかを定義する式を格納します。
式の結果が1(true)の時、パーティクルは死にます。
この指令はオプションです。
デフォルトのDeathの状態は、パーティクルは死ぬことはありません(false)。

CollisionDetection はそれがシーン内でパーティクルがシェイプに衝突するかどうか見るためにすべてのフレームの前に、パーティクルの位置がチェックされるかどうか定義する式を格納します。 
もしそうならパーティクルはサーフェイスからバウンドするでしょう。
式の結果が1(true)の時、パーティクルの衝突検知は有効です。
この指令はオプションです。デフォルトではCollisionDetection の状態は決してパーティクルをバウンドさせません。

パーティクルシステムの例:
ParticleGenerator [
    Shape "boucingball"
    Aging 0.15
    Location(0, 10, 0)
    Acceleration(0, -5, 0)
    Velocity 3*fBm((0, 0, 0), (0.6, 0.6, 0.6))
    CollisionDetection((Age >= 1.0) ? 1 : 0)
    Death((V[1] < 0.0 && y < -0.1) ? 1 : 0)
    Particles 50
]




next