チュートリアル2「siren のクラス」

siren では、3次元形状(シェイプ)を扱うためにいくつかの型が存在します。ここでは、最低限知っていればいいものだけを紹介したいと思います。


Array クラス(XYZ型)

3次元幾何演算を行う上で、もっともよく用いられる X, Y, Z の値をひとまとめにしたものを、siren では Array クラスのオブジェクトとして扱います。 Array クラスは、siren 独自のものではなく、Ruby が標準的に提供している配列クラスです。

X, Y, Z の値をひとまとめにしたオブジェクトですが、上記のように座標値を表わしたり、大きさを表わしたり、色々な用途に用いられます。 このチュートリアルでは、X, Y, Z の値を持つオブジェクトを通常の配列としての Array クラスのオブジェクトと区別するために、XYZ 型と表記する場合があります。

Vec クラス

ベクトルクラスは、XYZ 型のように X, Y, Z の値を保持する機能のほか、各種ベクトル演算を行うことができます。

ベクトルでは、次のことが可能です。

  • ベクトルの大きさを求める、正規化する
  • ベクトルの拡縮や回転
  • ベクトル同士の演算(和・差)
  • 2つのベクトルの外積、内積を求める
  • 2つのベクトルの角度を求める、また、平行、直行などを判定する

全てのメソッドについての解説は、リファレンスマニュアルを参照してください。また、本チュートリアルで登場するメソッドは必要に応じてその都度解説しますので、このまま読み進めていただいても構いません。

なお、Ruby の matrix ライブラリにある Vector クラスとは別物ですのでご注意ください。


Shape クラス

Shape クラスは、シェイプ(形状を持つ物体)を表現するクラスです。シェイプとは、線であったり、曲面であったり、時には箱の形をしているかもしれません。 次の例では、ボックス(箱)を作っています。

Shape クラスは、myshape = Shape.new という風に、それ自身からインスタンスを作ることができません。シェイプは例のように Siren モジュールなどによって生成することができ、その生成結果を受け取って、扱う役目が Shape クラスです。

生成したシェイプは、次のように計算メソッドを呼んだり、

シェイプを使って、新たな他のシェイプを作成することができます。


shapetype メソッド

Shape クラスには、shapetype という属性値があります。これはシェイプの幾何タイプを示す ReadOnly な値です。

ボックスを作成した際に、siren Shell に表示されている結果を見てみると @type=SOLID という文字列が見てとれます。また、次のようにすると明示的にシェイプの幾何タイプを受け取ることができます。

shapetype は整数値の番号で表現されます。番号の意味は次のとおりです。

番号 幾何タイプ 解説
0 COMPOUND コンパウンド 全てのシェイプを内包できるタイプです。ファイルシステムでいう「フォルダ」に相当します。
1 COMPSOLID コンポジット・ソリッド 現在のところ使用しません。
2 SOLID ソリッド 閉じたシェルからなる中身が詰まったシェイプです。シェルによってシェイプの内側と外側が明確に分けられているため、容積計算ができます。
3 SHELL シェル 複数のフェイスが切れ目なく一つにまとまったシェイプです。
4 FACE フェイス 閉じたワイヤーを境界に持つ曲面タイプです。平面も含まれています。
5 WIRE ワイヤー 複数のエッジが切れ目なく一つにまとまったシェイプです。
6 EDGE エッジ 曲線タイプです。直線も含まれています。
7 VERTEX バーテックス 点タイプです。
8 SHAPE シェイプ 0から7番までのいずれかのタイプを示すための概念的なタイプです。明示的にシェイプを作ったら、0から7番のいずれかになり、このタイプになることはありません。主にメソッドの引数として用いられる値です。

shapetype

Shape クラスによって、抽象化された型で扱うことができ、普段は shapetype を気にすることなくコーディングすることができます。現在扱っているオブジェクトの幾何タイプを明示的に意識する必要がある場合、この shapetype 属性を用います。

例えば、上の表にも記載しているとおり、容積計算を行うにはシェイプが SOLID でなければなりません。 また、

のように、一部のメソッドは幾何タイプを限定している場合あります。shell メソッドは、複数のフェイスをつなぎ合わせてシェルを生成するメソッドであり、フェイス以外の幾何タイプを持つオブジェクトを渡すことができません。自分が扱っているオブジェクトが何か分からない状態で shell のようなメソッドを呼び出すケースはあまりないかもしれませんが、

というように、安全にチェックすることが出来ます。


内包する形状を取得するメソッド


幾何タイプ別の特異メソッド

Ruby には、クラスメソッド、インスタンスメソッドのほか、個々のインスタンスに定義が可能な特異メソッドという機能があります。 siren では、幾何タイプに応じて Shape クラスのインスタンスに特異メソッドを定義し、各機能を提供しています。

実際に次のコードを見てください。

例に登場する sp メソッドは、曲線の始点の座標値を返すメソッドです。例中の box も line も同じ Shape クラスのインスタンスですが Shape 内部の幾何タイプに応じて、拡張で呼び出せるメソッドが増えるわけです。

そのメソッドがインスタンスに対して定義されているかどうかは、例のように respond_to? メソッドで呼び出したいメソッド名を用いて 判定するか、shapetype メソッドで幾何タイプを判別します。


その他の Shape クラスのメソッド

前項までに、siren 上で大切な shapetype(幾何タイプ) と explore (内部構造の探索)メソッドについて解説しました。 これらの概念的な部分さえ理解していれば、その他の Shape クラスのインスタンスメソッドはすごく簡単で、意味のとおりの挙動をします。

移動・回転・拡縮・鏡面反転

各トランスフォーメーション(変形)メソッドには、シェイプ自身を変更する破壊的メソッドと自身を変更せず変更結果をシェイプとして返す非破壊的メソッドの2種類があります。

バウンダリーボックス

バウンダリーボックスとは、現在の座標系(後述)のX軸、Y軸、Z軸において、それぞれシェイプが存在する領域を表わすものです。 BndBox という名前のクラスで表現され、Shape クラスの bndbox によってそのシェイプのバウンダリーボックスを取得できます。

BndBox クラスには、Vec クラス型の minmax というメソッドが存在します。 この例において、X軸について見てみると、スフィアは -5 から 5 の領域に存在している事が分かります。

バウンダリーボックスは、シェイプの大きさや位置を厳密に求める必要がない場合に活用することができます。

さらにその他の Shape クラスのメソッドについては、リファレンスマニュアルを参照してください。


Siren モジュール

Siren モジュールは、

  • 指定された情報からあらゆるシェイプを生成する
  • 指定された情報を用いて解析や計算をする

の2つの目的を担っています。前述のクラスと違って、ほとんどが関数的な呼び出しだけで利用することができる為、 あまり踏み込んだ解説をしなくとも理解できると思います。

詳しいモジュールに関する情報は、リファレンスマニュアルを参照してください。