2

I have an addon with that I draw in 3d space (lines). The vertices are where I click with the mouse cursor.

enter image description here

I use the region_2d_to_location to get a point from the mouse coordinates in 3d space. But I want to draw a bit more "in front" like 2 or 3 units in direction of the view camera (hope this is understandable:-))

I guess I have to manipulate the last parameter of the region_2d_to_location function, but how to calculate this location dependant on the current view?

I guess I can use the

bpy.context.space_data.region_3d.view_rotation

and then kind of multiply a vector like (2,2,2) with it to draw in a distance to the origin. Any ideas on how to do this with this Quaterion?

Jayanam
  • 665
  • 3
  • 18
  • 1
    Related Add scalar * view_direction_vector to result of region2d to 3d location. – batFINGER Dec 18 '18 at 09:50
  • I can get the view_direction like this: dir = bpy.context.space_data.region_3d.view_rotation * mathutils.Vector((0,0,-1))
                vec = region_2d_to_location_3d(region, rv3d, (x, y), (0,0,0))
    
                vec += 2.0 * dir  // but a quaternion cant be added to a vector
    
    – Jayanam Dec 18 '18 at 10:10
  • 2
    Oh really? Please re-check. Both dir and vec as stated above are vectors. r3d.view_rotation is a quaternion. A quaternion * vector => vector. Make dir a unit vector vec -= 2 * dir.normalized(). – batFINGER Dec 18 '18 at 10:57
  • Here is the code:

    rot = bpy.context.space_data.region_3d.view_rotation

    vec = region_2d_to_location_3d(region, rv3d, (x, y), (0,0,0))

    dir = rot * mathutils.Vector([0,0,-1])

    error: Element-wise multiplication not supported between Quaterion and vector types

    – Jayanam Dec 18 '18 at 11:40
  • 2
    Sheet man... If you are in 2.8 use @ instead of * – batFINGER Dec 18 '18 at 11:41
  • 1
    @batFINGER Oh man, that's it, you saved me! – Jayanam Dec 18 '18 at 11:44

1 Answers1

3

Thx to @batFINGER, here is the code that works (@ is important for multiplying Quaternion and Vector in Blender 2.8):

rot = bpy.context.space_data.region_3d.view_rotation

# Instead of adding it to the vector that is returned by region_2d_to_location_3d
# I pass it to the method as last argument
dir = rot @ mathutils.Vector((0,0,-1))
dir = dir.normalized() * -2.0

vec = region_2d_to_location_3d(region, rv3d, (x, y), dir)
Jayanam
  • 665
  • 3
  • 18