Can I make a mirror?

Tom G. Smith smitty at kcc.com
Fri Dec 3 15:33:23 EST 1999


You'll see in the attached Tcl script, I'm displaying a Moebius Strip,
and I'm trying to implement a refective mirror underneath it that
remains oriented to the camera, and shows the reflection of the
underside of the Moebius Strip as the camera rotates around it.
But regardless of what I do with the Specular, Ambient, and Diffuse
parameters, nothing shows up in the mirror.

A second problem I'm having is, the mirror seems to wobble as I
move the camera.  I suspect this is because I'm using the wrong
coordinate system to orient the mirror, but if anybody has a suggestion,
it'd be appreciated.

sym.tcl:
............................................................................
set Pi [expr acos(-1)] ;# Approx. 3.14159265359
set Degrees [expr 180/$Pi] ;# Conversion factor, degrees to radians.

source startup.tcl ;# Initialize vtk.
source colors.tcl ;# Define colors

# Create triangle strip for Moebius. --------------------------------
set stripwidth 1
set stripradius [expr 1*$stripwidth]
	# Radius of circle about which center is rotated.
set zc [expr $stripwidth/2.0];# z-coordinate of center of strip
set pointcount [expr 1 << 9] ;# Evaluates to 512. Same as 2**9 in perl.
set xscale 1;# scale factor to elongate graphic
set yscale 2;# scale factor to elongate graphic
set zscale 1;# scale factor to elongate strip size.
vtkPoints points
vtkCellArray strip
strip InsertNextCell [expr $pointcount+2];#number of points
set n 0
while {$n <= $pointcount+1} {
	if [expr !($n % 2)] {
		set angle [expr 2*$Pi*$n/$pointcount]
			# angle around center of mobius.
		set rotate [expr $angle/2]
			# angle of strip rotation.
		set xc [expr cos($angle)*$stripradius]
			# x-coordinate of center of strip.
		set yc [expr sin($angle)*$stripradius]
			# y-coordinate of center of strip.
		set ac [expr $angle+$Pi]
		if {$ac > 2*$Pi} {
			set ac [expr $ac - 2*$Pi]
		}
			# angle with respect to center of strip of
			# line across strip, intersecting with mobius center,
			# projected on x-y plane.
		set r [expr abs(sin($rotate)*$zc)]
			# length of strip projected onto x-y plane.
		set sign 1
	} else {
		set sign -1
	}
	set x [expr ($xc+$sign*cos($ac)*$r)*$xscale]
	set y [expr ($yc+$sign*sin($ac)*$r)*$yscale]
	set z [expr ($zc+$sign*cos($rotate)*$zc)*$zscale]
	points InsertPoint $n $x $y $z
	strip InsertCellPoint $n
	incr n
}
vtkPolyData profile
    profile SetPoints points
    profile SetStrips strip
vtkPolyDataMapper map
    map SetInput profile
vtkActor mobius
    mobius SetMapper map
    eval {[mobius GetProperty] SetColor } $colors(steel_blue)
    [mobius GetProperty] BackfaceCullingOff
ren1 AddActor mobius
ren1 SetBackground 1 1 1 ;# Sets background to white.

# Add text. --------------------------------------------------
vtkTextMapper textMapper
    textMapper SetInput "Modeling Symposium 2000"
    textMapper SetFontSize 18
    textMapper SetFontFamilyToArial
    textMapper BoldOn
    textMapper ItalicOn
    textMapper ShadowOn
vtkActor2D textActor
    textActor SetMapper textMapper    
    textActor SetPosition 45 150
    eval {[textActor GetProperty] SetColor } $colors(chocolate)
ren1 AddActor2D textActor

# Define the mirror. --------------------------------------------------
vtkPoints planepoints
vtkCellArray planepoly
planepoly InsertNextCell 4; # First thing in a new cell is the point count.
set v {{-1 -1 1} {1 -1 1} {1 1 -1} {-1 1 -1}}
set f 2.5
set i 0
while {$i < 4} {
        set t [lindex $v $i]
	set x [expr [lindex $t 0]*$f]
	set y [expr ([lindex $t 1]-1.5)*$f]
	set z [expr [lindex $t 2]*$f]
        planepoints InsertPoint $i $x $y $z
	planepoly InsertCellPoint $i; # Add point id.
        incr i
}
vtkPolyData plane
plane SetPoints planepoints; planepoints Delete 
plane SetPolys planepoly; planepoly Delete 
vtkPolyDataMapper planeMapper
	planeMapper SetInput plane
