在Java3D中将不同颜色映射到平面上的点

在Java3D中将不同颜色映射到平面上的点,java,java-3d,Java,Java 3d,我正在尝试编写一个Java3D应用程序,它模拟您在频谱图上看到的结果,例如:。我现在的主要困难是弄清楚如何以与光谱图相同的方式在平面上实际显示振幅值:使用不同的颜色为光谱图上的每个时频坐标((x,y)点)指定不同的强度 这是我的代码的当前版本。我的构造函数将包含时频坐标的2D数组作为参数。我创建了一个表示光谱图的平面,并设置了一些循环,以便在实际显示振幅值时使用。我知道如何计算2D平面上每个点的振幅值,并且知道如何将振幅值的范围指定给颜色(尽管我还没有对这些进行编码) 我的主要问题是在飞机上显示

我正在尝试编写一个Java3D应用程序,它模拟您在频谱图上看到的结果,例如:。我现在的主要困难是弄清楚如何以与光谱图相同的方式在平面上实际显示振幅值:使用不同的颜色为光谱图上的每个时频坐标((x,y)点)指定不同的强度

这是我的代码的当前版本。我的构造函数将包含时频坐标的2D数组作为参数。我创建了一个表示光谱图的平面,并设置了一些循环,以便在实际显示振幅值时使用。我知道如何计算2D平面上每个点的振幅值,并且知道如何将振幅值的范围指定给颜色(尽管我还没有对这些进行编码)

我的主要问题是在飞机上显示这些颜色。虽然Java3D允许用户为整个对象指定颜色(使用外观、ColoringAttributes和Color3f类),但我还没有看到任何将不同颜色映射到对象上不同点的示例,这正是我想要做的。我希望能够控制构成平面的每个像素的颜色,这样我就可以根据我为该点计算的振幅值对每个像素进行不同的着色,而不是使其完全变成蓝色、红色等

有人知道这在Java3D中是否可行吗?如果是这样的话,我们将非常感谢您就如何实现这一目标提出建议,或者与处理这一问题的资源建立链接。我对Java3D相当陌生,所以任何建议都很好

我应该补充一点,我在Java3D中这样做的动机是最终使用2D平面生成时空时频图(即,叠加2D光谱图以创建3D图像)

import java.util.*;
导入java.applet.applet;
导入java.awt.BorderLayout;
导入java.awt.Frame;
导入java.awt.event.*;
导入java.awt.GraphicsConfiguration;
导入javax.vecmath.*;
导入javax.media.j3d.*;
导入com.sun.j3d.utils.universe.*;
导入com.sun.j3d.utils.applet.*;
导入com.sun.j3d.utils.behaviors.vp.*;
公共类DrawTimeFrequencyGraph扩展小程序{
公共绘图TimeFrequencyGraph(浮点[][]timeFrequencyArray){
/*创建场景图所需的Canvas3D和BranchGroup对象*/
setLayout(新的BorderLayout());
图形配置配置=
SimpleUniverse.getPreferredConfiguration();
Canvas3D Canvas3D=新的Canvas3D(配置);
添加(“中心”,canvas3D);
BranchGroup场景=新建BranchGroup();
/*创建二维平面以表示图形
*注意:(x,y,z)坐标目前是硬编码的,但应进行设置
*在二维阵列中反映最小和最大频率和时间值的步骤*/
四元数组时频图=新的四元数组(4,GeometryArray.坐标);
设置坐标(0,新点3F(-10f,0f,0f));
设置坐标(1,新点3f(0f,0f,0f));
设置坐标(2,新点3f(0f,3f,0f));
设置坐标(3,新点3f(-10f,3f,0f));
/*设置平面的外观,即使用各种颜色设置平面上的图形值*/
对于(int i=0;i
纹理映射:

您还可以查看,其中包括一个。可以使用合适的
PaintScale
构建任意调色板,参考和。

阅读纹理贴图后,似乎这并不能完全解决我的问题。纹理映射要求我事先创建所需的纹理图像,然后将它们加载到Java3D以应用于外观对象。我的工作假设是,每次传递给构造函数的2D数组将包含不同的时间和频率值,因此,我的振幅将不同,因此我想要显示的光谱图输出(如我发布的链接中所示)将不同。因此,理想情况下,我希望能够在应用程序运行时生成纹理图像。我想我可以根据接收到的时间频率值预先创建纹理文件,然后将其应用于Quadraray,但我希望最好避免这种情况。为什么不使用TextureLoader(BuffereImage双图像、字符串格式、int标志)?是的,每次调用创建纹理图像。但说真的,看看@trashgod的答案,我会认为这是一种切实可行的方法,除非Java3D的使用是必需的。
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.

   }
  }


 }
}