public SensorGnomonEcho(Transform3D transform,
			    double baseWidth,
			    double axisLength,
			    boolean enableLighting) {
	super() ;

	int FRONT  = 0 ;
	int BACK   = 1 ;
	int LEFT   = 2 ;
	int RIGHT  = 3 ;
	int TOP    = 4 ;
	int BOTTOM = 5 ;
	Point3f[] axes = new Point3f[6] ;
	float length = (float)axisLength ;

	axes[FRONT]  = new Point3f(0f, 0f,  length) ;
	axes[BACK]   = new Point3f(0f, 0f, -length) ;
	axes[LEFT]   = new Point3f(-length, 0f, 0f) ;
	axes[RIGHT]  = new Point3f( length, 0f, 0f) ;
	axes[TOP]    = new Point3f(0f,  length, 0f) ;
	axes[BOTTOM] = new Point3f(0f, -length, 0f) ;

	if (transform != null)
	    for (int i = FRONT ; i <= BOTTOM ; i++)
		transform.transform(axes[i]) ;

	float offset = (float)baseWidth / 2.0f ;
	Point3f[][] cube = new Point3f[6][4] ;

	cube[FRONT][0]  = new Point3f(-offset, -offset,  offset) ;
	cube[FRONT][1]  = new Point3f( offset, -offset,  offset) ;
	cube[FRONT][2]  = new Point3f( offset,  offset,  offset) ;
	cube[FRONT][3]  = new Point3f(-offset,  offset,  offset) ;

	cube[BACK][0]   = new Point3f( offset, -offset, -offset) ;
	cube[BACK][1]   = new Point3f(-offset, -offset, -offset) ;
	cube[BACK][2]   = new Point3f(-offset,  offset, -offset) ;
	cube[BACK][3]   = new Point3f( offset,  offset, -offset) ;

	if (transform != null)
	    for (int i = FRONT ; i <= BACK ; i++)
		for (int j = 0 ; j < 4 ; j++)
		    transform.transform(cube[i][j]) ;

	cube[LEFT][0]   = cube[BACK][1] ;
	cube[LEFT][1]   = cube[FRONT][0] ;
	cube[LEFT][2]   = cube[FRONT][3] ;
	cube[LEFT][3]   = cube[BACK][2] ;

	cube[RIGHT][0]  = cube[FRONT][1] ;
	cube[RIGHT][1]  = cube[BACK][0] ;
	cube[RIGHT][2]  = cube[BACK][3] ;
	cube[RIGHT][3]  = cube[FRONT][2] ;

	cube[TOP][0]    = cube[FRONT][3] ;
	cube[TOP][1]    = cube[FRONT][2] ;
	cube[TOP][2]    = cube[BACK][3] ;
	cube[TOP][3]    = cube[BACK][2] ;

	cube[BOTTOM][0] = cube[BACK][1] ;
	cube[BOTTOM][1] = cube[BACK][0] ;
	cube[BOTTOM][2] = cube[FRONT][1] ;
	cube[BOTTOM][3] = cube[FRONT][0] ;

	int v = 0 ;
	Point3f[] vertices = new Point3f[72] ;

	for (int i = 0 ; i < 6 ; i++) {
	    vertices[v++] = cube[i][0] ;
	    vertices[v++] = cube[i][1] ;
	    vertices[v++] = axes[i] ;
	    vertices[v++] = cube[i][1] ;
	    vertices[v++] = cube[i][2] ;
	    vertices[v++] = axes[i] ;
	    vertices[v++] = cube[i][2] ;
	    vertices[v++] = cube[i][3] ;
	    vertices[v++] = axes[i] ;
	    vertices[v++] = cube[i][3] ;
	    vertices[v++] = cube[i][0] ;
	    vertices[v++] = axes[i] ;
	}

	int vertexFormat ;
	Material m = new Material() ;
	m.setCapability(Material.ALLOW_COMPONENT_READ) ;
	m.setCapability(Material.ALLOW_COMPONENT_WRITE) ;

	if (enableLighting) {
	    vertexFormat =
		GeometryArray.COORDINATES | GeometryArray.NORMALS ;
	    m.setLightingEnable(true) ;
	}
	else {
	    vertexFormat = GeometryArray.COORDINATES ;
	    m.setLightingEnable(false) ;
	}

	TriangleArray ta = new TriangleArray(72, vertexFormat) ;
	ta.setCoordinates(0, vertices) ;

	if (enableLighting) {
	    Vector3f v0 = new Vector3f() ;
	    Vector3f v1 = new Vector3f() ;
	    Vector3f[] normals = new Vector3f[72] ;

	    for (int i = 0 ; i < 72 ; i += 3) {
		v0.sub(vertices[i+1], vertices[i]) ;
		v1.sub(vertices[i+2], vertices[i]) ;

		Vector3f n = new Vector3f() ;
		n.cross(v0, v1) ;
		n.normalize() ;

		normals[i] = n ;
		normals[i+1] = n ;
		normals[i+2] = n ;
	    }
	    ta.setNormals(0, normals) ;
	}

	Appearance a = new Appearance() ;
	a.setMaterial(m) ;
	a.setCapability(Appearance.ALLOW_MATERIAL_READ) ;
	a.setCapability(Appearance.ALLOW_MATERIAL_WRITE) ;

	TransparencyAttributes tra = new TransparencyAttributes() ;
	tra.setCapability(TransparencyAttributes.ALLOW_MODE_READ) ;
	tra.setCapability(TransparencyAttributes.ALLOW_MODE_WRITE) ;
	tra.setCapability(TransparencyAttributes.ALLOW_VALUE_READ) ;
	tra.setCapability(TransparencyAttributes.ALLOW_VALUE_WRITE) ;
	ta.setCapability
	    (TransparencyAttributes.ALLOW_BLEND_FUNCTION_READ) ;
	ta.setCapability
	    (TransparencyAttributes.ALLOW_BLEND_FUNCTION_WRITE) ;

	a.setTransparencyAttributes(tra) ;
	a.setCapability(Appearance.ALLOW_TRANSPARENCY_ATTRIBUTES_READ) ;
	a.setCapability(Appearance.ALLOW_TRANSPARENCY_ATTRIBUTES_WRITE) ;

	setGeometry(ta) ;
	setAppearance(a) ;

	setCapability(ALLOW_APPEARANCE_READ) ;
	setCapability(ALLOW_APPEARANCE_WRITE) ;
    }