[Bf-python] New Mathutils and old Math - Letter rip.

Campbell Barton cbarton at metavr.com
Wed Sep 28 02:29:39 CEST 2005


Hi, quick message.
I was using LetterRips function to get the worldspace coords for the 
mouse in the 3d view. as used by the sculpt mesh script.
Recently I found that it stopped working in perspective mode, is awyone 
aware of why this might happen?

Im not sure exactly when this happened but it was definetly working 
after the Mathutils update that deprecated a lot of things, because I 
modified it to work with the new mathutils.

Somehow its broken, I tested sculpt_mesh_tablet25.zip and thats also 
broken in perspective mode, so thaught I post.

- Cam

______________ LetterRips Very usefull function for getting mouse 
coords/vector in 3d space.

def getMouseLocalCoordinates(screen_x, screen_y, useMid = False):
   
    def sub_v3v3 (vector1, vector2):
        return [vector1[0]-vector2[0], vector1[1]-vector2[1], 
vector1[2]-vector2[2]]
   
    def dot_v3v3 (vector1, vector2):
        return vector1[0]*vector2[0] + vector1[1]*vector2[1] + 
vector1[2]*vector2[2]
   
    def scale_v3s (vector, scalar):
        return [vector[0]*scalar, vector[1]*scalar, vector[2]*scalar]   
   
    def normalize_v3 (vector):
        length = math.sqrt (dot_v3v3 (vector, vector))
        if length != 0.0:    return scale_v3s (vector, 1.0/length)
        return [0.0, 0.0, 0.0]
   
    for win3d in Window.GetScreenInfo(Window.Types.VIEW3D):

        win_min_x, win_min_y, win_max_x, win_max_y = win3d.get('vertices')

        win_mid_x  = (win_max_x + win_min_x + 1.0) * 0.5
        win_mid_y  = (win_max_y + win_min_y + 1.0) * 0.5
        win_size_x = (win_max_x - win_min_x + 1.0) * 0.5
        win_size_y = (win_max_y - win_min_y + 1.0) * 0.5

        if useMid == True:
            screen_x = win_mid_x
            screen_y = win_mid_y
        if (win_max_x > screen_x > win_min_x) and (  win_max_y > 
screen_y > win_min_y):
            Window.QHandle(win3d.get('id'))

            vmi  = Window.GetViewMatrix(); vmi.invert() #should be done 
outside of the loop
            pm   = Window.GetPerspMatrix() #also outside of loop
            pmi  = Window.GetPerspMatrix(); pmi.invert() #also outside 
of loop

            epsilon = 1e-3

            if (1.0 - epsilon < pmi[3][3] < 1.0 + epsilon):

                hms = Vector([(screen_x-win_mid_x) / win_size_x, 
(screen_y-win_mid_y) / win_size_y, 0.0,1.0])
                #p=VecMultMat(hms,pmi)
                p = hms * pmi
               
                d=Vector(list(Window.GetViewVector())+[0.0])

            else:

                dxy=[pm[3][3]*(((screen_x-win_min_x)/win_size_x)-1.0) - 
pm[3][0],
                        
 pm[3][3]*(((screen_y-win_min_y)/win_size_y)-1.0) - pm[3][1]]


                fp=Vector([pmi[0][0]*dxy[0]+pmi[1][0]*dxy[1],
                    pmi[0][1]*dxy[0]+pmi[1][1]*dxy[1],
                    pmi[0][2]*dxy[0]+pmi[1][2]*dxy[1]])
               
                p=Vector([vmi[3][0],vmi[3][1],vmi[3][2],vmi[3][3]])
                d=Vector(normalize_v3(sub_v3v3(p, fp))+[0.0])

            return True,p,d
        else:
            return False,Vector(),Vector()



-- 
Campbell J Barton

133 Hope Street
Geelong West, Victoria 3218 Australia

URL:    http://www.metavr.com
e-mail: cbarton at metavr.com
phone: AU (03) 5229 0241



More information about the Bf-python mailing list