MathGroup Archive 2008

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Locator 3D

  • To: mathgroup at smc.vnet.net
  • Subject: [mg84618] Re: Locator 3D
  • From: "Fred Klingener" <gigabitbucket at gmail.com>
  • Date: Mon, 7 Jan 2008 02:38:07 -0500 (EST)
  • References: <fi0ndv$5c5$1@smc.vnet.net> <fibg4o$5qo$1@smc.vnet.net>
  • Reply-to: "Fred Klingener" <gigabitbucket at gmail.com>

> <roby.nowak at gmail.com> wrote in message news:fi0ndv$5c5$1 at smc.vnet.net...
>> Hi everybody,
>>
>> is there something like a 3D Locator in Mathematica 6.0 ?
>> how could such a thing be realised ?

It's not Locator, but here's a cut at a way to pick 3D objects with the 
mouse. It's based on the idea advanced by others, using the {"MouseDown" :> 
({f, b} = MousePosition["Graphics3DBoxIntercepts"])} return on a 3D graphic 
inside an EventHandler.

The front and back box intercepts {f, b} can be used to construct a Pluecker 
line through the displayed plot range, and interactions and picking can be 
implemented with the contents.

The modern standard reference for Pluecker lines (at least in the CG world) 
seems to be Shoemake's 1998 notes in the Ray Tracing News:

http://www.acm.org/tog/resources/RTNews/html/rtnv11n1.html.

Unfortunately (AFAIC), Shoemake defined his moment term with a left-hand 
rule, and I've switched that to right-hand to inject confusion right at the 
start but to save myself grief later.

The following example does about the simplest picking to illustrate the 
method. I generate a random point cloud, then pick and highlight individual 
points with mouse clicks (using MouseDown instead of MousePosition.)

(* 2008-01-06 Fred Klingener *)

(* Pluecker Line from point Q to point P
   use this to construct a Pluecker pick line through the 3D space from the
   front and back "Graphics3DBoxIntercepts" *)

pLine[P_, Q_] := {P - Q, Q\[Cross]P}

(* vector from point P normal to Pluecker line L *)

 vectorLP[P_, L_] := Module[{U = L[[1]], V = L[[2]]},
  U\[Cross](P\[Cross]U - V)/U.U]

(* distance from point P to Pluecker line L *)

distanceLP[P_, L_] := Norm[vectorLP[P, L]];

(* Example - picking random 3D points *)
nPoints = 10;
DynamicModule[{
  f = {0.556581, -1.43647, 1.5}
  , b = {-1.14868, 1.5, -0.792715}
  , cloud =
   Table[{RandomReal[{-1, 1}], RandomReal[{-1, 1}],
     RandomReal[{-1, 1}]}
    , {i, nPoints}]
  , d0
  , p}
 , Column[{
   Row[{EventHandler[
      image = Graphics3D[{Point[cloud]
         , Line[Dynamic@{f, b}]
         , {Red, PointSize[0.05],
          Dynamic@Point[
            p = cloud[[
              Position[
                d0 = Table[
                  distanceLP[cloud[[i]], pLine[f, b]], {i, nPoints}],
                Min@d0][[1, 1]]]]]}
         , Dynamic@Text[ToString[p], p, {-1, 1}]
         }
        , PlotRange -> {{-1.5, 1.5}, {-1.5, 1.5}, {-1.5, 1.5}}
        , Axes -> True
        , AxesLabel -> {"x", "y", "z"}
        , AspectRatio -> Automatic
        , ImageSize -> {300, 300}
        ] (* Graphics3D *)
      , {"MouseDown" :> ({f, b} =
          MousePosition["Graphics3DBoxIntercepts"])}
      ] (* EventHandler *)
     , Show[image, ViewPoint -> {2, 2, 2}]
     }] (* Row *)
   , Row[{Graphics[Text["Picking view.
       The pick line is normal to the screen.
       The point closest to the pick line is high-lighted.
       Click on a point to select it."], ImageSize -> {300, 60}]
     , Graphics[
      Text["Side view of point field showing point field, selected \
point and pick line.\nThe view can be manipulated with the mouse in \
the usual way"], ImageSize -> {300, 60}]
     }]
   }] (* Col *)
 ] (* DynamicModule *)

Pluecker lines have simple relations for picking polygons too, as long as 
they're simple enough.

In principle anyway, we should be able to dissect a GraphicsComplex that Mma 
generates for more complicated forms (Plot3D, maybe RegionPlot3D, etc.) and 
interact with their elements using the Pluecker pick line.

Hth,
Fred Klingener 



  • Prev by Date: Re: RE: Re: Mathematica 6 Documentation - how does one add to it?
  • Next by Date: Re: Interactive 2d zoom and some Dynamic questions
  • Previous by thread: PacletManager
  • Next by thread: Re: Re: Locator 3D