[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57433] trunk/blender/release/scripts/ modules/bpy_extras/object_utils.py: handy function for getting the 2d camera coords for a worldspace location.

Erwin Coumans erwin.coumans at gmail.com
Thu Jun 13 17:59:44 CEST 2013


I would use NDC, it is more clear and common terminology,
while camera_view is imprecise and needs explanation in a comment,



On 13 June 2013 08:55, Brecht Van Lommel <brechtvanlommel at pandora.be> wrote:

> "world_to_camera_view" would be good I think.
>
> On Thu, Jun 13, 2013 at 5:24 PM, Campbell Barton <ideasman42 at gmail.com>
> wrote:
> > Fair point, not really a fan of `ndc space`, though I can't think of
> > one I'm especially happy with either...
> >
> > other possibilities ...
> > world_to_view2d (except it returns z component)
> > world_to_camera_frame (since it uses camera framing functions, though
> > this is more of a detail)
> > world_to_view_uvw
> > world_to_render ?
> >
> > On Fri, Jun 14, 2013 at 12:06 AM, Brecht Van Lommel
> > <brechtvanlommel at pandora.be> wrote:
> >> Nitpick about the terminology used here. "Camera space" usually refers
> >> to the coordinates when transformed by the camera matrix but without
> >> any perspective transformation applied, so I would say "2D camera
> >> space coords" here. OpenGL and Renderman would call the result of this
> >> function Normalized Device Coordinates, though I'm not sure if there
> >> is a common name for the space, maybe "NDC space".
> >>
> >> On Thu, Jun 13, 2013 at 3:51 PM, Campbell Barton <ideasman42 at gmail.com>
> wrote:
> >>> Revision: 57433
> >>>
> http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57433
> >>> Author:   campbellbarton
> >>> Date:     2013-06-13 13:51:01 +0000 (Thu, 13 Jun 2013)
> >>> Log Message:
> >>> -----------
> >>> handy function for getting the 2d camera coords for a worldspace
> location.
> >>>
> >>>  bpy_extras.object_utils.world_to_camera(scene, obj, coord)
> >>>
> >>> Modified Paths:
> >>> --------------
> >>>     trunk/blender/release/scripts/modules/bpy_extras/object_utils.py
> >>>
> >>> Modified:
> trunk/blender/release/scripts/modules/bpy_extras/object_utils.py
> >>> ===================================================================
> >>> --- trunk/blender/release/scripts/modules/bpy_extras/object_utils.py
>  2013-06-13 13:09:32 UTC (rev 57432)
> >>> +++ trunk/blender/release/scripts/modules/bpy_extras/object_utils.py
>  2013-06-13 13:51:01 UTC (rev 57433)
> >>> @@ -25,6 +25,7 @@
> >>>      "object_add_grid_scale",
> >>>      "object_add_grid_scale_apply_operator",
> >>>      "object_image_guess",
> >>> +    "world_to_camera",
> >>>      )
> >>>
> >>>
> >>> @@ -265,3 +266,40 @@
> >>>                          if image is not None:
> >>>                              return image
> >>>      return None
> >>> +
> >>> +
> >>> +def world_to_camera(scene, obj, coord):
> >>> +    """
> >>> +    Returns the 2d camera space coords for a 3d point.
> >>> +
> >>> +    Where (0, 0) is the bottom left and (1, 1) is the top right of
> the camera frame.
> >>> +    values outside 0-1 are also supported.
> >>> +
> >>> +    Takes shift-x/y, lens angle and sensor size into account
> >>> +    as well as perspective/ortho projections.
> >>> +
> >>> +    :arg scene: Scene to use for frame size.
> >>> +    :type scene: :class:`bpy.types.Scene`
> >>> +    :arg obj: Camera object.
> >>> +    :type obj: :class:`bpy.types.Object`
> >>> +    :arg coord: World space location.
> >>> +    :type coord: :class:`mathutils.Vector`
> >>> +    :return: normalized 2d vector.
> >>> +    :rtype: :class:`mathutils.Vector`
> >>> +    """
> >>> +
> >>> +    co_local = obj.matrix_world.normalized().inverted() * coord
> >>> +
> >>> +    camera = obj.data
> >>> +    frame = [-v for v in camera.view_frame(scene=scene)[:3]]
> >>> +    if camera.type != 'ORTHO':
> >>> +        frame = [(v / -v.z) * co_local.z for v in frame]
> >>> +
> >>> +    min_x, max_x = frame[1].x, frame[2].x
> >>> +    min_y, max_y = frame[0].y, frame[1].y
> >>> +
> >>> +    x = (co_local.x - min_x) / (max_x - min_x)
> >>> +    y = (co_local.y - min_y) / (max_y - min_y)
> >>> +
> >>> +    from mathutils import Vector
> >>> +    return Vector((x, y))
> >>>
> >>> _______________________________________________
> >>> Bf-blender-cvs mailing list
> >>> Bf-blender-cvs at blender.org
> >>> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
> >> _______________________________________________
> >> Bf-committers mailing list
> >> Bf-committers at blender.org
> >> http://lists.blender.org/mailman/listinfo/bf-committers
> >
> >
> >
> > --
> > - Campbell
> > _______________________________________________
> > Bf-committers mailing list
> > Bf-committers at blender.org
> > http://lists.blender.org/mailman/listinfo/bf-committers
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at blender.org
> http://lists.blender.org/mailman/listinfo/bf-committers
>


More information about the Bf-committers mailing list