xform.tcl
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:6k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. ######################################################################
  2. #
  3. # xform.tcl
  4. # created 2/7/99  magi, wsh
  5. #
  6. # manage ui for manually specifying 3d transformations
  7. #
  8. ######################################################################
  9. proc matrixXformUI {} {
  10.     global __xfo
  11.     set xfd [_matrixXformDialog __xfd]
  12.     grab set $xfd
  13.     tkwait window $xfd
  14. }
  15. proc _matrixXformDialog {result} {
  16.     toplevel .xfo
  17.     wm title .xfo "Specify transform for mesh [globalset theMesh]"
  18.     wm resizable .xfo 0 0
  19.     label .xfo.l -text "Transformation matrix:" 
  20. -anchor w
  21.     set to [createMatrixEntry [frame .xfo.tomat]]
  22.     radiobutton .xfo.abs -text "Absolute" -anchor w 
  23. -variable _matxform_mode -value abs
  24.     radiobutton .xfo.rel -text "Relative to current" -anchor w 
  25. -variable _matxform_mode -value relcur
  26.     radiobutton .xfo.relto -text "Relative to:" -anchor w
  27. -variable _matxform_mode -value relto
  28.     globalset _matxform_mode abs
  29.     set rel [createMatrixEntry [frame .xfo.relmat]]
  30.     frame .xfo.go
  31.     button .xfo.go.go -text OK 
  32. -command {
  33.     set mat [getMatrixEntries .xfo.tomat]
  34.     if {$_matxform_mode == "abs"} {
  35. scz_xform_scan [globalset theMesh] matrix $mat
  36.     } elseif {$_matxform_mode == "relcur"} {
  37. scz_xform_scan [globalset theMesh] matrix $mat relative
  38.     } else {
  39. set mat2 [getMatrixEntries .xfo.relmat]
  40. scz_xform_scan [globalset theMesh] matrix $mat $mat2
  41.     }
  42.     destroy .xfo
  43. }
  44.     button .xfo.go.no -text Cancel 
  45. -command "destroy .xfo"
  46.     packchildren .xfo.go -side left -fill x -expand 1
  47.     packchildren .xfo -side top -anchor w -fill x -expand 1
  48.     return .xfo
  49. }
  50. # manualXFormUI
  51. # a note about the actual transformations -- each rotation is performed
  52. # as a seperate rotation (x, y, then z), so you'll have to undo 3 times
  53. # if you rotate around all axes to return to the original position
  54. proc manualXFormUI {} {
  55.     if [window_Activate .manxform] return
  56.     set mxf [toplevel .manxform]
  57.     wm title $mxf "Manual Transform"
  58.     wm resizable $mxf 0 0
  59.     window_Register $mxf
  60.     radiobutton $mxf.moveViewer -text "Move Viewer" 
  61. -variable theMover -value viewer -anchor w -padx 8
  62.     radiobutton $mxf.moveMesh -text "Move Mesh" 
  63. -variable theMover -value mesh -anchor w -padx 8
  64.     label $mxf.rr -text "Rotation (x, y, z)" -anchor w -pady 6
  65.     frame $mxf.rot
  66.     entry $mxf.rot.x -textvariable rx -relief sunken -width 4
  67.     entry $mxf.rot.y -textvariable ry -relief sunken -width 4
  68.     entry $mxf.rot.z -textvariable rz -relief sunken -width 4
  69.     frame $mxf.tra
  70.     label $mxf.tt -text "Translation (x, y, z)" -anchor w -pady 6
  71.     entry $mxf.tra.x -textvariable tx -relief sunken -width 4
  72.     entry $mxf.tra.y -textvariable ty -relief sunken -width 4
  73.     entry $mxf.tra.z -textvariable tz -relief sunken -width 4
  74.     button $mxf.go -text "OK" -command {
  75. plv_manrotate $rx $ry $rz
  76. plv_mantranslate $tx $ty $tz
  77. redraw 1
  78.     }
  79.     frame $mxf.line -height 3 -relief sunken -borderwidth 2
  80.     button $mxf.rc -text "Reset camera Xform" -command {
  81. plv_resetxform
  82.     }
  83.     button $mxf.cl -text "Clear entries" -command {
  84. .manxform.rot.x delete 0 255;
  85. .manxform.rot.y delete 0 255;
  86. .manxform.rot.z delete 0 255;
  87. .manxform.tra.x delete 0 255;
  88. .manxform.tra.y delete 0 255;
  89. .manxform.tra.z delete 0 255;
  90.     }
  91.     pack $mxf.moveViewer -side top
  92.     pack $mxf.moveMesh -side top
  93.     
  94.     pack $mxf.rr -anchor w -fill x -side top
  95.     pack $mxf.rot.x $mxf.rot.y $mxf.rot.z -side left
  96.     pack $mxf.rot -side top -anchor w -padx 20
  97.     
  98.     pack $mxf.tt -anchor w -fill x -side top
  99.     pack $mxf.tra.x $mxf.tra.y $mxf.tra.z -side left
  100.     pack $mxf.tra -side top -anchor w -padx 20
  101.     pack $mxf.go -pady 2
  102.     pack $mxf.line -side top -fill x -pady 4
  103.     pack $mxf.rc $mxf.cl -side top -padx 2 -pady 2
  104.     bind $mxf <KeyPress-Return> {
  105. plv_manrotate $rx $ry $rz
  106. plv_mantranslate $tx $ty $tz
  107. redraw 1
  108.     }
  109. }
  110. proc createMatrixEntry {parent {entries ""}} {
  111.     set mat [frame $parent.xf -relief groove -border 3]
  112.     for {set i 0} {$i < 4} {incr i} {
  113. set f [frame $mat.row$i]
  114. for {set j 0} {$j < 4} {incr j} {
  115.     set ord [expr 4 * $i + $j]
  116.     set e [entry $f.c$j -width 6]
  117.     if {$ord < [llength $entries]} {
  118. $e insert [lindex $entries $ord]
  119.     } elseif {$i == $j} {
  120. $e insert 0 1.0
  121.     } else {
  122. $e insert 0 0.0
  123.     }
  124. }
  125. packchildren $f -side left
  126.     }
  127.     
  128.     packchildren $mat -side top
  129.     set b [frame $parent.buttons]
  130.     button $b.ident -text "Identity" 
  131. -anchor w -padx 2 -pady 2 
  132. -command "makeMatrixIdentity $parent"
  133.     button $b.load -text "Load .xf file" 
  134. -anchor w -padx 2 -pady 2 
  135. -command "browseMatrixFile $parent"
  136.     packchildren $b -side top -anchor n -fill x
  137.     packchildren $parent -side left
  138.     return $mat
  139. }
  140. proc getMatrixEntries {mat} {
  141.     set mat $mat.xf
  142.     for {set j 0} {$j < 4} {incr j} {
  143. for {set i 0} {$i < 4} {incr i} {
  144.     set entry $mat.row$i.c$j
  145.     set val [$entry get]
  146.     lappend result " $val"
  147. }
  148.     }
  149.     return $result
  150. }
  151. proc makeMatrixIdentity {mat} {
  152.     set mat $mat.xf
  153.     for {set i 0} {$i < 4} {incr i} {
  154. set f $mat.row$i
  155. for {set j 0} {$j < 4} {incr j} {
  156.     set ord [expr 4 * $i + $j]
  157.     set e $f.c$j
  158.     $e delete 0 end
  159.     if {$i == $j} {
  160. $e insert 0 1.0
  161.     } else {
  162. $e insert 0 0.0
  163.     }
  164. }
  165.     }
  166. }
  167. proc makeMatrixXffile {mat file} {
  168.     set mat $mat.xf
  169.     set FILE [open $file r]
  170.     for {set i 0} {$i < 4} {incr i} {
  171. set line [gets $FILE]
  172. set f $mat.row$i
  173. for {set j 0} {$j < 4} {incr j} {
  174.     set ord [expr 4 * $i + $j]
  175.     set e $f.c$j
  176.     $e delete 0 end
  177.     $e insert 0 [lindex $line $j]
  178. }
  179.     }
  180.     close $FILE
  181. }
  182. proc browseMatrixFile {mat} {
  183.     set file [tk_getOpenFile -parent $mat 
  184.   -filetypes {{{Transform file} {.xf}}} 
  185.   -title "Choose transform file"]
  186.     if {$file != ""} {
  187. makeMatrixXffile $mat $file
  188.     }
  189. }
  190. proc showCurrentScanXform {mode} {
  191.     set mesh [globalset theMesh]
  192.     set res [scz_get_scan_xform $mesh $mode]
  193.     puts "Transform for $mesh:n$res"
  194. }
  195. proc xform_readFromFile {file} {
  196.     set matrix ""
  197.     set FILE [open $file r]
  198.     # need to transpose as we read
  199.     for {set i 0} {$i < 4} {incr i} {
  200. set line [gets $FILE]
  201. for {set j 0} {$j < 4} {incr j} {
  202.     append col$j "[lindex $line $j] "
  203. }
  204.     }
  205.     close $FILE
  206.     for {set j 0} {$j < 4} {incr j} {
  207. append matrix [set col$j]
  208.     }
  209.     return $matrix
  210. }