前: アンチエイリアステクスチャ 次: 便利なクラス

6. Texture2D クラスと Texture3D クラス

Texture2D クラスと Texture3D クラスを完全に解説する準備が整いました。以下は、サブクラスで提供できる(あるいは、提供する必要がある)メソッドすべてのリストです。

public MyTexture()
public MyTexture(DataInputStream in, Scene theScene) throws IOException, InvalidObjectException
すべての Texture は2つのコンストラクタを提供します。はじめのコンストラクタにはアーギュメントがなく、すべてのパラメータを初期化してデフォルト値にします。これは Texture オブジェクトの新規作成時に使います。2番目のコンストラクタは第4章で解説したように、保存した Texture を修復するときに使います。このメソッドは InvalidObjectException を投げることを宣言されることに注意してください。これは、DataInputStream から読み出された情報が期待と一致しないときに投げられます。例えば、共通のプラクティスが、バージョン番号付きで保存されている representation(訳注: 画像?)を始めようとしているとします。このように、後で Texture プラグインを変更して、もっと調整可能なパラメータを追加する可能性が少しでもある場合、保存されたその Texture が対応するバージョンが何なのかを、いつでも識別でき、それを適切に読み出しできます。もしバージョン番号が、あなたのプラグインがどう扱っていいのか分からない値の場合(恐らく、ファイルがプラグインのより最近のバージョンで作られているので)、InvalidObjectException を投げます。
public void writeToFile(DataOutputStream out, Scene theScene) throws IOException
このメソッドは上述の2番目のコンストラクタの写しで、DataOutputStream にパラメータ値を保存します。定義したほかのパラメータと同じく、Texture の名前を確実に保存してください。これは getName() メソッドで取得でき、 setName() メソッドで設定できます。
public static String getTypeName()
このメソッドはこの Texture クラスを記述した文字列を返します。クラス名と同じくすることができます(そうする必要があるわけではありません)。これは「新規のテクスチャ」ウインドウでテクスチャのタイプのメニュー内に表示されるテキストです。
public boolean bumpMapped()
このメソッドは、この Texture が凹凸マッピングを使うかどうかを指定します。「偽」(false) を返した場合、この Texture には凹凸マッピングをしません。また、getTextureSpec()で返された bumpGrad の値は無視されます。このメソッドのデフォルトの実装は偽を返します。凹凸マッピングを使いたいときは「真」(true) を返すよう、オーバーライドする必要があります。
public TextureParameter[] getParameters()
このメソッドはこの Texture について、頂点ごとのテクスチャパラメータのセットを記述します。ユーザがオブジェクト編集ウインドウの「テクスチャ...」メニューアイテムを選択すると、これらのパラメータの値を編集できます。このメソッドのデフォルトの実装は null を返し、この Texture に頂点ごとのパラメータがないことを知らせます。TextureParameter クラスのコンストラクタは以下です。
public TextureParameter(Object owner, String name, float minVal, float maxVal, float defaultVal)
owner は、このパラメータが所属する Texture です。ここは常に this と設定してください。name はパラメータの名前です。minVal と maxVal は、このパラメータで可能な範囲を与えます。 defaultVal はデフォルト値を与えます。
public void getTextureSpec(TextureSpec spec, double x, double y, double xsize, double ysize, 
        double t, float param[])
public void getTextureSpec(TextureSpec spec, double x, double y, double z, double xsize, 
        double ysize, double zsize, double t, float param[])
このメソッドは第2章で解説したように、表面プロパティを計算します。はじめのフォームは Texture2D 用で、2番目は Texture3D 用です。spec に戻った値は、 (x, y, z) で中央寄せされた幅 (xsize, ysize, zsize) の領域にわたって平均化されます。t は時間(秒)で、param は頂点ごとのパラメータの値を、getParameters() で返されたものと同じ順番で格納します。

注意: param は null かもしれません。テクスチャを割り当てられたオブジェクトが頂点ベースではないとき(例: 球や円柱)、こうなります。この場合は、すべてのパラメータにデフォルト値を使いましょう。また param が、getParameters() で返された要素の数 よりも多く の要素を含むこともあり得ます。この場合、パラメータ値は配列の最初にあり、追加的な要素は無視されます。

public void getTransparency(RGBColor transparent, double x, double y, double xsize, double ysize, 
        double t, float param[])
public void getTransparency(RGBColor transparent, double x, double y, double z, double xsize, 
        double ysize, double zsize, double t, float param[])
このメソッドは、透明色のみを計算すること以外は getTextureSpec() と同じです。このメソッドが返す色は、同じ点について getTextureSpec() が返す透明色と同じはずです

このメソッドが必要な理由はなんでしょう。結局 getTextureSpec() でも同じ情報が得られます。答えは、レンダーがずっと速い、ということです。Raytracer があるオブジェクト上のある点が可視だと決定したら、このメソッドはシーン内のすべての光源について「影の光線」をなぞり、何かに遮られているかどうかを判断します。影の光線は頻繁に、シーンのレンダーに関係するすべての光線のうち、大部分の原因となります。そして影の光線が当たるすべてのオブジェクトの透明度を決定します。これは getTextureSpec() を呼び出せばできますが、とても無駄が多くなります。透明度のみを計算する別のメソッドを持つことで、レンダー時間を大幅に減らせます。

public double getDisplacement(double x, double y, double xsize, double ysize, 
        double t, float param[])
public double getDisplacement(double x, double y, double z, double xsize, 
        double ysize, double zsize, double t, float param[])
このメソッドは表面上のある点について、置換の高さを計算します。このメソッドのデフォルトの実装は NaN を返します。これはレンダラーに、置換マッピングを使わないよう信号を送ります。テクスチャに置換マッピングを使うのであれば、このメソッドをオーバーライドする必要があります。
public abstract void getAverageSpec(TextureSpec spec)
このメソッドは getTextureSpec() に似ていますが、特定の点で表面プロパティを計算するのではなく、表面全体にわたる平均プロパティを返します。このメソッドは多くの用途に使われます(インタラクティブなシーン編集機能でオブジェクト全体に描く色の決定、ほかのソフトのファイル形式でシーンを書き出すときなど)。正確な数学的平均である必要はなく、テクスチャの見映え全体の合理的な表現を与えます。
public void edit(Frame fr, Scene sc)
このメソッドは第4章での解説と同じく、ユーザがテクスチャを編集できるウインドウを表示します。fr は Dialog の親として使われる Frame です。sc は この Texture が一部を成す Scene です。テクスチャにイメージマップを利用するとき必要になります。
public Texture duplicate()
このメソッドは、パラメータ値がこれと同一の Texture となる、新規の Texture を返します。
public boolean usesImage(ImageMap image)
このメソッドは、Texture が特定のイメージマップを使うと「真」(true) を返します。Texture がそのシーンから使っている ImageMap を、ユーザが削除できないようにするために必要です。デフォルトの実装では「偽」(false) を返します。Texture が(直接的または、ImageOrColor や ImageOrValue オブジェクトを通して間接的に)ImageMap を使っている場合は、このメソッドをオーバーライドしてください。

メソッド、たくさんありますね。全部で13個で、このいくつもをときどき書き忘れてしまいます。幸いほとんどが単純で書きやすいものです。しかし edit() と getTextureSpec() だけは、大抵は時間がとてもかかります。

前: アンチエイリアステクスチャ 次: 便利なクラス