Thread: [PyOpenGL-Users] small bug: tkScale() and `distance' < 0
Brought to you by:
mcfletch
From: Maciej K. <ma...@dg...> - 2003-02-20 14:05:08
|
There's a small bug/feature in the Opengl class' tkScale() method. There is no guarantee that "0.01 * (event.y - self.ymouse)" will be < 1... in fact, if you move the mouse fast enough, it is possible for it to be larger than 1, giving `scale' < 0. This causes the eye point to whip past the centerpoint (i.e., the point being looked at) and look at it from behind. -- "A friend to all is a friend to none." -- Aristotle |
From: Mike C. F. <mcf...@ro...> - 2003-05-01 02:28:34
|
Okay, I just fixed this one. I didn't do anything fancy, just limited total scaling to within 1:1000 through 1000:1 of current scale. I'm unable to provoke the situation of pushing past the focus point with the current code, though I could imagine having it occur just through successively scaling in so that the scale just disappears entirely (i.e. the floating-point value becomes so small as to be effectively 0), but if you're zooming in that far, well, expect problems. Enjoy all, Mike Maciej Kalisiak wrote: >There's a small bug/feature in the Opengl class' tkScale() method. There is no >guarantee that "0.01 * (event.y - self.ymouse)" will be < 1... in fact, if you >move the mouse fast enough, it is possible for it to be larger than 1, giving >`scale' < 0. This causes the eye point to whip past the centerpoint (i.e., the >point being looked at) and look at it from behind. > > _______________________________________ Mike C. Fletcher Designer, VR Plumber, Coder http://members.rogers.com/mcfletch/ |
From: Maciej K. <ma...@cs...> - 2003-09-20 19:30:53
|
(Blast from the past.) On Wed, Apr 30, 2003 at 09:55:12PM -0400, Mike C. Fletcher wrote: > Okay, I just fixed this one. I didn't do anything fancy, just limited > total scaling to within 1:1000 through 1000:1 of current scale. I'm > unable to provoke the situation of pushing past the focus point with the > current code, though I could imagine having it occur just through > successively scaling in so that the scale just disappears entirely (i.e. > the floating-point value becomes so small as to be effectively 0), but > if you're zooming in that far, well, expect problems. I've been doing some stuff on my own version of OpenGL window (OpenGL embedded in wxPython window, with whole bunch of extra defaul functionality), and I ended up revisiting how my code does scaling. I found a scaling/zooming method which IMHO works better. currently tkScale() does this: scale = 1 - 0.01 * (event.y - self.ymouse) self.distance = self.distance * scale what I think works/*feels* better: scaler_speed = 0.98 dist = event.y - self.ymouse scale = scaler_speed ** dist self.distance *= scale you might also want to put in a threshold so that you can't go down to scale = 0, which would be unescapable. # make sure that `eye_dist' doesn't hit 0, else we won't be able to # zoom out zero_thresh = 0.0001 if self.distance < zero_thresh: self.distance = zero_thresh Benefits of new method: * no hysterisis: as long as you keep the mouse button down, each mouse position corresponds to a unique zoom setting, no matter how you move the mouse to that position; (this might not be so clear, so here's a more practical example: put mouse in center of screen, hold mouse button down for zooming, go crazy with the mouse, move it everywhere, bring it back to center: you'll be at the original zoom level.) * the bug from the OT is impossible here * it might be just me, but the zooming speed at various zoom-in levels feels more resonable and comfortable. -- Maciej Kalisiak|mac@] "The person who says it cannot be done should not dgp.toronto.edu|www.] interrupt the person doing it." -- Chinese Proverb dgp.toronto.edu/~mac] |