2011-12-29 3 views
1

http://en.wikipedia.org/wiki/File:Spectrogram-19thC.png과 같은 스펙트로 그램에서 볼 수있는 것을 에뮬레이션하는 Java3D 애플리케이션을 작성하려고합니다. 필자의 가장 큰 어려움은 스펙트로 그램과 같은 방식으로 평면에 진폭 값을 실제로 표시하는 방법을 파악하는 것입니다 : 스펙트럼 그래프에서 각기 다른 시간 - 주파수 좌표 ((x, y) 지점)에 대해 서로 다른 색상을 사용하여 서로 다른 색상을 지정합니다 .Java3D에서 비행기의 점에 다른 색상으로 매핑

다음은 현재 코드의 버전입니다. 내 생성자는 시간 - 주파수 좌표를 포함하는 2D 배열을 인수로 취합니다. 스펙트로 그램을 나타내는 평면을 만들고 실제로 진폭 값을 표시 할 때 사용할 루프를 설정합니다. 저는 2D 평면에서 각 점의 진폭 값을 계산하는 방법을 알고 있고 진폭 값의 범위를 색상으로 할당하는 방법을 알고 있습니다 (아직 이들을 코딩하지는 않았지만).

내 주요 문제는 비행기 자체에 이러한 색상을 표시하는 것입니다. Java3D에서는 사용자가 Appearance, ColoringAttributes 및 Color3f 클래스를 사용하여 전체 객체에 색상을 지정할 수 있지만 객체의 다른 점에 다른 색상을 매핑하는 예는 보지 않았습니다. 이는 내가하고 싶은 일입니다. 비행기를 구성하는 각 픽셀의 색상을 제어 할 수 있기를 원하며, 파랑, 빨강 등을 완전히 만드는 대신, 그 점에 대해 계산 한 진폭 값에 따라 각 픽셀을 다르게 색칠 할 수 있습니다.

Java3D에서 가능하면 누구에게 알리십니까? 그렇다면 어떻게 할 수 있는지 또는 그것을 다루는 자원에 대한 링크가 있으면 크게 환영 할 것입니다. 나는 Java3D에 상당히 익숙하다. 그래서 어떤 조언도 훌륭 할 것이다.

Java3D에서이 작업을 수행하려는 동기는 궁극적으로 2D 평면을 사용하여 (즉, 3D 이미지를 만들기 위해 2D 스펙트로 그램을 스태킹하여) 시공간 시간 - 주파수 그래프를 생성하는 것입니다.

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에로드하여 Appearance 객체에 적용해야합니다. –

+0

나는 생성자에 전달 된 2D 배열이 매번 다른 시간과 주파수 값을 포함 할 것이라는 가정하에 작업 중이므로 내 진폭이 달라서 내가 표시 한 스펙트로 그램 출력 (게시 한 링크 에서처럼) 다를 것입니다. 따라서 응용 프로그램이 실행될 때 텍스처 이미지를 생성 할 수 있어야합니다. 나는 내가 얻은 시간 값을 기초로 텍스쳐 파일을 미리 만들어서 QuadArray에 적용하여이 문제를 해결할 수 있다고 생각하지만, 나는 그것을 피하는 것이 이상적입니다. –

+0

TextureLoader를 사용하지 않는 이유 (BufferedImage bImage, String format, int flags)? 그리고 예, 호출 당 텍스처 이미지를 만듭니다. 그러나 진지하게, @trashgod에 대한 XYBlockRenderer 응답을 보면 Java3D 사용이 요구 사항이 아니라면 갈 수있는 실용적인 방법이라고 생각합니다. – alphazero

1

당신은 또한 XYBlockRenderer을 포함하는 JFreeChart 볼 수 있습니다. 임의의 컬러 팔레트는 herehere으로 표시된 적절한 PaintScale을 사용하여 구성 할 수 있습니다.

관련 문제