<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
pre
        {mso-style-priority:99;
        mso-style-link:"\0421\0442\0430\043D\0434\0430\0440\0442\043D\044B\0439 HTML \0417\043D\0430\043A";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
span.HTML
        {mso-style-name:"\0421\0442\0430\043D\0434\0430\0440\0442\043D\044B\0439 HTML \0417\043D\0430\043A";
        mso-style-priority:99;
        mso-style-link:"\0421\0442\0430\043D\0434\0430\0440\0442\043D\044B\0439 HTML";
        font-family:"Consolas","serif";}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Arial","sans-serif";
        color:navy;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:2.0cm 42.5pt 2.0cm 3.0cm;}
div.WordSection1
        {page:WordSection1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=RU link=blue vlink=purple>

<div class=WordSection1>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:navy'>Hello Dave and Tony,<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:navy'><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:navy'>The problem is that PlaneSensor is inherently planar, even if it
has minY=maxY. If you limit the Y motion, the output values will always be on
one line, but the plane still matters. The sensor works in the following
algorithm:<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:navy'><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:navy'>1. Calculate a ray from the camera through the mouse pointer<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:navy'>2. Intersect the ray with the PlanarSensor plane (Z=0 in its local
coordinate system)<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:navy'>3. Calculate the local X and Y coordinates of the intersection
point<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:navy'>4. Clamp X and Y values, if needed<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:navy'>5. Output the (X, Y, 0) event<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:navy'><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:navy'>In most non-trivial cases, a different plane yields different X and
Y coordinates, and while Y is clamped, X is still different. The worst case is
when you look almost along the plane. Any small movement of the mouse produces
a large movement of the intersection point, and while Y is clamped, X changes
rapidly. When the mouse pointer approaches the “horizon”, you can
move the target object away from the screen and even to infinity.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:navy'><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:navy'>Dave, I would recommend you placing the PlaneSensor into a
Billboard whose axisOfRotation coincides with the clamped area of the
PlaneSensor. The billboard will always rotate the PlaneSensor to the best
orientation respective to the camera, and everything will work in the most “natural”
way. Effectively, this yields an (approximate) orthogonal projection of the
mouse pointer to the needed line, in screen coordinates.<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:navy'><o:p> </o:p></span></p>

<p class=MsoNormal style='margin-left:177.0pt;text-indent:35.4pt'><span
lang=EN-US style='font-size:10.0pt;font-family:"Arial","sans-serif";color:navy'>                                            
Sergey Bederov<o:p></o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:navy'><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:navy'><o:p> </o:p></span></p>

<p class=MsoNormal><span lang=EN-US style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:navy'><o:p> </o:p></span></p>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>
x3d-public-bounces@web3d.org [mailto:x3d-public-bounces@web3d.org] <b>On Behalf
Of </b>Tony Parisi<br>
<b>Sent:</b> Thursday, September 23, 2010 6:25 AM<br>
<b>To:</b> Dave A<br>
<b>Cc:</b> x3d-public@web3d.org<br>
<b>Subject:</b> Re: [X3D-Public] Any way to do a 'LineSensor' (Like PlaneSensor
but in one dimension)<o:p></o:p></span></p>

</div>

<p class=MsoNormal><o:p> </o:p></p>

<p class=MsoNormal style='margin-bottom:12.0pt'>Hmmm,<br>
<br>
This might be an implementation artifact (possible even in two players), or it
might be correct to-spec behavior.<br>
<br>
But now we've gone beyond my ability to visualize. Hoping KV can weigh in.
Keith are you listening?!<br>
<br>
Tony<o:p></o:p></p>

<div>

<p class=MsoNormal>On Wed, Sep 22, 2010 at 6:27 PM, Dave A <<a
href="mailto:dave@realmofconcepts.com">dave@realmofconcepts.com</a>> wrote:<o:p></o:p></p>

<div>

<p class=MsoNormal>Yeah. I try to save myself some time/trouble by asking if
anyone's seen anything, such that I don't have to reinvent a wheel.....<br>
<br>
Anyway, I see this behavior in Vivaty and Contact.<br>
<br>
Imagine you have a plane. Let's say it's face-on to the screen. The PlaneSensor
works well in this case, and setting min.y = max.y will restrict motion to just
X. That's fine. Intuitive interaction.<br>
<br>
Now navigate such that the plane is not face-on to the screen. It's a rhombus.
If you were to draw bisectors on the plane (its local axes), you would see a
line representing the X axis no longer parallel to screen X, and Y no longer
parallel to Y.<br>
<br>
Now when you get translation events from the sensor, there are X and Y
components to that. But if you map that to motion, you'll see that MOUSE motion
in any direction will result in object motion (in one direction). And when the
unwanted axis is 'shorter' (more oblique), there is much more motion resulting
from mouse-movement in that direction. It's a horribly non-intuitive
interaction.<br>
<br>
It's hard to describe, sorry, but try it. Make something in Vivaty studio with
a PlaneSensor and just set the min/max values. Then run it, rotate the scene
around, and play with it. Won't be long before you run into this behavior.<br>
<br>
I imagine I may have to transform the sensor's values to screen coords, filter,
and transform back?<br>
<span style='color:#888888'><br>
Dave A</span><o:p></o:p></p>

<div>

<div>

<p class=MsoNormal><br>
<br>
<br>
<br>
On 9/22/2010 5:34 PM, Tony Parisi wrote: <o:p></o:p></p>

<p class=MsoNormal style='margin-bottom:12.0pt'>Poor Dave, they're still
bashing you after all these years. I feel for ya man.<br>
<br>
Ok now on-topic: if I recall, there is a way to constrain the PlaneSensor to
one dimension. From da spec:<br>
<br>
"<i>minPosition</i> and <i>maxPosition</i> may be set to clamp <i>translation_changed</i>
events to a range of values as measured from the origin of the Z=0 plane of the
local sensor coordinate system. If the X or Y component of <i>minPosition</i>
is greater than the corresponding component of <i>maxPosition</i>, <i>translation_changed</i>
events are not clamped in that dimension. If the X or Y component of <i>minPosition</i>
is equal to the corresponding component of <i>maxPosition</i>, that component
is constrained to the given value. This technique provides a way to implement a
line sensor that maps dragging motion into a translation in one
dimension."<br>
<br>
Tony<span lang=EN-US><o:p></o:p></span></p>

<p class=MsoNormal style='margin-bottom:12.0pt'><span lang=EN-US
style='font-size:10.0pt;font-family:"Arial","sans-serif";color:navy'><o:p> </o:p></span></p>

</div>

</div>

</div>

</div>

</div>

</body>

</html>