There are actually a couple of things to note in this net. First, the
Isosurface result needs to be passed through AutoColor; otherwise it gets a
default color that is a light blue, irrespective of the data range from
which the isosurface was extracted. Keep in mind that you'd expect the
isosurface to be a constant color, since (by definition) the data is
constant across the surface.
The second is that the input is a single cube. Therefore, each face of
the cube, extracted by ShowBoundary, is a single quad. ShowBoundary, on
unstructured volumetric data, figures out surface normals so that it
results in a shaded surface by averaging the face normals to get normals at
the vertices. Therefore, averaging the normals at the corners, it
results in a *very* bad approximation of a sphere. You can fix that by
putting FaceNormals on the output of ShowBoundary.
Finally, Furthermore, colors are only defined at the vertices. Since
each face is a big quad, the colors in the face are interpolated in color
space, where the max value is assigned red and the min value is assigned
blue. Midway between red (1 0 0) and blue (0 0 1) is (.5 0 .5). The
isosurface, though, is taken at 0, and the color assigned to itcomes from
the color map, where 0 is mapped to blue-green. So it doesn't match the
color at the same location on the boundary. You can cause it to subdivide
the boundary faces in data space before colormapping by using the Refine
module. If you do so, you get a boundary surface that matches the
isosurface.
Here's a modified net - I changed the data file name, so you'll have to
switch it back.
Greg
//
// time: Tue Nov 20 11:39:18 2001
//
// version: 3.1.2 (format), 4.1.3 (DX)
//
//
// MODULE main
// workspace: width = 643, height = 615
// layout: snap = 0, width = 50, height = 50, align = NN
//
macro main(
) -> (
) {
//
// node Selector[4]: x = 29, y = 481, inputs = 7, label = Selector
// input[1]: defaulting = 0, visible = 0, type = 32, value = "Selector_4"
// input[2]: defaulting = 0, visible = 0, type = 32, value = "boundary"
// input[3]: defaulting = 0, visible = 0, type = 29, value = 1
// input[4]: defaulting = 1, visible = 1, type = 16777248, value = {
"boundary", "boundary w/ quad edges", "isosurface" }
// input[5]: defaulting = 1, visible = 0, type = 16777245, value = { 1, 2,
3 }
// output[1]: visible = 1, type = 29, value = 1
// output[2]: visible = 1, type = 32, value = "boundary"
//
//
// node Selector[3]: x = 16, y = 321, inputs = 7, label = Selector
// input[1]: defaulting = 0, visible = 0, type = 32, value = "Selector_3"
// input[2]: defaulting = 0, visible = 0, type = 32, value = "yes"
// input[3]: defaulting = 0, visible = 0, type = 29, value = 2
// input[4]: defaulting = 1, visible = 1, type = 16777248, value = { "no",
"yes" }
// input[5]: defaulting = 1, visible = 0, type = 16777245, value = { 1, 2 }
// output[1]: visible = 1, type = 29, value = 2
// output[2]: visible = 1, type = 32, value = "yes"
//
//
// node Selector[5]: x = 4, y = 171, inputs = 7, label = Selector
// input[1]: defaulting = 0, visible = 0, type = 32, value = "Selector_5"
// input[2]: defaulting = 0, visible = 0, type = 32, value = "face"
// input[3]: defaulting = 0, visible = 0, type = 29, value = 2
// input[4]: defaulting = 1, visible = 1, type = 16777248, value = {
"vertex", "face" }
// input[5]: defaulting = 1, visible = 0, type = 16777245, value = { 1, 2 }
// output[1]: visible = 1, type = 29, value = 2
// output[2]: visible = 1, type = 32, value = "face"
//
//
// node Import[1]: x = 203, y = 13, inputs = 6, label = Import
// input[1]: defaulting = 0, visible = 1, type = 32, value = "toon.dx"
//
main_Import_1_out_1 =
Import(
main_Import_1_in_1,
main_Import_1_in_2,
main_Import_1_in_3,
main_Import_1_in_4,
main_Import_1_in_5,
main_Import_1_in_6
) [instance: 1, cache: 1];
//
// node ShowBoundary[1]: x = 44, y = 79, inputs = 2, label = ShowBoundary
//
main_ShowBoundary_1_out_1 =
ShowBoundary(
main_Import_1_out_1,
main_ShowBoundary_1_in_2
) [instance: 1, cache: 1];
//
// node FaceNormals[1]: x = 132, y = 172, inputs = 1, label = FaceNormals
//
main_FaceNormals_1_out_1 =
FaceNormals(
main_ShowBoundary_1_out_1
) [instance: 1, cache: 1];
//
// node Switch[2]: x = 59, y = 245, inputs = 3, label = Switch
//
main_Switch_2_out_1 =
Switch(
main_Selector_5_out_1,
main_ShowBoundary_1_out_1,
main_FaceNormals_1_out_1
) [instance: 2, cache: 1];
//
// node Refine[1]: x = 182, y = 286, inputs = 2, label = Refine
// input[2]: defaulting = 0, visible = 1, type = 1, value = 5
//
main_Refine_1_out_1 =
Refine(
main_Switch_2_out_1,
main_Refine_1_in_2
) [instance: 1, cache: 1];
//
// node Switch[3]: x = 89, y = 368, inputs = 3, label = Switch
//
main_Switch_3_out_1 =
Switch(
main_Selector_3_out_1,
main_Switch_2_out_1,
main_Refine_1_out_1
) [instance: 3, cache: 1];
//
// node ShowConnections[2]: x = 183, y = 387, inputs = 1, label =
ShowConnections
//
main_ShowConnections_2_out_1 =
ShowConnections(
main_Switch_3_out_1
) [instance: 2, cache: 1];
//
// node Collect[2]: x = 174, y = 456, inputs = 2, label = Collect
//
main_Collect_2_out_1 =
Collect(
main_Switch_3_out_1,
main_ShowConnections_2_out_1
) [instance: 2, cache: 1];
//
// node Scalar[1]: x = 366, y = 127, inputs = 11, label = Scalar
// input[1]: defaulting = 0, visible = 0, type = 32, value = "Scalar_1"
// input[3]: defaulting = 0, visible = 0, type = 5, value = 0.15
// input[5]: defaulting = 1, visible = 0, type = 5, value = -0.665438
// input[6]: defaulting = 1, visible = 0, type = 5, value = 1.0
// input[7]: defaulting = 1, visible = 0, type = 5, value = 1.0
// input[9]: defaulting = 1, visible = 0, type = 1, value = 2
// output[1]: visible = 1, type = 5, value = 0.15
//
main_Scalar_1_out_1[cache: 2] =
Scalar(
main_Scalar_1_in_1,
main_Import_1_out_1,
main_Scalar_1_in_3,
main_Scalar_1_in_4,
main_Scalar_1_in_5,
main_Scalar_1_in_6,
main_Scalar_1_in_7,
main_Scalar_1_in_8,
main_Scalar_1_in_9,
main_Scalar_1_in_10,
main_Scalar_1_in_11
) [instance: 1, cache: 1];
//
// node Isosurface[1]: x = 317, y = 324, inputs = 6, label = Isosurface
// input[2]: defaulting = 1, visible = 1, type = 5, value = 0.0
//
main_Isosurface_1_out_1 =
Isosurface(
main_Import_1_out_1,
main_Scalar_1_out_1,
main_Isosurface_1_in_3,
main_Isosurface_1_in_4,
main_Isosurface_1_in_5,
main_Isosurface_1_in_6
) [instance: 1, cache: 1];
//
// node Switch[1]: x = 150, y = 539, inputs = 4, label = Switch
// input[1]: defaulting = 1, visible = 1, type = 1, value = 2
//
main_Switch_1_out_1 =
Switch(
main_Selector_4_out_1,
main_Switch_3_out_1,
main_Collect_2_out_1,
main_Isosurface_1_out_1
) [instance: 1, cache: 1];
//
// node AutoColor[1]: x = 369, y = 553, inputs = 10, label = AutoColor
//
main_AutoColor_1_out_1,
main_AutoColor_1_out_2 =
AutoColor(
main_Switch_1_out_1,
main_AutoColor_1_in_2,
main_AutoColor_1_in_3,
main_AutoColor_1_in_4,
main_AutoColor_1_in_5,
main_AutoColor_1_in_6,
main_Import_1_out_1,
main_AutoColor_1_in_8,
main_AutoColor_1_in_9,
main_AutoColor_1_in_10
) [instance: 1, cache: 1];
//
// node ShowConnections[1]: x = 490, y = 117, inputs = 1, label =
ShowConnections
//
main_ShowConnections_1_out_1 =
ShowConnections(
main_Import_1_out_1
) [instance: 1, cache: 1];
//
// node Collect[1]: x = 504, y = 495, inputs = 2, label = Collect
//
main_Collect_1_out_1 =
Collect(
main_AutoColor_1_out_1,
main_ShowConnections_1_out_1
) [instance: 1, cache: 1];
//
// node Image[1]: x = 571, y = 551, inputs = 49, label = Image
// input[1]: defaulting = 0, visible = 0, type = 67108863, value = "Image_1"
// input[4]: defaulting = 0, visible = 0, type = 1, value = 1
// input[5]: defaulting = 0, visible = 0, type = 8, value = [0.5 0.5 0.5]
// input[6]: defaulting = 0, visible = 0, type = 8, value = [2.23959 3.5585
3.48967]
// input[7]: defaulting = 1, visible = 0, type = 5, value = 2.47436
// input[8]: defaulting = 0, visible = 0, type = 1, value = 642
// input[9]: defaulting = 0, visible = 0, type = 5, value = 0.706
// input[10]: defaulting = 0, visible = 0, type = 8, value = [-0.217805
0.742767 -0.633134]
// input[11]: defaulting = 0, visible = 0, type = 5, value = 30.0
// input[12]: defaulting = 0, visible = 0, type = 1, value = 1
// input[14]: defaulting = 0, visible = 0, type = 1, value = 1
// input[15]: defaulting = 0, visible = 0, type = 32, value = "none"
// input[16]: defaulting = 1, visible = 0, type = 32, value = "none"
// input[17]: defaulting = 1, visible = 0, type = 1, value = 1
// input[18]: defaulting = 1, visible = 0, type = 1, value = 1
// input[19]: defaulting = 0, visible = 0, type = 1, value = 0
// input[29]: defaulting = 1, visible = 0, type = 3, value = 0
// input[41]: defaulting = 0, visible = 0, type = 32, value = "rotate"
// depth: value = 24
// window: position = (0.3545,0.1836), size = 0.6406x0.6471
// internal caching: 1
//
main_Image_1_out_1,
main_Image_1_out_2,
main_Image_1_out_3 =
Image(
main_Image_1_in_1,
main_Collect_1_out_1,
main_Image_1_in_3,
main_Image_1_in_4,
main_Image_1_in_5,
main_Image_1_in_6,
main_Image_1_in_7,
main_Image_1_in_8,
main_Image_1_in_9,
main_Image_1_in_10,
main_Image_1_in_11,
main_Image_1_in_12,
main_Image_1_in_13,
main_Image_1_in_14,
main_Image_1_in_15,
main_Image_1_in_16,
main_Image_1_in_17,
main_Image_1_in_18,
main_Image_1_in_19,
main_Image_1_in_20,
main_Image_1_in_21,
main_Image_1_in_22,
main_Image_1_in_23,
main_Image_1_in_24,
main_Image_1_in_25,
main_Image_1_in_26,
main_Image_1_in_27,
main_Image_1_in_28,
main_Image_1_in_29,
main_Image_1_in_30,
main_Image_1_in_31,
main_Image_1_in_32,
main_Image_1_in_33,
main_Image_1_in_34,
main_Image_1_in_35,
main_Image_1_in_36,
main_Image_1_in_37,
main_Image_1_in_38,
main_Image_1_in_39,
main_Image_1_in_40,
main_Image_1_in_41,
main_Image_1_in_42,
main_Image_1_in_43,
main_Image_1_in_44,
main_Image_1_in_45,
main_Image_1_in_46,
main_Image_1_in_47,
main_Image_1_in_48,
main_Image_1_in_49
) [instance: 1, cache: 1];
// network: end of macro body
CacheScene(main_Image_1_in_1, main_Image_1_out_1, main_Image_1_out_2);
}
main_Selector_4_in_1 = "Selector_4";
main_Selector_4_in_2 = "boundary" ;
main_Selector_4_in_3 = 1 ;
main_Selector_4_in_4 = NULL;
main_Selector_4_in_5 = NULL;
main_Selector_4_in_6 = NULL;
main_Selector_4_in_7 = NULL;
main_Selector_4_out_1 = 1 ;
main_Selector_3_in_1 = "Selector_3";
main_Selector_3_in_2 = "yes" ;
main_Selector_3_in_3 = 2 ;
main_Selector_3_in_4 = NULL;
main_Selector_3_in_5 = NULL;
main_Selector_3_in_6 = NULL;
main_Selector_3_in_7 = NULL;
main_Selector_3_out_1 = 2 ;
main_Selector_5_in_1 = "Selector_5";
main_Selector_5_in_2 = "face" ;
main_Selector_5_in_3 = 2 ;
main_Selector_5_in_4 = NULL;
main_Selector_5_in_5 = NULL;
main_Selector_5_in_6 = NULL;
main_Selector_5_in_7 = NULL;
main_Selector_5_out_1 = 2 ;
main_Import_1_in_1 = "toon.dx";
main_Import_1_in_2 = NULL;
main_Import_1_in_3 = NULL;
main_Import_1_in_4 = NULL;
main_Import_1_in_5 = NULL;
main_Import_1_in_6 = NULL;
main_Import_1_out_1 = NULL;
main_ShowBoundary_1_in_2 = NULL;
main_ShowBoundary_1_out_1 = NULL;
main_FaceNormals_1_out_1 = NULL;
main_Switch_2_out_1 = NULL;
main_Refine_1_in_2 = 5;
main_Refine_1_out_1 = NULL;
main_Switch_3_out_1 = NULL;
main_ShowConnections_2_out_1 = NULL;
main_Collect_2_out_1 = NULL;
main_Scalar_1_in_1 = "Scalar_1";
main_Scalar_1_in_3 = 0.15 ;
main_Scalar_1_in_4 = NULL;
main_Scalar_1_in_5 = NULL;
main_Scalar_1_in_6 = NULL;
main_Scalar_1_in_7 = NULL;
main_Scalar_1_in_8 = NULL;
main_Scalar_1_in_9 = NULL;
main_Scalar_1_in_10 = NULL;
main_Scalar_1_in_11 = NULL;
main_Scalar_1_out_1 = 0.15 ;
main_Isosurface_1_in_3 = NULL;
main_Isosurface_1_in_4 = NULL;
main_Isosurface_1_in_5 = NULL;
main_Isosurface_1_in_6 = NULL;
main_Isosurface_1_out_1 = NULL;
main_Switch_1_out_1 = NULL;
main_AutoColor_1_in_2 = NULL;
main_AutoColor_1_in_3 = NULL;
main_AutoColor_1_in_4 = NULL;
main_AutoColor_1_in_5 = NULL;
main_AutoColor_1_in_6 = NULL;
main_AutoColor_1_in_8 = NULL;
main_AutoColor_1_in_9 = NULL;
main_AutoColor_1_in_10 = NULL;
main_AutoColor_1_out_1 = NULL;
main_ShowConnections_1_out_1 = NULL;
main_Collect_1_out_1 = NULL;
macro Image(
id,
object,
where,
useVector,
to,
from,
width,
resolution,
aspect,
up,
viewAngle,
perspective,
options,
buttonState = 1,
buttonUpApprox = "none",
buttonDownApprox = "none",
buttonUpDensity = 1,
buttonDownDensity = 1,
renderMode = 0,
defaultCamera,
reset,
backgroundColor,
throttle,
RECenable = 0,
RECfile,
RECformat,
RECresolution,
RECaspect,
AAenable = 0,
AAlabels,
AAticks,
AAcorners,
AAframe,
AAadjust,
AAcursor,
AAgrid,
AAcolors,
AAannotation,
AAlabelscale,
AAfont,
interactionMode,
title,
AAxTickLocs,
AAyTickLocs,
AAzTickLocs,
AAxTickLabels,
AAyTickLabels,
AAzTickLabels,
webOptions) -> (
object,
camera,
where)
{
ImageMessage(
id,
backgroundColor,
throttle,
RECenable,
RECfile,
RECformat,
RECresolution,
RECaspect,
AAenable,
AAlabels,
AAticks,
AAcorners,
AAframe,
AAadjust,
AAcursor,
AAgrid,
AAcolors,
AAannotation,
AAlabelscale,
AAfont,
AAxTickLocs,
AAyTickLocs,
AAzTickLocs,
AAxTickLabels,
AAyTickLabels,
AAzTickLabels,
interactionMode,
title,
renderMode,
buttonUpApprox,
buttonDownApprox,
buttonUpDensity,
buttonDownDensity) [instance: 1, cache: 1];
autoCamera =
AutoCamera(
object,
"front",
object,
resolution,
aspect,
[0,1,0],
perspective,
viewAngle,
backgroundColor) [instance: 1, cache: 1];
realCamera =
Camera(
to,
from,
width,
resolution,
aspect,
up,
perspective,
viewAngle,
backgroundColor) [instance: 1, cache: 1];
coloredDefaultCamera =
UpdateCamera(defaultCamera,
background=backgroundColor) [instance: 1, cache: 1];
nullDefaultCamera =
Inquire(defaultCamera,
"is null + 1") [instance: 1, cache: 1];
resetCamera =
Switch(
nullDefaultCamera,
coloredDefaultCamera,
autoCamera) [instance: 1, cache: 1];
resetNull =
Inquire(
reset,
"is null + 1") [instance: 2, cache: 1];
reset =
Switch(
resetNull,
reset,
0) [instance: 2, cache: 1];
whichCamera =
Compute(
"($0 != 0 || $1 == 0) ? 1 : 2",
reset,
useVector) [instance: 1, cache: 1];
camera = Switch(
whichCamera,
resetCamera,
realCamera) [instance: 3, cache: 1];
AAobject =
AutoAxes(
object,
camera,
AAlabels,
AAticks,
AAcorners,
AAframe,
AAadjust,
AAcursor,
AAgrid,
AAcolors,
AAannotation,
AAlabelscale,
AAfont,
AAxTickLocs,
AAyTickLocs,
AAzTickLocs,
AAxTickLabels,
AAyTickLabels,
AAzTickLabels) [instance: 1, cache: 1];
switchAAenable = Compute("$0+1",
AAenable) [instance: 2, cache: 1];
object = Switch(
switchAAenable,
object,
AAobject) [instance:4, cache: 1];
SWapproximation_options =
Switch(
buttonState,
buttonUpApprox,
buttonDownApprox) [instance: 5, cache: 1];
SWdensity_options =
Switch(
buttonState,
buttonUpDensity,
buttonDownDensity) [instance: 6, cache: 1];
HWapproximation_options =
Format(
"%s,%s",
buttonDownApprox,
buttonUpApprox) [instance: 1, cache: 1];
HWdensity_options =
Format(
"%d,%d",
buttonDownDensity,
buttonUpDensity) [instance: 2, cache: 1];
switchRenderMode = Compute(
"$0+1",
renderMode) [instance: 3, cache: 1];
approximation_options = Switch(
switchRenderMode,
SWapproximation_options,
HWapproximation_options) [instance: 7, cache: 1];
density_options = Switch(
switchRenderMode,
SWdensity_options,
HWdensity_options) [instance: 8, cache: 1];
renderModeString = Switch(
switchRenderMode,
"software",
"hardware")[instance: 9, cache: 1];
object_tag = Inquire(
object,
"object tag")[instance: 3, cache: 1];
annoted_object =
Options(
object,
"send boxes",
0,
"cache",
1,
"object tag",
object_tag,
"ddcamera",
whichCamera,
"rendering approximation",
approximation_options,
"render every",
density_options,
"button state",
buttonState,
"rendering mode",
renderModeString) [instance: 1, cache: 1];
RECresNull =
Inquire(
RECresolution,
"is null + 1") [instance: 4, cache: 1];
ImageResolution =
Inquire(
camera,
"camera resolution") [instance: 5, cache: 1];
RECresolution =
Switch(
RECresNull,
RECresolution,
ImageResolution) [instance: 10, cache: 1];
RECaspectNull =
Inquire(
RECaspect,
"is null + 1") [instance: 6, cache: 1];
ImageAspect =
Inquire(
camera,
"camera aspect") [instance: 7, cache: 1];
RECaspect =
Switch(
RECaspectNull,
RECaspect,
ImageAspect) [instance: 11, cache: 1];
switchRECenable = Compute(
"$0 == 0 ? 1 : (($2 == $3) && ($4 == $5)) ? ($1 == 1 ? 2 : 3) : 4",
RECenable,
switchRenderMode,
RECresolution,
ImageResolution,
RECaspect,
ImageAspect) [instance: 4, cache: 1];
NoRECobject, RECNoRerenderObject, RECNoRerHW, RECRerenderObject =
Route(switchRECenable, annoted_object);
Display(
NoRECobject,
camera,
where,
throttle) [instance: 1, cache: 1];
image =
Render(
RECNoRerenderObject,
camera) [instance: 1, cache: 1];
Display(
image,
NULL,
where,
throttle) [instance: 2, cache: 1];
WriteImage(
image,
RECfile,
RECformat) [instance: 1, cache: 1];
rec_where = Display(
RECNoRerHW,
camera,
where,
throttle) [instance: 1, cache: 0];
rec_image = ReadImageWindow(
rec_where) [instance: 1, cache: 1];
WriteImage(
rec_image,
RECfile,
RECformat) [instance: 1, cache: 1];
RECupdateCamera =
UpdateCamera(
camera,
resolution=RECresolution,
aspect=RECaspect) [instance: 2, cache: 1];
Display(
RECRerenderObject,
camera,
where,
throttle) [instance: 1, cache: 1];
RECRerenderObject =
ScaleScreen(
RECRerenderObject,
NULL,
RECresolution,
camera) [instance: 1, cache: 1];
image =
Render(
RECRerenderObject,
RECupdateCamera) [instance: 2, cache: 1];
WriteImage(
image,
RECfile,
RECformat) [instance: 2, cache: 1];
}
main_Image_1_in_1 = "Image_1";
main_Image_1_in_3 = "X24,,";
main_Image_1_in_4 = 1;
main_Image_1_in_5 = [0.5 0.5 0.5];
main_Image_1_in_6 = [2.23959 3.5585 3.48967];
main_Image_1_in_7 = NULL;
main_Image_1_in_8 = 642;
main_Image_1_in_9 = 0.706;
main_Image_1_in_10 = [-0.217805 0.742767 -0.633134];
main_Image_1_in_11 = 30.0;
main_Image_1_in_12 = 1;
main_Image_1_in_13 = NULL;
main_Image_1_in_14 = 1;
main_Image_1_in_15 = "none";
main_Image_1_in_16 = NULL;
main_Image_1_in_17 = NULL;
main_Image_1_in_18 = NULL;
main_Image_1_in_19 = 0;
main_Image_1_in_20 = NULL;
main_Image_1_in_21 = NULL;
main_Image_1_in_22 = NULL;
main_Image_1_in_23 = NULL;
main_Image_1_in_25 = NULL;
main_Image_1_in_26 = NULL;
main_Image_1_in_27 = NULL;
main_Image_1_in_28 = NULL;
main_Image_1_in_29 = NULL;
main_Image_1_in_30 = NULL;
main_Image_1_in_31 = NULL;
main_Image_1_in_32 = NULL;
main_Image_1_in_33 = NULL;
main_Image_1_in_34 = NULL;
main_Image_1_in_35 = NULL;
main_Image_1_in_36 = NULL;
main_Image_1_in_37 = NULL;
main_Image_1_in_38 = NULL;
main_Image_1_in_39 = NULL;
main_Image_1_in_40 = NULL;
main_Image_1_in_41 = "rotate";
main_Image_1_in_42 = NULL;
main_Image_1_in_43 = NULL;
main_Image_1_in_44 = NULL;
main_Image_1_in_45 = NULL;
main_Image_1_in_46 = NULL;
main_Image_1_in_47 = NULL;
main_Image_1_in_48 = NULL;
main_Image_1_in_49 = NULL;
Executive("product version 4 1 3");
$sync
main();