vtkFollower planeActor
	planeActor SetMapper planeMapper
	planeActor SetCamera [ren1 GetActiveCamera]
	eval {[planeActor GetProperty] SetColor} $colors(grey)
	[planeActor GetProperty] SetOpacity 1
	[planeActor GetProperty] SetSpecularPower 200
	[planeActor GetProperty] SetSpecular .5
	[planeActor GetProperty] SetAmbient .5
	[planeActor GetProperty] SetDiffuse .5
ren1 AddActor planeActor ;# assign our actor to the renderer
  
source go.tcl ;# Start the Interactor and display the image.

startup.tcl:
............................................................................
#!/usr/bin/tcl
#-----------------------------------------------------------------------
# Description:  This Tcl script can be sourced to get the typical
# vtk initialization.
#-----------------------------------------------------------------------
# Changelog:
# 991007 Smitty created.
#-----------------------------------------------------------------------
catch {load vtktcl} ;# Load the shared vtk libraries.
source /opt/vtk/examplesTcl/vtkInt.tcl ;# Get the interactor ui.
vtkRenderer ren1
	# vtkRenderer provides an abstract specification for renderers. A
	# renderer is an object that controls the rendering process for
	# objects. Rendering is the process of converting geometry,
	# a specification for lights, and a camera view into an
	# image. vtkRenderer also performs coordinate transformation
	# between world coordinates, view coordinates (the computer
	# graphics rendering coordinate system), and display coordinates
	# (the actual screen coordinates on the display device). 
vtkRenderWindow renWin
	# vtkRenderWindow is an abstract object to specify the behavior
	# of a rendering window. A rendering window is a window
	# in a graphical user interface where renderers draw their
	# images. Methods are provided to synchronize the rendering
	# process, set window size, and control double buffering.
  renWin AddRenderer ren1
	# Associate renderer ren1 with renWin.
vtkRenderWindowInteractor iren
	# vtkRenderWindowInteractor is a convenience object that provides
	# event bindings to common graphics functions.  Here's a brief
	# summary.  See http://www.kitware.com/vtkhtml/vtkdata/manhtml/
	# vtkRenderWindowInteractor.html for more detail:
	# Mouse bindings:
	# 	camera: Button 1 - rotate
	# 		Button 2 - pan
	# 		Button 3 - zoom
	# 		ctrl-Button 1 - spin
	# 	actor:  Button 1 - rotate
	# 		Button 2 - pan
	# 		Button 3 - uniform scale
	# 		ctrl-Button 1 - spin
	# 		ctrl-Button 2 - dolly.
	# Keyboard bindings (upper or lower case):
	# j - joystick like mouse interactions
	# t - trackball like mouse interactions
	# o - object/actor interaction
	# c - camera interaction
	# r - reset camera view
	# w - turn all actors wireframe
	# s - turn all actors surface
	# u - execute user defined function
	# p - pick actor under mouse pointer (if pickable)
	# 3 - toggle in/out of 3D mode (if supported by renderer)
	# e - exit
	# q - exit
  iren SetRenderWindow renWin
	# Associate renderwindow renWin with interactor iren.


colors.tcl:
............................................................................
#-----------------------------------------------------------------------
# Description:  This Tcl script can be sourced to build an array of
# RGB color values.  It's a copy of /opt/vtk/examplesTcl/colors.tcl,
# with a lot of changes.
#-----------------------------------------------------------------------
# Changelog:
# 991020 Smitty created.
#-----------------------------------------------------------------------

