2
$\begingroup$

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?

$\endgroup$
  • 1
    $\begingroup$ Related Add scalar * view_direction_vector to result of region2d to 3d location. $\endgroup$ – batFINGER Dec 18 '18 at 9:50
  • $\begingroup$ 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 $\endgroup$ – Jayanam Dec 18 '18 at 10:10
  • 2
    $\begingroup$ 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(). $\endgroup$ – batFINGER Dec 18 '18 at 10:57
  • 2
    $\begingroup$ Sheet man... If you are in 2.8 use @ instead of * $\endgroup$ – batFINGER Dec 18 '18 at 11:41
  • 1
    $\begingroup$ @batFINGER Oh man, that's it, you saved me! $\endgroup$ – Jayanam Dec 18 '18 at 11:44
2
$\begingroup$

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)
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.