2011-12-29 92 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