2011-12-29 127 views
1

我正在嘗試編寫一個Java3D應用程序,它模擬您在譜圖上看到的內容,例如:http://en.wikipedia.org/wiki/File:Spectrogram-19thC.png。我現在的主要困難是要弄清楚如何實際在平面上顯示振幅值,方法與譜圖相同:使用不同的顏色爲譜圖上的每個時頻座標((x,y)點)指定不同的強度。在Java3D中將不同顏色映射到平面上的點

這是我的代碼的當前版本。我的構造函數將包含時頻座標的二維數組作爲參數。我創建了一個代表光譜圖的平面,並在實際顯示幅度值時設置了一些for循環。我知道如何計算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. 

    } 
    } 


} 
} 

回答

2
+0

看完紋理映射後,它似乎不能很好地解決我的問題。紋理映射需要我先創建我想要的紋理圖像,然後將它們加載到Java3D中以應用於外觀對象。 – 2011-12-30 02:22:51

+0

我正在假設傳遞給構造函數的二維數組每次都會包含不同的時間和頻率值,所以我的幅度將會不同,因此我想要顯示的譜圖輸出(如我發佈的鏈接)會有所不同。因此,理想情況下,我希望能夠在應用程序運行時生成紋理圖像。我想我可以根據我接收到的任何時間頻率值事先創建紋理文件,然後將其應用於QuadArray,但我最好避免這種情況。 – 2011-12-30 02:36:04

+0

爲什麼不使用TextureLoader(BufferedImage bImage,String format,int flags)?是的,每次調用都創建紋理圖像。但嚴重的是,看着@trashgod的XYBlockRenderer答案,我會認爲這是切實可行的方法,除非Java3D的使用是必需的。 – alphazero 2011-12-30 03:04:48