Changeset 3176


Ignore:
Timestamp:
Sep 20, 2012 2:00:34 PM (8 years ago)
Author:
ldelgass
Message:

Use arcball camera in heightmap viewer, update quat entries on camera tab when
rotating.

Location:
branches/nanovis2/gui/scripts
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/nanovis2/gui/scripts/flowvisviewer.tcl

    r3009 r3176  
    14421442                    set q [$_arcball rotate $x $y $_click(x) $_click(y)]
    14431443                    foreach { _view(qw) _view(qx) _view(qy) _view(qz) } $q break
     1444                    set _settings($this-qw) $_view(qw)
     1445                    set _settings($this-qx) $_view(qx)
     1446                    set _settings($this-qy) $_view(qy)
     1447                    set _settings($this-qz) $_view(qz)
    14441448                    SendCmd "camera orient $q"
    14451449                } else {
  • branches/nanovis2/gui/scripts/heightmapviewer.tcl

    r2744 r3176  
    9797    private method EventuallyResize { w h }
    9898
     99    private variable _arcball ""
     100    private variable _useArcball 1
    99101    private variable _outbuf       ;# buffer for outgoing commands
    100102
     
    160162    # Initialize the view to some default parameters.
    161163    array set _view {
     164        qw      0.853553
     165        qx      -0.353553
     166        qy      0.353553
     167        qz      0.146447
    162168        theta   45
    163169        phi     45
     
    167173        pan-y   0
    168174    }
     175    set _arcball [blt::arcball create 100 100]
     176    set q [list $_view(qw) $_view(qx) $_view(qy) $_view(qz)]
     177    $_arcball quaternion $q
     178
    169179    foreach val {xmin xmax ymin ymax zmin zmax vmin vmax} {
    170180        set _limits($val) ""
    171181    }
    172182    array set _settings [subst {
    173         $this-pan-x             $_view(pan-x)
    174         $this-pan-y             $_view(pan-y)
     183        $this-qw                $_view(qw)
     184        $this-qx                $_view(qx)
     185        $this-qy                $_view(qy)
     186        $this-qz                $_view(qz)
    175187        $this-phi               $_view(phi)
    176188        $this-psi               $_view(psi)
    177189        $this-theta             $_view(theta)
     190        $this-pan-x             $_view(pan-x)
     191        $this-pan-y             $_view(pan-y)
    178192        $this-surface           1
    179193        $this-xcutplane         0
     
    321335    image delete $_image(legend)
    322336    image delete $_image(download)
     337    catch { blt::arcball destroy $_arcball }
    323338}
    324339
     
    753768    set w [winfo width $itk_component(3dview)]
    754769    set h [winfo height $itk_component(3dview)]
     770    $_arcball resize $w $h
    755771    EventuallyResize $w $h
    756772
     
    813829    }
    814830    # Reset the camera and other view parameters
     831    set _settings($this-qw)    $_view(qw)
     832    set _settings($this-qx)    $_view(qx)
     833    set _settings($this-qy)    $_view(qy)
     834    set _settings($this-qz)    $_view(qz)
    815835    set _settings($this-theta) $_view(theta)
    816836    set _settings($this-phi)   $_view(phi)
     
    820840    set _settings($this-zoom)  $_view(zoom)
    821841
    822     set xyz [Euler2XYZ $_view(theta) $_view(phi) $_view(psi)]
    823     SendCmd "camera angle $xyz"
     842    if {$_useArcball} {
     843        set q [list $_view(qw) $_view(qx) $_view(qy) $_view(qz)]
     844        $_arcball quaternion $q
     845        SendCmd "camera orient $q"
     846    } else { 
     847        set xyz [Euler2XYZ $_view(theta) $_view(phi) $_view(psi)]
     848        SendCmd "camera angle $xyz"
     849    }
    824850    PanCamera
    825851    SendCmd "camera zoom $_view(zoom)"
     
    864890        "reset" {
    865891            array set _view {
     892                qw      0.853553
     893                qx      -0.353553
     894                qy      0.353553
     895                qz      0.146447
    866896                theta   45
    867897                phi     45
     
    877907                }
    878908            }
    879             set xyz [Euler2XYZ $_view(theta) $_view(phi) $_view(psi)]
    880             SendCmd "camera angle $xyz"
     909            if {$_useArcball} {
     910                set q [list $_view(qw) $_view(qx) $_view(qy) $_view(qz)]
     911                $_arcball quaternion $q
     912                SendCmd "camera orient $q"
     913            } else {
     914                set xyz [Euler2XYZ $_view(theta) $_view(phi) $_view(psi)]
     915                SendCmd "camera angle $xyz"
     916            }
    881917            PanCamera
     918            set _settings($this-qw)    $_view(qw)
     919            set _settings($this-qx)    $_view(qx)
     920            set _settings($this-qy)    $_view(qy)
     921            set _settings($this-qz)    $_view(qz)
    882922            set _settings($this-theta) $_view(theta)
    883923            set _settings($this-phi) $_view(phi)
     
    9771017                }
    9781018
    979                 #
    980                 # Rotate the camera in 3D
    981                 #
    982                 if {$_view(psi) > 90 || $_view(psi) < -90} {
    983                     # when psi is flipped around, theta moves backwards
    984                     set dy [expr {-$dy}]
     1019                if {$_useArcball} {
     1020                    set q [$_arcball rotate $x $y $_click(x) $_click(y)]
     1021                    foreach { _view(qw) _view(qx) _view(qy) _view(qz) } $q break
     1022                    set _settings($this-qw) $_view(qw)
     1023                    set _settings($this-qx) $_view(qx)
     1024                    set _settings($this-qy) $_view(qy)
     1025                    set _settings($this-qz) $_view(qz)
     1026                    SendCmd "camera orient $q"
     1027                } else {
     1028                    #
     1029                    # Rotate the camera in 3D
     1030                    #
     1031                    if {$_view(psi) > 90 || $_view(psi) < -90} {
     1032                        # when psi is flipped around, theta moves backwards
     1033                        set dy [expr {-$dy}]
     1034                    }
     1035                    set theta [expr {$_view(theta) - $dy*180}]
     1036                    while {$theta < 0} { set theta [expr {$theta+180}] }
     1037                    while {$theta > 180} { set theta [expr {$theta-180}] }
     1038
     1039                    if {abs($theta) >= 30 && abs($theta) <= 160} {
     1040                        set phi [expr {$_view(phi) - $dx*360}]
     1041                        while {$phi < 0} { set phi [expr {$phi+360}] }
     1042                        while {$phi > 360} { set phi [expr {$phi-360}] }
     1043                        set psi $_view(psi)
     1044                    } else {
     1045                        set phi $_view(phi)
     1046                        set psi [expr {$_view(psi) - $dx*360}]
     1047                        while {$psi < -180} { set psi [expr {$psi+360}] }
     1048                        while {$psi > 180} { set psi [expr {$psi-360}] }
     1049                    }
     1050
     1051                    set _view(theta)        $theta
     1052                    set _view(phi)          $phi
     1053                    set _view(psi)          $psi
     1054                    set xyz [Euler2XYZ $_view(theta) $_view(phi) $_view(psi)]
     1055                    set _settings($this-theta) $_view(theta)
     1056                    set _settings($this-phi) $_view(phi)
     1057                    set _settings($this-psi) $_view(psi)
     1058                    SendCmd "camera angle $xyz"
    9851059                }
    986                 set theta [expr {$_view(theta) - $dy*180}]
    987                 while {$theta < 0} { set theta [expr {$theta+180}] }
    988                 while {$theta > 180} { set theta [expr {$theta-180}] }
    989 
    990                 if {abs($theta) >= 30 && abs($theta) <= 160} {
    991                     set phi [expr {$_view(phi) - $dx*360}]
    992                     while {$phi < 0} { set phi [expr {$phi+360}] }
    993                     while {$phi > 360} { set phi [expr {$phi-360}] }
    994                     set psi $_view(psi)
    995                 } else {
    996                     set phi $_view(phi)
    997                     set psi [expr {$_view(psi) - $dx*360}]
    998                     while {$psi < -180} { set psi [expr {$psi+360}] }
    999                     while {$psi > 180} { set psi [expr {$psi-360}] }
    1000                 }
    1001 
    1002                 set _view(theta)        $theta
    1003                 set _view(phi)          $phi
    1004                 set _view(psi)          $psi
    1005                 set xyz [Euler2XYZ $_view(theta) $_view(phi) $_view(psi)]
    1006                 set _settings($this-theta) $_view(theta)
    1007                 set _settings($this-phi) $_view(phi)
    1008                 set _settings($this-psi) $_view(psi)
    1009                 SendCmd "camera angle $xyz"
    10101060                set _click(x) $x
    10111061                set _click(y) $y
     
    11921242}
    11931243
    1194 
    1195 
    11961244#  camera --
    11971245#
     
    12181266                    set xyz [Euler2XYZ $_view(theta) $_view(phi) $_view(psi)]
    12191267                    SendCmd "camera angle $xyz"
     1268                    if {$_useArcball} {
     1269                        $_arcball euler [list [expr {-[lindex $xyz 2]}] [expr {-[lindex $xyz 1]}] [expr {-[lindex $xyz 0]}]]
     1270                        set q [$_arcball quaternion]
     1271                        foreach { _view(qw) _view(qx) _view(qy) _view(qz) } $q break
     1272                        set _settings($this-qw) $_view(qw)
     1273                        set _settings($this-qx) $_view(qx)
     1274                        set _settings($this-qy) $_view(qy)
     1275                        set _settings($this-qz) $_view(qz)
     1276                    }
     1277                }
     1278                "qx" - "qy" - "qz" - "qw" {
     1279                    set q [list $_view(qw) $_view(qx) $_view(qy) $_view(qz)]
     1280                    $_arcball quaternion $q
     1281                    SendCmd "camera orient $q"
    12201282                }
    12211283                "zoom" {
     
    13001362    $inner configure -borderwidth 4
    13011363
    1302     set labels { phi theta psi pan-x pan-y zoom }
     1364    if {$_useArcball} {
     1365        set labels { qw qx qy qz pan-x pan-y zoom }
     1366    } else {
     1367        set labels { phi theta psi pan-x pan-y zoom }
     1368    }
    13031369    set row 1
    13041370    foreach tag $labels {
     
    13281394    set _width $w
    13291395    set _height $h
     1396    $_arcball resize $w $h
    13301397    if { !$_resizePending } {
    13311398        $_dispatcher event -after 200 !resize
  • branches/nanovis2/gui/scripts/nanovisviewer.tcl

    r3175 r3176  
    11081108                    set q [$_arcball rotate $x $y $_click(x) $_click(y)]
    11091109                    foreach { _view(qw) _view(qx) _view(qy) _view(qz) } $q break
     1110                    set _settings($this-qw) $_view(qw)
     1111                    set _settings($this-qx) $_view(qx)
     1112                    set _settings($this-qy) $_view(qy)
     1113                    set _settings($this-qz) $_view(qz)
    11101114                    SendCmd "camera orient $q"
    11111115                } else {
Note: See TracChangeset for help on using the changeset viewer.