<div dir="ltr"><p dir="ltr">Hi,</p>
<p dir="ltr">back from the holiday season, here are proposals for new fields for Viewpoint.<br></p>
<p dir="ltr">I do not have an x3dom implementation but the idea is to add two Matrix4d fields:</p>
<p dir="ltr">projectionMatrix :</p>
<p dir="ltr">default: NULL</p>
<p dir="ltr">purpose: allow control of the view projection from 3d to 2d by such a matrix from sources such HMD drivers. The projection matrix controls fov</p>
<p dir="ltr">The projectionMatrix should be used as is by the browser if not NULL. If NULL, a projection matrix shall be contructed from viewpoint fields.<br></p>
<br><p dir="ltr">viewMatrix:</p>
<p dir="ltr">default: unit matrix<br></p>
<p dir="ltr">purpose: allow control of the viewer orientation and location by such a matrix from sources such as HMD drivers.</p>
<p dir="ltr">The viewMatrix V shall be combined with the matrix M derived from the location/ orientation fields by M * V for rendering use.<br></p>
<p dir="ltr">This means that if V is used in a scene exclusively the location fields needs to be reset to 0 0 0 from its default by the scene.</p>Typical use would be as sinks of routes from (new) ProjectionSensor or VRDevice node fields.
<div class="gmail_extra"><br>A VRDevice delivers both matrixes for each eye. A scene can then set up a viewpoint for each eye, and use Layers to show them side by side.<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">In terms of efficiency, this would seem to require repeated traversals of the scene unless both Layers can be recognized to show the same scene content.<br><br></div><div class="gmail_extra">A more convenient and integrated alternative would be to introduce a stereo SFBool field and have left and right variants of the matrix fields ( and perhaps also left and right variants of the location, orientation, fov, zfar, znear fields).<br><br></div><div class="gmail_extra">stereo = false would ignore all left and right fields.<br></div><div class="gmail_extra">stereo = true would use the left/right fields and render them side by side.<br><br></div><div class="gmail_extra">Since in this case there is a guaranty that views for each eye use the same scene content, only one traversal should be needed to render both eyes.<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">The idea would be switching mono to stereo and back only requires toggling the stereo field. Navigation may have a similar switch to and from mouse/keyboard modes ?<br><br></div><div class="gmail_extra">Implementation in x3dom of viewMatrix and projectionMatrix may be rather
 straightforward. I do not see large obstacles (famous last words ...).<br>Implementation in cobweb of viewMatrix and projectionMatrix may be also
 straightforward but I am less sure.<br><br></div><div class="gmail_extra">Without layers in x3dom then one could put two scene side by side on the web page, use external js to feed the matrix fields, and then also use external js to grab the frames from both scene canvases, combine them into a single frame on another canvas, and use that finally as a source for the HMD display. (This sounds slow).<br></div><div class="gmail_extra">In cobweb, it should not be hard to set up a scene with a layer for each eye.<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">Implementation of stereo, left and rightView/ProjectionMatrix in x3dom is harder since it needs changes to the rendering code which is a bit unstructured. The first approach would be for stereo=true to go through the rendering twice with the rendering surfaces appropriately set somehow.<br></div><div class="gmail_extra"><br></div>-Andreas<br><div><div><div class="gmail_extra"><br><div class="gmail_quote">On Dec 21, 2016 6:00 AM, "Roy Walmsley" <<a href="mailto:roy.walmsley@ntlworld.com" target="_blank">roy.walmsley@ntlworld.com</a>> wrote:<br type="attribution"><blockquote class="gmail-m_-1340451005820280364quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div lang="EN-GB"><div class="gmail-m_-1340451005820280364m_-6303718404097154915WordSection1"><p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif">Hi Andreas,<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif">That’s great to see what you have been doing here. Would  you like to take your node suggestions one step further and propose the fields that might be specified for each node?<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif">What we could do then is, in the new year, is to host an open discussion on WebVR and X3D. Contributions from any other readers are welcome, and could lead to a lively discussion on this topic.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif">Thank you for the suggestions,<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif">All the best,<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif">Roy<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif"><u></u> <u></u></span></p><p class="MsoNormal"><b><span style="font-size:11pt;font-family:"calibri",sans-serif" lang="EN-US">From:</span></b><span style="font-size:11pt;font-family:"calibri",sans-serif" lang="EN-US"> x3d-public [mailto:<a href="mailto:x3d-public-bounces@web3d.org" target="_blank">x3d-public-bounces@web<wbr>3d.org</a>] <b>On Behalf Of </b>Andreas Plesch<br><b>Sent:</b> 21 December 2016 05:51<br><b>To:</b> X3D Graphics public mailing list <<a href="mailto:x3d-public@web3d.org" target="_blank">x3d-public@web3d.org</a>><br><b>Subject:</b> [x3d-public] X3D VR<u></u><u></u></span></p><div class="gmail-m_-1340451005820280364elided-text"><p class="MsoNormal"><u></u> <u></u></p><p>Hi<u></u><u></u></p><p>Working with x3dom and WebVR I am exploring what additions to X3D would be necessary or useful to effectively use current VR hardware such as the Rift, Vive, Gear, or Cardboard.<u></u><u></u></p><p>The proposed RenderedTexture node is currently used in x3dom with special stereo modes to generate left and right views from a single viewpoint in a single GL context.<u></u><u></u></p><p>A Layer for each left and right view could also be used with two coordinated but separate viewpoints. This would be Cobweb's pattern.<u></u><u></u></p><p>Since the HMD and its own runtime know best the internal optical characteristics of the display, the preferred interface at least in WebVR are view and projection matrixes directly usable by consumers for 3d graphics generation, and not position, orientation and fov. This leads to a new requirement for X3D to accept these raw matrixes as input.<u></u><u></u></p><p>Since x3dom uses RenderedTexture for VR, I added there additional special stereo modes which directly receive these matrixes from the HMD to be used for rendering at each frame. This in effect accomplishes a first, head and body based, level of navigation. In my first tests (on github) it works well and should be robust across devices. This approach does require some standard API to the HMD such as WebVR.<u></u><u></u></p><p>Another possibility is to add view and projection matrix fields input fields to viewpoints which can be continually updated. One could convolve the view matrix with position/orientation fields, or optionally completely ignore them.<u></u><u></u></p><p>One then could use external SAI to keep updating or perhaps introduce an environment ProjectionSensor. It would relay these matrix events from an HMD runtime to then be routed to the viewpoints.<u></u><u></u></p><p>A second level of navigation is accomplished with handheld controllers. Until some standard gestures evolve, it will be necessary to expect custom per scene navigation. X3d should have a way to sense buttons and axes velocities of such controllers so these are then available to manipulate the view in some way. InstantReality has a general IOSensor to that effect. On the web the GamePad API is a standard which would need to be used.<u></u><u></u></p><p>Summary: RenderedTexture with stereo modes, matrix fields for viewpoints, a ProjectionSensor, and a ControllerSensor would all be candidates for x3d VR support.<u></u><u></u></p><p>Thanks for reading, any thoughts welcome,<u></u><u></u></p><p>Andreas <u></u><u></u></p></div></div></div></blockquote></div><br></div>
</div></div></div>