Here is an example of how to use the Scene.ray_cast function. However, I want to ignore an object (eg cube). How to make this possible?
import bpy, bgl
from bpy_extras import view3d_utils
from mathutils import Vector, Matrix
def draw_point_bgl(coords):
# VIEWING BGL
bgl.glEnable(bgl.GL_BLEND)
bgl.glColor4f(1.0, 0.5, 0.5, 1.0)
bgl.glPointSize(50)
bgl.glBegin(bgl.GL_POINTS)
bgl.glVertex3f(*coords)
bgl.glEnd()
bgl.glDisable(bgl.GL_BLEND)
# restore opengl defaults
bgl.glDepthRange(0,1)
bgl.glPointSize(1)
bgl.glLineWidth(1)
bgl.glDisable(bgl.GL_BLEND)
bgl.glColor4f(0.0, 0.0, 0.0, 1.0)
bpy.context.area.header_text_set(str(coords))
def draw_scene_ray_cast(self, context):
x, y = self.mouse_co
view_vector = view3d_utils.region_2d_to_vector_3d(self.region, self.rv3d, (x, y))
ray_origin = view3d_utils.region_2d_to_origin_3d(self.region, self.rv3d, (x, y))
ray_target = ray_origin + (view_vector * 1000)
scene = context.scene
# cast the ray
result, object, matrix, location, normal = scene.ray_cast(ray_origin, ray_target)
draw_point_bgl(location)
class PanelTestsRayCast(bpy.types.Panel):
bl_space_type = "VIEW_3D"
bl_region_type = "TOOLS"
bl_category = "Test RayCast"
bl_label = "Test RayCast"
def draw(self, context):
layout = self.layout
TheCol = layout.column(align = True)
TheCol.operator("view3d.test_ray_cast")
class TestsRayCastOperator(bpy.types.Operator):
"""using mouse events"""
bl_idname = "view3d.test_ray_cast"
bl_label = "Show RayCast"
def modal(self, context, event):
if context.area:
context.area.tag_redraw()
if event.type == 'MOUSEMOVE':
self.mouse_co = (event.mouse_region_x, event.mouse_region_y)
elif event.type in {'RIGHTMOUSE', 'ESC'}:
bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
context.area.header_text_set()
return {'FINISHED'}
return {'PASS_THROUGH'}
def invoke(self, context, event):
if context.space_data.type == 'VIEW_3D':
self.rv3d = context.region_data
self.region = context.region
self._handle = bpy.types.SpaceView3D.draw_handler_add(draw_scene_ray_cast, (self, context), 'WINDOW', 'POST_VIEW')
context.window_manager.modal_handler_add(self)
return {'RUNNING_MODAL'}
else:
self.report({'WARNING'}, "Active space must be a View3d")
return {'CANCELLED'}
def register():
bpy.utils.register_class(PanelTestsRayCast)
bpy.utils.register_class(TestsRayCastOperator)
def unregister():
bpy.utils.unregister_class(PanelTestsRayCast)
bpy.utils.unregister_class(TestsRayCastOperator)
if __name__ == "__main__":
register()