Python bpy_extras.view3d_utils.region_2d_to_origin_3d() Examples
The following are 16
code examples of bpy_extras.view3d_utils.region_2d_to_origin_3d().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
bpy_extras.view3d_utils
, or try the search function
.
Example #1
Source File: mi_utils_base.py From mifthtools with BSD 3-Clause "New" or "Revised" License | 6 votes |
def get_mouse_raycast(context, objects_list, coords_2d, ray_max=10000.0): region = context.region rv3d = context.region_data best_obj, hit_normal, hit_position = None, None, None best_length_squared = 20000.0 * 20000.0 # get the ray from the viewport and mouse view_vector = view3d_utils.region_2d_to_vector_3d( region, rv3d, coords_2d) ray_origin = view3d_utils.region_2d_to_origin_3d( region, rv3d, coords_2d) for obj, matrix in objects_list: # Do RayCast! t1,t2,t3,t4 - temp values t1, t2, t3 = obj_raycast( obj, matrix, view_vector, ray_origin, ray_max) if t1 is not None and t3 < best_length_squared: best_obj, hit_normal, hit_position = obj, t1, t2 best_length_squared = t3 return best_obj, hit_normal, hit_position # mesh picking from 3d space
Example #2
Source File: mi_utils_base.py From mifthtools with BSD 3-Clause "New" or "Revised" License | 6 votes |
def get_mouse_on_plane(context, plane_pos, plane_dir, mouse_coords): region = context.region rv3d = context.region_data final_dir = plane_dir if plane_dir is None: final_dir = rv3d.view_rotation * Vector((0.0, 0.0, -1.0)) mouse_pos = view3d_utils.region_2d_to_origin_3d(region, rv3d, mouse_coords) mouse_dir = view3d_utils.region_2d_to_vector_3d(region, rv3d, mouse_coords) new_pos = mathu.geometry.intersect_line_plane( mouse_pos, mouse_pos + (mouse_dir * 10000.0), plane_pos, final_dir, False) if new_pos: return new_pos return None # get object local axys
Example #3
Source File: mi_utils_base.py From mifthtools with BSD 3-Clause "New" or "Revised" License | 6 votes |
def get_mouse_raycast(context, objects_list, coords_2d, ray_max=10000.0): region = context.region rv3d = context.region_data best_obj, hit_normal, hit_position = None, None, None best_length_squared = 20000.0 * 20000.0 # get the ray from the viewport and mouse view_vector = view3d_utils.region_2d_to_vector_3d( region, rv3d, coords_2d) ray_origin = view3d_utils.region_2d_to_origin_3d( region, rv3d, coords_2d) for obj, matrix in objects_list: # Do RayCast! t1,t2,t3,t4 - temp values t1, t2, t3 = obj_raycast( obj, matrix, view_vector, ray_origin, ray_max) if t1 is not None and t3 < best_length_squared: best_obj, hit_normal, hit_position = obj, t1, t2 best_length_squared = t3 return best_obj, hit_normal, hit_position # mesh picking from 3d space
Example #4
Source File: mi_utils_base.py From mifthtools with BSD 3-Clause "New" or "Revised" License | 6 votes |
def get_mouse_on_plane(context, plane_pos, plane_dir, mouse_coords): region = context.region rv3d = context.region_data final_dir = plane_dir if plane_dir is None: final_dir = rv3d.view_rotation @ Vector((0.0, 0.0, -1.0)) mouse_pos = view3d_utils.region_2d_to_origin_3d(region, rv3d, mouse_coords) mouse_dir = view3d_utils.region_2d_to_vector_3d(region, rv3d, mouse_coords) new_pos = mathu.geometry.intersect_line_plane( mouse_pos, mouse_pos + (mouse_dir * 10000.0), plane_pos, final_dir, False) if new_pos: return new_pos return None # get object local axys
Example #5
Source File: archipack_manipulator.py From archipack with GNU General Public License v3.0 | 6 votes |
def get_pos3d(self, context): """ convert mouse pos to 3d point over plane defined by origin and normal pt is in world space """ region = context.region rv3d = context.region_data rM = context.active_object.matrix_world.to_3x3() view_vector_mouse = view3d_utils.region_2d_to_vector_3d(region, rv3d, self.mouse_pos) ray_origin_mouse = view3d_utils.region_2d_to_origin_3d(region, rv3d, self.mouse_pos) pt = intersect_line_plane(ray_origin_mouse, ray_origin_mouse + view_vector_mouse, self.origin, rM * self.manipulator.normal, False) # fix issue with parallel plane if pt is None: pt = intersect_line_plane(ray_origin_mouse, ray_origin_mouse + view_vector_mouse, self.origin, view_vector_mouse, False) return pt
Example #6
Source File: archipack_custom.py From archipack with GNU General Public License v3.0 | 6 votes |
def get_pos3d(self, context, normal=Vector((0, 0, 1))): """ convert mouse pos to 3d point over plane defined by origin and normal pt is in world space """ region = context.region rv3d = context.region_data view_vector_mouse = view3d_utils.region_2d_to_vector_3d(region, rv3d, self.mouse_pos) ray_origin_mouse = view3d_utils.region_2d_to_origin_3d(region, rv3d, self.mouse_pos) pt = intersect_line_plane(ray_origin_mouse, ray_origin_mouse + view_vector_mouse, self.origin, normal, False) # fix issue with parallel plane if pt is None: pt = intersect_line_plane(ray_origin_mouse, ray_origin_mouse + view_vector_mouse, self.origin, view_vector_mouse, False) return pt
Example #7
Source File: mesh_carver.py From Fluid-Designer with GNU General Public License v3.0 | 5 votes |
def Pick(context, event, self, ray_max=10000.0): scene = context.scene region = context.region rv3d = context.region_data coord = event.mouse_region_x, event.mouse_region_y view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord) ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord) ray_target = ray_origin + (view_vector * ray_max) def obj_ray_cast(obj, matrix): matrix_inv = matrix.inverted() ray_origin_obj = matrix_inv * ray_origin ray_target_obj = matrix_inv * ray_target success, hit, normal, face_index = obj.ray_cast(ray_origin_obj, ray_target_obj) if success: return hit, normal, face_index else: return None, None, None best_length_squared = ray_max * ray_max best_obj = None for obj in self.CList: matrix = obj.matrix_world hit, normal, face_index = obj_ray_cast(obj, matrix) if hit is not None: hit_world = matrix * hit length_squared = (hit_world - ray_origin).length_squared if length_squared < best_length_squared: best_length_squared = length_squared best_obj = obj hits = hit_world ns = normal fs = face_index if best_obj is not None: return hits, ns, fs else: return None, None, None
Example #8
Source File: drawing.py From addon_common with GNU General Public License v3.0 | 5 votes |
def Point2D_to_Ray(self, p2d): o = Point(region_2d_to_origin_3d(self.rgn, self.r3d, p2d)) d = Direction(region_2d_to_vector_3d(self.rgn, self.r3d, p2d)) return Ray(o, d)
Example #9
Source File: archipack_object.py From archipack with GNU General Public License v3.0 | 5 votes |
def region_2d_to_orig_and_vect(self, context, event): region = context.region rv3d = context.region_data coord = (event.mouse_region_x, event.mouse_region_y) vec = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord) orig = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord) return rv3d.is_perspective, orig, vec
Example #10
Source File: archipack_polylines.py From archipack with GNU General Public License v3.0 | 5 votes |
def _position_3d_from_coord(self, context, coord): """return point in local input coordsys """ region = context.region rv3d = context.region_data view_vector_mouse = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord) ray_origin_mouse = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord) loc = intersect_line_plane(ray_origin_mouse, ray_origin_mouse + view_vector_mouse, Vector((0, 0, 0)), Vector((0, 0, 1)), False) x, y, z = self.coordsys.invert * loc return Vector((x, y, z))
Example #11
Source File: display.py From phobos with BSD 3-Clause "New" or "Revised" License | 5 votes |
def to3d(coords, distance=1.0): """ Args: coords: distance: (Default value = 1.0) Returns: """ # bgl.glUnProject() return view3d_utils.region_2d_to_origin_3d(*getRegionData(), (coords), distance)
Example #12
Source File: viewport.py From BlendLuxCore with GNU General Public License v3.0 | 5 votes |
def mouse_raycast(context, mx, my): r = context.region rv3d = context.region_data coord = mx, my # get the ray from the viewport and mouse view_vector = view3d_utils.region_2d_to_vector_3d(r, rv3d, coord) ray_origin = view3d_utils.region_2d_to_origin_3d(r, rv3d, coord) ray_target = ray_origin + (view_vector * 1000000000) vec = ray_target - ray_origin has_hit, snapped_location, snapped_normal, face_index, object, matrix = bpy.context.scene.ray_cast( bpy.context.view_layer, ray_origin, vec) randoffset = math.pi if has_hit: snapped_rotation = snapped_normal.to_track_quat('Z', 'Y').to_euler() up = Vector((0, 0, 1)) props = bpy.context.scene.luxcoreOL.model if props.randomize_rotation and snapped_normal.angle(up) < math.radians(10.0): randoffset = props.offset_rotation_amount + math.pi + ( random.random() - 0.5) * props.randomize_rotation_amount else: randoffset = props.offset_rotation_amount # we don't rotate this way on walls and ceilings. + math.pi # snapped_rotation.z += math.pi + (random.random() - 0.5) * .2 else: snapped_rotation = mathutils.Quaternion((0, 0, 0, 0)).to_euler() snapped_rotation.rotate_axis('Z', randoffset) return has_hit, snapped_location, snapped_normal, snapped_rotation, face_index, object, matrix
Example #13
Source File: viewport.py From BlendLuxCore with GNU General Public License v3.0 | 5 votes |
def floor_raycast(context, mx, my): r = context.region rv3d = context.region_data coord = mx, my # get the ray from the viewport and mouse view_vector = view3d_utils.region_2d_to_vector_3d(r, rv3d, coord) ray_origin = view3d_utils.region_2d_to_origin_3d(r, rv3d, coord) ray_target = ray_origin + (view_vector * 1000) # various intersection plane normals are needed for corner cases that might actually happen quite often - in front and side view. # default plane normal is scene floor. plane_normal = (0, 0, 1) if math.isclose(view_vector.x, 0, abs_tol=1e-4) and math.isclose(view_vector.z, 0, abs_tol=1e-4): plane_normal = (0, 1, 0) elif math.isclose(view_vector.z, 0, abs_tol=1e-4): plane_normal = (1, 0, 0) snapped_location = mathutils.geometry.intersect_line_plane(ray_origin, ray_target, (0, 0, 0), plane_normal, False) if snapped_location != None: has_hit = True snapped_normal = Vector((0, 0, 1)) face_index = None object = None matrix = None snapped_rotation = snapped_normal.to_track_quat('Z', 'Y').to_euler() props = bpy.context.scene.luxcoreOL.model if props.randomize_rotation: randoffset = props.offset_rotation_amount + math.pi + ( random.random() - 0.5) * props.randomize_rotation_amount else: randoffset = props.offset_rotation_amount + math.pi snapped_rotation.rotate_axis('Z', randoffset) return has_hit, snapped_location, snapped_normal, snapped_rotation, face_index, object, matrix
Example #14
Source File: mesh_carver.py From Fluid-Designer with GNU General Public License v3.0 | 4 votes |
def Picking(context, event): # get the context arguments scene = context.scene region = context.region rv3d = context.region_data coord = event.mouse_region_x, event.mouse_region_y # get the ray from the viewport and mouse view_vector = view3d_utils.region_2d_to_vector_3d(region, rv3d, coord) ray_origin = view3d_utils.region_2d_to_origin_3d(region, rv3d, coord) ray_target = ray_origin + view_vector def visible_objects_and_duplis(): for obj in context.visible_objects: if obj.type == 'MESH': yield (obj, obj.matrix_world.copy()) if obj.dupli_type != 'NONE': obj.dupli_list_create(scene) for dob in obj.dupli_list: obj_dupli = dob.object if obj_dupli.type == 'MESH': yield (obj_dupli, dob.matrix.copy()) obj.dupli_list_clear() def obj_ray_cast(obj, matrix): # get the ray relative to the object matrix_inv = matrix.inverted() ray_origin_obj = matrix_inv * ray_origin ray_target_obj = matrix_inv * ray_target ray_direction_obj = ray_target_obj - ray_origin_obj # cast the ray success, location, normal, face_index = obj.ray_cast(ray_origin_obj, ray_direction_obj) if success: return location, normal, face_index else: return None, None, None # cast rays and find the closest object best_length_squared = -1.0 best_obj = None # cast rays and find the closest object for obj, matrix in visible_objects_and_duplis(): if obj.type == 'MESH': hit, normal, face_index = obj_ray_cast(obj, matrix) if hit is not None: hit_world = matrix * hit length_squared = (hit_world - ray_origin).length_squared if best_obj is None or length_squared < best_length_squared: scene.cursor_location = hit_world best_length_squared = length_squared best_obj = obj else: if best_obj is None: depthLocation = region_2d_to_vector_3d(region, rv3d, coord) loc = region_2d_to_location_3d(region, rv3d, coord, depthLocation) scene.cursor_location = loc
Example #15
Source File: toolpath.py From curve_cad with GNU General Public License v3.0 | 4 votes |
def modal(self, context, event): if event.type == 'MOUSEMOVE': mouse = (event.mouse_region_x, event.mouse_region_y) input_value = internal.nearestPointOfLines( bpy.context.scene.cursor.location, bpy.context.scene.cursor.matrix.col[2].xyz, view3d_utils.region_2d_to_origin_3d(context.region, context.region_data, mouse), view3d_utils.region_2d_to_vector_3d(context.region, context.region_data, mouse) )[0] if self.mode == 'PITCH': self.pitch = input_value/(self.slice_count-1) if self.slice_count > 2 else input_value elif self.mode == 'OFFSET': self.offset = input_value-self.pitch*0.5*((self.slice_count-1) if self.slice_count > 2 else 1.0) elif event.type == 'WHEELUPMOUSE': if self.slice_count > 2: self.pitch *= (self.slice_count-1) self.slice_count += 1 if self.slice_count > 2: self.pitch /= (self.slice_count-1) elif event.type == 'WHEELDOWNMOUSE': if self.slice_count > 2: self.pitch *= (self.slice_count-1) if self.slice_count > 1: self.slice_count -= 1 if self.slice_count > 2: self.pitch /= (self.slice_count-1) elif event.type == 'LEFTMOUSE' and event.value == 'RELEASE': if self.mode == 'PITCH': self.mode = 'OFFSET' return {'RUNNING_MODAL'} elif self.mode == 'OFFSET': self.mesh.free() return {'FINISHED'} elif event.type in {'RIGHTMOUSE', 'ESC'}: self.mesh.free() bpy.context.scene.collection.objects.unlink(self.result) bpy.context.view_layer.objects.active = self.input_obj return {'CANCELLED'} else: return {'PASS_THROUGH'} self.result.data.splines.clear() self.perform(context) return {'RUNNING_MODAL'}
Example #16
Source File: sidebar_utils.py From ProSidebar with GNU General Public License v3.0 | 4 votes |
def floor_raycast(context, mx, my): ''' This casts a ray into the 3D view and returns information based on what is under the mouse ARGS context (bpy.context) = current blender context mx (float) = 2D mouse x location my (float) = 2D mouse y location RETURNS tuple has_hit (boolean) - determines if an object is under the mouse snapped_location (tuple) - x,y,z location of location under mouse snapped_normal (tuple) - normal direction snapped_rotation (tuple) - rotation face_index (int) - face index under mouse object (bpy.types.Object) - Blender Object under mouse martix (float multi-dimensional array of 4 * 4 items in [-inf, inf]) - matrix of placement under mouse ''' r = context.region rv3d = context.region_data coord = mx, my # get the ray from the viewport and mouse view_vector = view3d_utils.region_2d_to_vector_3d(r, rv3d, coord) ray_origin = view3d_utils.region_2d_to_origin_3d(r, rv3d, coord) # ray_target = ray_origin + (view_vector * 1000000000) ray_target = ray_origin + view_vector snapped_location = mathutils.geometry.intersect_line_plane(ray_origin, ray_target, (0, 0, 0), (0, 0, 1), False) if snapped_location != None: has_hit = True snapped_normal = mathutils.Vector((0, 0, 1)) face_index = None object = None matrix = None snapped_rotation = snapped_normal.to_track_quat('Z', 'Y').to_euler() offset_rotation_amount = 0 randomize_rotation_amount = 0 randomize_rotation = False if randomize_rotation: randoffset = offset_rotation_amount + math.pi + ( random.random() - 0.5) * randomize_rotation_amount else: randoffset = offset_rotation_amount + math.pi snapped_rotation.rotate_axis('Z', randoffset) return has_hit, snapped_location, snapped_normal, snapped_rotation, face_index, object, matrix