本文整理匯總了Python中bpy_extras.view3d_utils.region_2d_to_origin_3d方法的典型用法代碼示例。如果您正苦於以下問題:Python view3d_utils.region_2d_to_origin_3d方法的具體用法?Python view3d_utils.region_2d_to_origin_3d怎麽用?Python view3d_utils.region_2d_to_origin_3d使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在類bpy_extras.view3d_utils
的用法示例。
在下文中一共展示了view3d_utils.region_2d_to_origin_3d方法的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Python代碼示例。
示例1: get_mouse_raycast
# 需要導入模塊: from bpy_extras import view3d_utils [as 別名]
# 或者: from bpy_extras.view3d_utils import region_2d_to_origin_3d [as 別名]
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
示例2: get_mouse_on_plane
# 需要導入模塊: from bpy_extras import view3d_utils [as 別名]
# 或者: from bpy_extras.view3d_utils import region_2d_to_origin_3d [as 別名]
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
示例3: get_mouse_on_plane
# 需要導入模塊: from bpy_extras import view3d_utils [as 別名]
# 或者: from bpy_extras.view3d_utils import region_2d_to_origin_3d [as 別名]
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
示例4: get_pos3d
# 需要導入模塊: from bpy_extras import view3d_utils [as 別名]
# 或者: from bpy_extras.view3d_utils import region_2d_to_origin_3d [as 別名]
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
示例5: get_pos3d
# 需要導入模塊: from bpy_extras import view3d_utils [as 別名]
# 或者: from bpy_extras.view3d_utils import region_2d_to_origin_3d [as 別名]
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
示例6: Pick
# 需要導入模塊: from bpy_extras import view3d_utils [as 別名]
# 或者: from bpy_extras.view3d_utils import region_2d_to_origin_3d [as 別名]
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
示例7: Point2D_to_Ray
# 需要導入模塊: from bpy_extras import view3d_utils [as 別名]
# 或者: from bpy_extras.view3d_utils import region_2d_to_origin_3d [as 別名]
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)
示例8: region_2d_to_orig_and_vect
# 需要導入模塊: from bpy_extras import view3d_utils [as 別名]
# 或者: from bpy_extras.view3d_utils import region_2d_to_origin_3d [as 別名]
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
示例9: _position_3d_from_coord
# 需要導入模塊: from bpy_extras import view3d_utils [as 別名]
# 或者: from bpy_extras.view3d_utils import region_2d_to_origin_3d [as 別名]
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))
示例10: to3d
# 需要導入模塊: from bpy_extras import view3d_utils [as 別名]
# 或者: from bpy_extras.view3d_utils import region_2d_to_origin_3d [as 別名]
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)
示例11: mouse_raycast
# 需要導入模塊: from bpy_extras import view3d_utils [as 別名]
# 或者: from bpy_extras.view3d_utils import region_2d_to_origin_3d [as 別名]
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
示例12: floor_raycast
# 需要導入模塊: from bpy_extras import view3d_utils [as 別名]
# 或者: from bpy_extras.view3d_utils import region_2d_to_origin_3d [as 別名]
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
示例13: Picking
# 需要導入模塊: from bpy_extras import view3d_utils [as 別名]
# 或者: from bpy_extras.view3d_utils import region_2d_to_origin_3d [as 別名]
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
示例14: modal
# 需要導入模塊: from bpy_extras import view3d_utils [as 別名]
# 或者: from bpy_extras.view3d_utils import region_2d_to_origin_3d [as 別名]
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'}
示例15: floor_raycast
# 需要導入模塊: from bpy_extras import view3d_utils [as 別名]
# 或者: from bpy_extras.view3d_utils import region_2d_to_origin_3d [as 別名]
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