#  Whites
set colors(antique_white)  "0.9804 0.9216 0.8431"
set colors(azure)  "0.9412 1.0000 1.0000"
set colors(bisque)  "1.0000 0.8941 0.7686"
set colors(blanched_almond)  "1.0000 0.9216 0.8039"
set colors(cornsilk)  "1.0000 0.9725 0.8627"
set colors(eggshell)  "0.9900 0.9000 0.7900"
set colors(floral_white)  "1.0000 0.9804 0.9412"
set colors(gainsboro)  "0.8627 0.8627 0.8627"
set colors(ghost_white)  "0.9725 0.9725 1.0000"
set colors(honeydew)  "0.9412 1.0000 0.9412"
set colors(ivory)  "1.0000 1.0000 0.9412"
set colors(lavender)  "0.9020 0.9020 0.9804"
set colors(lavender_blush)  "1.0000 0.9412 0.9608"
set colors(lemon_chiffon)  "1.0000 0.9804 0.8039"
set colors(linen)  "0.9804 0.9412 0.9020"
set colors(mint_cream)  "0.9608 1.0000 0.9804"
set colors(misty_rose)  "1.0000 0.8941 0.8824"
set colors(moccasin)  "1.0000 0.8941 0.7098"
set colors(navajo_white)  "1.0000 0.8706 0.6784"
set colors(old_lace)  "0.9922 0.9608 0.9020"
set colors(papaya_whip)  "1.0000 0.9373 0.8353"
set colors(peach_puff)  "1.0000 0.8549 0.7255"
set colors(seashell)  "1.0000 0.9608 0.9333"
set colors(snow)  "1.0000 0.9804 0.9804"
set colors(thistle)  "0.8471 0.7490 0.8471"
set colors(titanium_white)  "0.9900 1.0000 0.9400"
set colors(wheat)  "0.9608 0.8706 0.7020"
set colors(white)  "1.0000 1.0000 1.0000"
set colors(white_smoke)  "0.9608 0.9608 0.9608"
set colors(zinc_white)  "0.9900 0.9700 1.0000"

#  Greys
set colors(cold_grey)  "0.5000 0.5400 0.5300"
set colors(dim_grey)  "0.4118 0.4118 0.4118"
set colors(grey)  "0.7529 0.7529 0.7529"
set colors(light_grey)  "0.8275 0.8275 0.8275"
set colors(slate_grey)  "0.4392 0.5020 0.5647"
set colors(slate_grey_dark)  "0.1843 0.3098 0.3098"
set colors(slate_grey_light)  "0.4667 0.5333 0.6000"
set colors(warm_grey)  "0.5000 0.5000 0.4100"

#  Blacks
set colors(black)  "0.0000 0.0000 0.0000"
set colors(ivory_black)  "0.1600 0.1400 0.1300"
set colors(lamp_black)  "0.1800 0.2800 0.2300"

#  Reds
set colors(alizarin_crimson)  "0.8900 0.1500 0.2100"
set colors(brick)  "0.6100 0.4000 0.1200"
set colors(cadmium_red_deep)  "0.8900 0.0900 0.0500"
set colors(coral)  "1.0000 0.4980 0.3137"
set colors(coral_light)  "0.9412 0.5020 0.5020"
set colors(deep_pink)  "1.0000 0.0784 0.5765"
set colors(english_red)  "0.8300 0.2400 0.1000"
set colors(firebrick)  "0.6980 0.1333 0.1333"
set colors(geranium_lake)  "0.8900 0.0700 0.1900"
set colors(hot_pink)  "1.0000 0.4118 0.7059"
set colors(indian_red)  "0.6900 0.0900 0.1200"
set colors(light_salmon)  "1.0000 0.6275 0.4784"
set colors(madder_lake_deep)  "0.8900 0.1800 0.1900"
set colors(maroon)  "0.6902 0.1882 0.3765"
set colors(pink)  "1.0000 0.7529 0.7961"
set colors(pink_light)  "1.0000 0.7137 0.7569"
set colors(raspberry)  "0.5300 0.1500 0.3400"
set colors(red)  "1.0000 0.0000 0.0000"
set colors(rose_madder)  "0.8900 0.2100 0.2200"
set colors(salmon)  "0.9804 0.5020 0.4471"
set colors(tomato)  "1.0000 0.3882 0.2784"
set colors(venetian_red)  "0.8300 0.1000 0.1200"

