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.
}
}
}
}
텍스처 매핑을 읽은 후에도 문제가 해결되지 않은 것처럼 보입니다. 텍스처 매핑을 사용하려면 미리 원하는 텍스처 이미지를 만든 다음 Java3D에로드하여 Appearance 객체에 적용해야합니다. –
나는 생성자에 전달 된 2D 배열이 매번 다른 시간과 주파수 값을 포함 할 것이라는 가정하에 작업 중이므로 내 진폭이 달라서 내가 표시 한 스펙트로 그램 출력 (게시 한 링크 에서처럼) 다를 것입니다. 따라서 응용 프로그램이 실행될 때 텍스처 이미지를 생성 할 수 있어야합니다. 나는 내가 얻은 시간 값을 기초로 텍스쳐 파일을 미리 만들어서 QuadArray에 적용하여이 문제를 해결할 수 있다고 생각하지만, 나는 그것을 피하는 것이 이상적입니다. –
TextureLoader를 사용하지 않는 이유 (BufferedImage bImage, String format, int flags)? 그리고 예, 호출 당 텍스처 이미지를 만듭니다. 그러나 진지하게, @trashgod에 대한 XYBlockRenderer 응답을 보면 Java3D 사용이 요구 사항이 아니라면 갈 수있는 실용적인 방법이라고 생각합니다. – alphazero