swizzle 対応ベクトル演算クラスが、
どのような機能を持つものなのか、実例を挙げながら概略をまとめます。
swizzle 対応ベクトル演算クラスとは、
次のようなスタイルの記述を可能にするものです。
記述例
vecC.xyzw() = vecA.xyzw() + vecB.xyzw() ;
xyzw の部分が swizzle 指定と呼ばれています。
この記述は、ベクトルの x y z w の各成分を並列に加算することを意味し、
具体的には次のような動作をします。
動作
vecC.x = vecA.x + vecB.x ;
vecC.y = vecA.y + vecB.y ;
vecC.z = vecA.z + vecB.z ;
vecC.w = vecA.w + vecB.w ;
swizzle 指定部には、x y z w を任意の順序に並べて記述できます。
例えば次のような記述も可能です。
記述例
vecC.wxy() = vecA.ywz() + vecB.zww() ;
動作
vecC.w = vecA.y + vecB.z ;
vecC.x = vecA.w + vecB.w ;
vecC.y = vecA.z + vecB.w ;
xyzw 以外にも rgba 表記の swizzle 指定が可能です。
記述例
vecC.rgba() = vecA.rgba() + vecB.rgba() ;
動作
vecC.r = vecA.r + vecB.r ;
vecC.g = vecA.g + vecB.g ;
vecC.b = vecA.b + vecB.b ;
vecC.a = vecA.a + vecB.a ;
xyzw と rgba 混在表記も可能です。
記述例
vecB.xyzw() = vecA.rgba() ;
動作
vecB.x = vecA.r ;
vecB.y = vecA.g ;
vecB.z = vecA.b ;
vecB.w = vecA.a ;
ベクトルとスカラが混在する表記も可能です。
記述例
動作
vecA.x /= vecA.w ;
vecA.y /= vecA.w ;
vecA.z /= vecA.w ;
専用の算術関数と組み合わせることで、複雑な演算を直感的に記述することが可能です。
記述例
float Result = Dot( Cross( vecA.xyz() , vecB.xyz() ) , vecC.xyz() );
動作
Result
= (rvecA.y * rvecB.z - rvecA.z * rvecB.y) * vecC.x
+ (rvecA.z * rvecB.x - rvecA.x * rvecB.z) * vecC.y
+ (rvecA.x * rvecB.y - rvecA.y * rvecB.x) * vecC.z ;
行列を扱うことも可能です。例えば、行ベクトルと 4x4 行列の積は、
次のように記述できます。
vecA.xyzw() = vecB.xyzw() * matB.m4x4() ;
3x3 行列として計算したい場合は、次のように記述します。
vecA.xyz() = vecB.xyz() * matB.m3x3() ;
次の例では、4x4 行列のうち、3x3 成分のみを転置しています。
matA.m3x3() = Transpose( matB.m3x3() );