#  Browns
set colors(beige)  "0.6400 0.5800 0.5000"
set colors(brown)  "0.5000 0.1647 0.1647"
set colors(brown_madder)  "0.8600 0.1600 0.1600"
set colors(brown_ochre)  "0.5300 0.2600 0.1200"
set colors(burlywood)  "0.8706 0.7216 0.5294"
set colors(burnt_sienna)  "0.5400 0.2100 0.0600"
set colors(burnt_umber)  "0.5400 0.2000 0.1400"
set colors(chocolate)  "0.8235 0.4118 0.1176"
set colors(deep_ochre)  "0.4500 0.2400 0.1000"
set colors(flesh)  "1.0000 0.4900 0.2500"
set colors(flesh_ochre)  "1.0000 0.3400 0.1300"
set colors(gold_ochre)  "0.7800 0.4700 0.1500"
set colors(greenish_umber)  "1.0000 0.2400 0.0500"
set colors(khaki)  "0.9412 0.9020 0.5490"
set colors(khaki_dark)  "0.7412 0.7176 0.4196"
set colors(light_beige)  "0.9608 0.9608 0.8627"
set colors(peru)  "0.8039 0.5216 0.2471"
set colors(rosy_brown)  "0.7373 0.5608 0.5608"
set colors(raw_sienna)  "0.7800 0.3800 0.0800"
set colors(raw_umber)  "0.4500 0.2900 0.0700"
set colors(sepia)  "0.3700 0.1500 0.0700"
set colors(sienna)  "0.6275 0.3216 0.1765"
set colors(saddle_brown)  "0.5451 0.2706 0.0745"
set colors(sandy_brown)  "0.9569 0.6431 0.3765"
set colors(tan)  "0.8235 0.7059 0.5490"
set colors(van_dyke_brown)  "0.3700 0.1500 0.0200"

#  Oranges
set colors(cadmium_orange)  "1.0000 0.3800 0.0100"
set colors(cadmium_red_light)  "1.0000 0.0100 0.0500"
set colors(carrot)  "0.9300 0.5700 0.1300"
set colors(dark_orange)  "1.0000 0.5490 0.0000"
set colors(mars_orange)  "0.5900 0.2700 0.0800"
set colors(mars_yellow)  "0.8900 0.4400 0.1000"
set colors(orange)  "1.0000 0.5000 0.0000"
set colors(orange_red)  "1.0000 0.2706 0.0000"
set colors(yellow_ochre)  "0.8900 0.5100 0.0900"

#  Yellows
set colors(aureoline_yellow)  "1.0000 0.6600 0.1400"
set colors(banana)  "0.8900 0.8100 0.3400"
set colors(cadmium_lemon)  "1.0000 0.8900 0.0100"
set colors(cadmium_yellow)  "1.0000 0.6000 0.0700"
set colors(cadmium_yellow_light)  "1.0000 0.6900 0.0600"
set colors(gold)  "1.0000 0.8431 0.0000"
set colors(goldenrod)  "0.8549 0.6471 0.1255"
set colors(goldenrod_dark)  "0.7216 0.5255 0.0431"
set colors(goldenrod_light)  "0.9804 0.9804 0.8235"
set colors(goldenrod_pale)  "0.9333 0.9098 0.6667"
set colors(light_goldenrod)  "0.9333 0.8667 0.5098"
set colors(melon)  "0.8900 0.6600 0.4100"
set colors(naples_yellow_deep)  "1.0000 0.6600 0.0700"
set colors(yellow)  "1.0000 1.0000 0.0000"
set colors(yellow_light)  "1.0000 1.0000 0.8784"

