3.12 Transformation modifiers
Transformaion modifiers はインターフェイスのどの要素でも移動(move)、縮尺(scale)あるいは回転(rotate)の変換を可能にする、線形変換を行うために使用するステートメントです。
それはシェイプとsolid、シェーダそしてエリアライト(球体そして平面)に関係があります。
これらの変換は構造体中の記述にそれらが現れる順番に処理されます。
それは例えば、それを移動させる前に回転させるためには、rotate指令はtranslate指令の前に与えられなければならないことを意味します。
5つの指令が変換を操作します。
3.12.1 Rotation
rotation はx、yそしてz軸回りに要素の位置を回転します。
回転の量はそれぞれの軸に度で指定します。
回転の方向は続く左手の法則です。
「左手を上げて、そして回転軸の正の方向へ親指を向けます。指は回転の正方向の方向に巻き付くでしょう。同様に軸の負の方向に親指を向ければ、指は回転の負方向に巻き付くでしょう。」
シンタックスは:
Rotate vector R
or
Rotate (float x, float y, float z)
or
Rotate (vector A, float n)
最初のケースでは、回転はベクトルRの要素に応じて行われます。
2番目のケースでは、回転はx、yそしてzの値に応じて行われます。
最後のケースでは、回転はAで指定された軸回りにn度で行われます。(y軸回りの回転にはAは(0,1,0)でなければなりません)
Example:
Shape [ Box((-1,0,2), (1,2,-2)) Rotate(-45, 0, 60) ]
3.12.2 Scaling
scaling は各座標軸に与えられた量により要素のサイズを変えます。
不規則なスケーリングは要素を引き伸ばすかあるいは押し潰すために使用されます。
あるものより大きな値はその軸上で要素を引き伸ばし、一方あるものより小さな値はそれを押し潰すために使用されます。
scaling は常にカレントの要素のサイズの相対値です。
もしその要素がScaleを使って以前にリサイズされていたなら、この指令は新しいサイズとの相対でサイズを決定します。
多数のスケール値が使用されるかもしれません。
0のスケールは使用してはいけません。
これは無意味な事で、そして内部エラーを起こさせることが出来ます。
スケーリングを必要としない要素のためには、1を使用しなければなりません。
可能なシンタックスは:
Scale vector S
or
Scale (float x, float y, float z)
最初のケースでは、Sの3つの要素はスケーリングの各x、y、z方向の量になります。
2番目のケースでは、スケーリングはx、y、zの値の応じて行われます。
Example:
Shape [ Box((-1,0,2), (1,2,-2)) Scale(2.5, 1, 0.5) ]
3.12.3 Translation
Translationはx、y、zのそれぞれで指定されたユニット数によってカレント位置から相対的に要素を移動させます。
Translations は常に要素の移動前の位置に対して相対値です。
0による移動はその軸上に要素を変化しないままにして置くでしょう。
可能なシンタックスは:
Translate vector T
or
Translate (float x, float y, float z)
最初のケースでは、Tで指定された3つの要素はx、y、z方向の各移動ユニット数を指定します。
2番目のケースでは、移動がx、y、zの値に従って行われます。
Example:
Shape [ Box((-1,0,2), (1,2,-2)) Translate(50, 10, 0) ]
3.12.4 Shear
別の軸の上の位置に比例する量による、1つの軸に沿った線形の剪断スケール。典型的な剪断アプリケーションはイタリック体の文字で見ることができます。
The syntax is:
Shear (float yx, float zx, float xy, float zy, float xz, float yz)
定義における軸の手紙のオーダーが描写的である、例えば、xyは位置yの量のxy倍のそばで指示xに沿って剪断するのを意味します。
典型的には、引数のうち1つあるいは2つだけが0ではないでしょう。
定義中の軸文字の順序は記述的です、例えば、xy はy位置のxyの量によるx方向にそった剪断を意味します。
この種の変形の3つの部分に気付きます。ひとつはyとzの値と共にxを 剪断し、ひとつはyとxの値と共にzを剪断し、ひとつはxとyの値と共にzを剪断します。
Example:
Shape [ Box((-1,0,2), (1,2,-2)) Shear(0.5, 0, 1, 0, 0, 0) ]
3.12.5 Transformation matrix
transformation matrix の明示的な詳細が要素のために使用されることを可能にします。
4x4のマトリクスはカンマで区切られた16のfloatの式の1セットを表します。
この指令は剪断のような、それ以上の一般的なtransformation 効果を可能にする事に注意してください。
シンタックスは:
Transform (a, b, c, d,
e, f, g, h,
i, j, k, l,
m, n, o, p)
Example:
Shape [ Box((-1,0,2), (1,2,-2)) Transform(0.5,0,0,0, 0,1,0,0, 0,0,1,0,
0,0,0,1) ]
3.12.6 Transformation stack
変換の集合はtransformationスタックと呼ばれるひとつの構造のなかに集められる事か可能です。
transformationスタックもまた宣言されて、そしてtransformation定義で再利用されることが可能です。
シンタックスは:
TransformationStack [list of transformation modifiers]
この構造体に含まれるtransformation指令は常にそれらにリストされている順番に処理されます。
Example:
Declare TS1 = TransformationStack [ Scale(...) Translate(...) Scale(...)
Rotate(...) ]
Shape [ ImplicitSurface(...) Shader [ ... ] TS1 ]
それは同じ様にコールされる構造体から修飾可能です。
Shape [ ImplicitSurface(...) Shader [ ... ] TS1 [ Translate(...)
] ]
このケースでは、付加された Translate 指令はTS1の中に含まれるそれらの後に処理されるでしょう。