私は、このようなスペクトログラムに表示される内容をエミュレートするJava3Dアプリケーションを作成しようとしています。http://en.wikipedia.org/wiki/File:Spectrogram-19thC.png。私の主な難しさは、スペクトログラムと同じように、実際に飛行機に振幅値を表示する方法です:スペクトログラム上の各時間 - 周波数座標((x、y)点)ごとに異なる色を使用して、 。Java3Dでプレーン上の点に異なる色をマッピングする
ここに私のコードの最新バージョンがあります。私のコンストラクタは、時間 - 周波数座標を含む2D配列を引数としてとります。スペクトログラムを表す平面を作成し、実際に振幅値を表示するときに使用するループをいくつか設定します。私は、2D平面上の各点の振幅値を計算する方法を知っていて、振幅値の範囲を色に割り当てる方法について考えています(まだこれらをコード化していませんが)。
私の主な問題は、これらの色を飛行機自体に表示することです。 Java3Dでは、ユーザーが(Appearance、ColoringAttributes、Color3fクラスを使用して)オブジェクト全体の色を指定できるようになっていますが、異なる色をオブジェクト上の異なる点にマッピングする例はありませんでした。私は平面を構成する各ピクセルの色を制御できるように、完全に青、赤などにするのではなく、その点について計算した振幅値に応じて各ピクセルを異なる色にすることができます。
Java3Dでこれが可能かどうかは知りませんか?そうであれば、それをどうやってやり遂げることができるか、それを扱うリソースへのリンクがあれば、大いに感謝します。私はJava3Dをかなり新しくしているので、どんなアドバイスも素晴らしいだろう。
Java3Dでこれを行うための私の動機は、最終的に2D平面を使用して(すなわち、2Dスペクトログラムを積み重ねて3D画像を作成する)時空間時間 - 周波数グラフを生成することです。
import java.util.*;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.event.*;
import java.awt.GraphicsConfiguration;
import javax.vecmath.*;
import javax.media.j3d.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.applet.*;
import com.sun.j3d.utils.behaviors.vp.*;
public class DrawTimeFrequencyGraph extends Applet {
public DrawTimeFrequencyGraph (float [][] timeFrequencyArray) {
/* Create the Canvas3D and BranchGroup objects needed for the scene graph */
setLayout(new BorderLayout());
GraphicsConfiguration config =
SimpleUniverse.getPreferredConfiguration();
Canvas3D canvas3D = new Canvas3D(config);
add("Center", canvas3D);
BranchGroup scene = new BranchGroup();
/* Create a 2D plane to represent the graph
* Note: The (x, y, z) coordinates are currently hardcoded, but should be set up
* to reflect the min and max frequency and time values in the 2D array */
QuadArray timeFrequencyGraph = new QuadArray(4, GeometryArray.COORDINATES);
timeFrequencyGraph.setCoordinate(0, new Point3f(-10f, 0f, 0f));
timeFrequencyGraph.setCoordinate(1, new Point3f(0f, 0f, 0f));
timeFrequencyGraph.setCoordinate(2, new Point3f(0f, 3f, 0f));
timeFrequencyGraph.setCoordinate(3, new Point3f(-10f, 3f, 0f));
/* Set up the appearance of the plane i.e. graph values on it using various colors */
for(int i = 0; i < timeFrequencyArray.length; i++){
for(int j = 0; j < timeFrequencyArray[i].length; j++){
/* TO DO: Calculate amplitude values, map them to colors and figure out how to
* map the colors to points on the plane that has been created.
}
}
}
}
テクスチャマッピングを読み込んだら、私の問題を解決できないようです。テクスチャマッピングでは、事前に必要なテクスチャイメージを作成してからJava3DにロードしてAppearanceオブジェクトに適用する必要があります。 –
私は、コンストラクタに渡される2D配列に毎回異なる時間と周波数の値が含まれることを前提にしているので、振幅が異なるため、表示するスペクトログラムの出力が(リンクのように)違います。したがって、アプリケーションの実行時にテクスチャイメージを生成できるのが理想的です。私は、私が受け取った時間周波数の値に基づいてテクスチャファイルを事前に作成し、それをQuadArrayに適用することでこれを回避できると思いますが、それを避けるのが理想的です。 –
TextureLoader(BufferedImage bImage、String format、int flags)を使用しないのはなぜですか?そして、はい、呼び出しごとにテクスチャ画像を作成します。しかし真剣に、@trashgodのXYBlockRendererの答えを見ると、Java3Dの使用が必要条件でない限り、それが実用的な方法だと思うでしょう。 – alphazero