#  Greens
set colors(chartreuse)  "0.4980 1.0000 0.0000"
set colors(chrome_oxide_green)  "0.4000 0.5000 0.0800"
set colors(cinnabar_green)  "0.3800 0.7000 0.1600"
set colors(cobalt_green)  "0.2400 0.5700 0.2500"
set colors(emerald_green)  "0.0000 0.7900 0.3400"
set colors(forest_green)  "0.1333 0.5451 0.1333"
set colors(green)  "0.0000 1.0000 0.0000"
set colors(green_dark)  "0.0000 0.3922 0.0000"
set colors(green_pale)  "0.5961 0.9843 0.5961"
set colors(green_yellow)  "0.6784 1.0000 0.1843"
set colors(lawn_green)  "0.4863 0.9882 0.0000"
set colors(lime_green)  "0.1961 0.8039 0.1961"
set colors(mint)  "0.7400 0.9900 0.7900"
set colors(olive)  "0.2300 0.3700 0.1700"
set colors(olive_drab)  "0.4196 0.5569 0.1373"
set colors(olive_green_dark)  "0.3333 0.4196 0.1843"
set colors(permanent_green)  "0.0400 0.7900 0.1700"
set colors(sap_green)  "0.1900 0.5000 0.0800"
set colors(sea_green)  "0.1804 0.5451 0.3412"
set colors(sea_green_dark)  "0.5608 0.7373 0.5608"
set colors(sea_green_medium)  "0.2353 0.7020 0.4431"
set colors(sea_green_light)  "0.1255 0.6980 0.6667"
set colors(spring_green)  "0.0000 1.0000 0.4980"
set colors(spring_green_medium)  "0.0000 0.9804 0.6039"
set colors(terre_verte)  "0.2200 0.3700 0.0600"
set colors(viridian_light)  "0.4300 1.0000 0.4400"
set colors(yellow_green)  "0.6039 0.8039 0.1961"

#  Cyans
set colors(aquamarine)  "0.4980 1.0000 0.8314"
set colors(aquamarine_medium)  "0.4000 0.8039 0.6667"
set colors(cyan)  "0.0000 1.0000 1.0000"
set colors(cyan_white)  "0.8784 1.0000 1.0000"
set colors(turquoise)  "0.2510 0.8784 0.8157"
set colors(turquoise_dark)  "0.0000 0.8078 0.8196"
set colors(turquoise_medium)  "0.2824 0.8196 0.8000"
set colors(turquoise_pale)  "0.6863 0.9333 0.9333"

#  Blues
set colors(alice_blue)  "0.9412 0.9725 1.0000"
set colors(blue)  "0.0000 0.0000 1.0000"
set colors(blue_light)  "0.6784 0.8471 0.9020"
set colors(blue_medium)  "0.0000 0.0000 0.8039"
set colors(cadet)  "0.3725 0.6196 0.6275"
set colors(cobalt)  "0.2400 0.3500 0.6700"
set colors(cornflower)  "0.3922 0.5843 0.9294"
set colors(cerulean)  "0.0200 0.7200 0.8000"
set colors(dodger_blue)  "0.1176 0.5647 1.0000"
set colors(indigo)  "0.0300 0.1800 0.3300"
set colors(manganese_blue)  "0.0100 0.6600 0.6200"
set colors(midnight_blue)  "0.0980 0.0980 0.4392"
set colors(navy)  "0.0000 0.0000 0.5020"
set colors(peacock)  "0.2000 0.6300 0.7900"
set colors(powder_blue)  "0.6902 0.8784 0.9020"
set colors(royal_blue)  "0.2549 0.4118 0.8824"
set colors(slate_blue)  "0.4157 0.3529 0.8039"
set colors(slate_blue_dark)  "0.2824 0.2392 0.5451"
set colors(slate_blue_light)  "0.5176 0.4392 1.0000"
set colors(slate_blue_medium)  "0.4824 0.4078 0.9333"
set colors(sky_blue)  "0.5294 0.8078 0.9216"
set colors(sky_blue_deep)  "0.0000 0.7490 1.0000"
set colors(sky_blue_light)  "0.5294 0.8078 0.9804"
set colors(steel_blue)  "0.2745 0.5098 0.7059"
set colors(steel_blue_light)  "0.6902 0.7686 0.8706"
set colors(turquoise_blue)  "0.0000 0.7800 0.5500"
set colors(ultramarine)  "0.0700 0.0400 0.5600"

#  Magentas
set colors(blue_violet)  "0.5412 0.1686 0.8863"
set colors(cobalt_violet_deep)  "0.5700 0.1300 0.6200"
set colors(magenta)  "1.0000 0.0000 1.0000"
set colors(orchid)  "0.8549 0.4392 0.8392"
set colors(orchid_dark)  "0.6000 0.1961 0.8000"
set colors(orchid_medium)  "0.7294 0.3333 0.8275"
set colors(permanent_red_violet)  "0.8600 0.1500 0.2700"
set colors(plum)  "0.8667 0.6275 0.8667"
set colors(purple)  "0.6275 0.1255 0.9412"
set colors(purple_medium)  "0.5765 0.4392 0.8588"
set colors(ultramarine_violet)  "0.3600 0.1400 0.4300"
set colors(violet)  "0.5600 0.3700 0.6000"
set colors(violet_dark)  "0.5804 0.0000 0.8275"
set colors(violet_red)  "0.8157 0.1255 0.5647"
set colors(violet_red_medium)  "0.7804 0.0824 0.5216"
set colors(violet_red_pale)  "0.8588 0.4392 0.5765"

