You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
2.7 KiB
111 lines
2.7 KiB
2 years ago
|
package require vtk
|
||
|
package require vtkinteraction
|
||
|
|
||
|
|
||
|
# use a sphere as a basis of the shape
|
||
|
vtkSphereSource sphere
|
||
|
sphere SetPhiResolution 40
|
||
|
sphere SetThetaResolution 40
|
||
|
sphere Update
|
||
|
|
||
|
set sphereData [sphere GetOutput]
|
||
|
|
||
|
# create a data array to hold the weighting coefficients
|
||
|
vtkFloatArray tfarray
|
||
|
set npoints [$sphereData GetNumberOfPoints]
|
||
|
tfarray SetNumberOfComponents 2
|
||
|
tfarray SetNumberOfTuples $npoints
|
||
|
|
||
|
# parameterize the sphere along the z axis, and fill the weights
|
||
|
# with (1.0-a, a) to linearly interpolate across the shape
|
||
|
for {set i 0} {$i < $npoints} {incr i} {
|
||
|
set pt [$sphereData GetPoint $i]
|
||
|
set x [lindex $pt 0]
|
||
|
set y [lindex $pt 1]
|
||
|
set z [lindex $pt 2]
|
||
|
#foreach {x y z} $pt {}
|
||
|
|
||
|
# -0.5 < z < 0.5
|
||
|
set zn [expr $z + 0.5]
|
||
|
set zn1 [expr 1.0 - $zn]
|
||
|
if {$zn > 1.0} {set zn 1.0}
|
||
|
if {$zn1 < 0.0} {set zn1 0.0}
|
||
|
|
||
|
tfarray SetComponent $i 0 $zn1
|
||
|
tfarray SetComponent $i 1 $zn
|
||
|
}
|
||
|
|
||
|
# create field data to hold the array, and bind it to the sphere
|
||
|
vtkFieldData fd
|
||
|
tfarray SetName "weights"
|
||
|
[$sphereData GetPointData] AddArray tfarray
|
||
|
|
||
|
# use an ordinary transform to stretch the shape
|
||
|
vtkTransform stretch
|
||
|
stretch Scale 1 1 3.2
|
||
|
|
||
|
vtkTransformFilter stretchFilter
|
||
|
stretchFilter SetInput $sphereData
|
||
|
stretchFilter SetTransform stretch
|
||
|
|
||
|
# now, for the weighted transform stuff
|
||
|
vtkWeightedTransformFilter weightedTrans
|
||
|
|
||
|
# create two transforms to interpolate between
|
||
|
vtkTransform identity
|
||
|
identity Identity
|
||
|
|
||
|
vtkTransform rotated
|
||
|
set rotatedAngle 45
|
||
|
rotated RotateX $rotatedAngle
|
||
|
|
||
|
weightedTrans SetNumberOfTransforms 2
|
||
|
weightedTrans SetTransform identity 0
|
||
|
weightedTrans SetTransform rotated 1
|
||
|
# which data array should the filter use ?
|
||
|
weightedTrans SetWeightArray "weights"
|
||
|
|
||
|
weightedTrans SetInputConnection [stretchFilter GetOutputPort]
|
||
|
|
||
|
vtkPolyDataMapper weightedTransMapper
|
||
|
weightedTransMapper SetInputConnection [weightedTrans GetOutputPort]
|
||
|
vtkActor weightedTransActor
|
||
|
weightedTransActor SetMapper weightedTransMapper
|
||
|
[weightedTransActor GetProperty] SetDiffuseColor 0.8 0.8 0.1
|
||
|
[weightedTransActor GetProperty] SetRepresentationToSurface
|
||
|
|
||
|
|
||
|
# create simple poly data so we can apply glyph
|
||
|
|
||
|
#
|
||
|
# Create the rendering stuff
|
||
|
#
|
||
|
vtkRenderer ren1
|
||
|
vtkRenderWindow renWin
|
||
|
renWin AddRenderer ren1
|
||
|
vtkRenderWindowInteractor iren
|
||
|
iren SetRenderWindow renWin
|
||
|
|
||
|
ren1 AddActor weightedTransActor
|
||
|
ren1 SetBackground 0.1 0.2 0.5
|
||
|
renWin SetSize 300 300
|
||
|
|
||
|
ren1 ResetCamera
|
||
|
[ren1 GetActiveCamera] Azimuth 90
|
||
|
[ren1 GetActiveCamera] Dolly 1
|
||
|
# Get handles to some useful objects
|
||
|
#
|
||
|
iren AddObserver UserEvent {wm deiconify .vtkInteract}
|
||
|
renWin Render
|
||
|
|
||
|
# prevent the tk window from showing up then start the event loop
|
||
|
|
||
|
proc cmd {s} {
|
||
|
rotated Identity
|
||
|
rotated RotateX $s
|
||
|
renWin Render
|
||
|
}
|
||
|
cmd $rotatedAngle
|
||
|
|
||
|
wm withdraw .
|