proc showcolors {} {
#------------------------------------------------------------------
# Called to display all the possible color names.
#------------------------------------------------------------------
	global colors
	
	foreach key [lsort [array names colors]] {
		set value $colors($key)
		puts "$key=$value"
	}
} ;# End showcolors.

proc tablecolors {tablename colornames {count 0}} {
#------------------------------------------------------------------
# Called to build a vtkLookupTable object based on a list of
# color names.  If count is greater than the number of colors in
# colornames, the table will be built with $count entries and the
# colors in colornames will be cycled to fill out the table.
#------------------------------------------------------------------
	global colors

	if {$count < 1} { set count [llength $colornames]; }
	upvar $tablename lut
	vtkLookupTable lut
	lut SetNumberOfColors $count
		# Specify the number of values (i.e., colors) in the lookup
		# table. This method simply allocates memory and prepares the
		# table for use with SetTableValue(). It differs from Build()
		# method in that the allocated memory is not initialized
		# according to HSVA ramps.
	lut SetTableRange 0 [expr $count - 1]
		# Declared as "void SetTableRange(float r[2]);" in
		# vtkLookupTable.h.  I found source for it in 
		# vtkLookupTable.cxx that looks like this, in part:
		#   void  vtkLookupTable::SetTableRange(float min, float max)
		#   { this->TableRange[0] = min; this->TableRange[1] = max; }
	lut Build
		# Build is a virtual function inherited from vtkScalarsToColors
		# class, where it's declared as "virtual void Build() {};".
		# The actual source for it is in vtkLookupTable.cxx.
		# Using pre-established (perhaps default) values for
		# HueRange, SaturationRange, ValueRange, and AlphaRange,
		# it builds the specified set of colors (see SetNumberOfColors
		# and SetTableRange above).
	set ix 0; # Color table index.
	set jx 0; # Color name index.
	while {$ix < $count} {
		set name [lindex $colornames $jx]
		incr jx
		if {$jx == [llength $colornames]} { set jx 0; }
		if {![info exists colors($name)]} {
			puts "ERROR: Color $name is not defined."
			exit 1
		}
		set cmd "lut SetTableValue $ix $colors($name) 1"
		eval $cmd
			# SetTableValue expects 5 arguments:
			# 1.	The index (relative 0) of the colortable entry
			#	to be set.
			# 2.	The red component of the RGB value.
			#	A number from 0 to 1.
			# 3.	The green component of the RGB value.
			#	A number from 0 to 1.
			# 4.	The blue component of the RGB value.
			#	A number from 0 to 1.
			# 5.	The alpha, or transparency, component.
			#	A number from 0 to 1, 1 being totally opaque.
		incr ix
	}
} ;# End tablecolors.

go.tcl:
............................................................................
#!/usr/bin/tcl
#-----------------------------------------------------------------------
# Description:  This Tcl script can be sourced to get the typical
# vtk code to start the interactor, and to display the final image.
#-----------------------------------------------------------------------
# Changelog:
# 991013 Smitty created.
#-----------------------------------------------------------------------
iren SetUserMethod {wm deiconify .vtkInteract}; # Enable user interactor.
iren Initialize; # render the image
wm withdraw .;  # prevent tk window from showing up, then start the event loop.



-----------------------------------------------------------------------------
This is the private VTK discussion list.  Please keep messages on-topic.
Check the FAQ at: <http://www.automatrix.com/cgi-bin/vtkfaq>
To UNSUBSCRIBE, send message body containing "unsubscribe vtkusers" to
<majordomo at gsao.med.ge.com>.  For help, send message body containing
"info vtkusers" to the same address.     Live long and prosper.
-----------------------------------------------------------------------------




More information about the vtkusers mailing list