<div dir="ltr"><div>Dear X3D WG members,</div><br><div>I would like to propose a series of extensions/additions to the X3D Volume Rendering Component.</div><div><br></div><div>These extensions were first presented on the Web3D2017 conference.</div><div><a href="https://www.researchgate.net/publication/317122169_Community-driven_extensions_to_the_X3D_volume_rendering_component" style="text-decoration:none" id="gmail-docs-internal-guid-e4f0556a-7fff-0d37-a6cf-4c8d550ec249"><span style="font-size:11pt;font-family:Arial;color:rgb(17,85,204);background-color:transparent;font-weight:700;font-style:italic;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap">Community-driven Extensions to the X3D Volume Rendering Component</span></a><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:700;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">(full PDF copy available)</span>

</div><div><br></div><div>On this paper the following additions were proposed:</div><div><br></div><div>1. New Proposed Nodes:<br><div style="margin-left:40px">1.1 ImageTextureAtlas node<br>1.2 MPRVolumeStyle node<br></div><br>2. New Proposed Additions:<br><div style="margin-left:40px">2.1 quality attribute to target device computation capabilities<br>2.2 allowViewpointInside attribute for inside exploration of volume data<br>2.3 sceneDepth attribute for hybrid rendering<br>2.4 cap attribute for Clipping</div><div style="margin-left:40px"><br></div>So far, from those proposals I have already contribute in the X3DOM library with the following:</div><div><br></div><div><b>1.1 ImageTextureAtlas node<br></b></div><div><b>1.2 MPRVolumeStyle</b></div><div><b>2.2 
allowViewpointInside attribute for inside exploration of volume data</b><br></div><div><br></div><div>Therefore, I think these additions (1,1, 1.2, 2.2) can be discussed for inclusion in future revisions of the X3D standard.</div><div><br></div><div>I will prepare some public live examples as soon as I can, and will post them in the mailing list.<br></div><div></div><div><br></div><div>I understand a more formal spec 

 definition will be required. <a class="gmail_plusreply" id="plusReplyChip-2" href="mailto:brutzman@nps.edu" tabindex="-1">@Don Brutzman</a> <a class="gmail_plusreply" id="plusReplyChip-3" href="mailto:npolys@vt.edu" tabindex="-1">@Nicholas Polys</a>,  any help and guidance on this regard will be appreciated. When required I could present/discuss these extensions on any next X3D WG meeting.

</div><div><br></div><div>An initial description of these extensions is at the end of this post.</div><div><br></div><div>BR,</div><div><br></div><div><br></div><div><br></div><div></div><div>
<h2 dir="ltr" style="line-height:1.38;margin-top:18pt;margin-bottom:6pt" id="gmail-docs-internal-guid-ef217192-7fff-6d6c-523b-aad1b0451af4"><span style="font-size:16pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">1.1 </span><span style="font-size:16pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">ImageTextureAtlas </span><span style="font-size:16pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">node</span></h2>

</div><div>Volumetric data, specially those obtained from a MRI or a CT scan, can be seen as a set of 2D image slices in an array. This data is usually stored in a 3D Texture. Unfortunately, in the web context, WebGL 1.0 does not support 3D texture data types. X3DTexture3DNode derived nodes can not be implemented with this API. An alternative structure is required for compatibility with the web.<br><br>We propose a new ImageTextureAtlas node which allows to represent the 3D volume data by composing all the 2D slices into a single 2D texture. Instead of adding a Z dimension to the texture, all 2D slices are arranged in a matrix configuration into one image.<br><br>Listing below shows the basic X3D definition of the proposed node.<br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);border-top:1pt solid rgb(0,0,0);padding:2pt 2pt 0pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">ImageTextureAtlas : X3DTexture2DNode</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFNode [in,out] metadata NULL [X3DMetadataObject]</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFBool [in,out] repeatS TRUE</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFBool [in,out] repeatT TRUE</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFNode [in,out] textureProperties NULL [TextureProperties]</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> MFString [in,out] url [] [URI]</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFInt32 [in,out] numberOfSlices 0 [0,∞)</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFInt32 [in,out] slicesOverX 0 [0,∞)</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFInt32 [in,out] slicesOverY 0 [0,∞)</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFBool [in,out] hideChildren TRUE</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFString [in,out] channels "R"</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFString [in,out] sortOrder "NONE" ["ROW", "CHANNEL", “NONE”]</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);border-bottom:1pt solid rgb(0,0,0);padding:0pt 2pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">}</span></p><br>The following attributes are inherited by X3DTexture2DNode: metadata, repeatS, repeatT, textureProperties and url.<br><br>The numberOfSlices attribute indicates the number of slices or the dimension in Z axis. SlicesOverX attribute indicates the number of slices along X axis or columns, while the SlicesOverY indicates the number of slices along Y axis or number of rows in the matrix configuration. This values must be provided by the user, since they cannot be deduced by the input image.<br><br>The channels field defines in which color channel of the texture volume data is being stored. The default behavior is to store the volume data in the Red color channel by specifying the "R" value. When, a larger volume is required to be converted into an ImageTextureAtlas additional channels can be specified with "R", "G", "B", "A" characters. For instance, to store up to three times more data. A "RGBA" value in the channel field will indicate that all color channels of the texture are being used to store the data.<br><br>Once multiple color channels are defined, the order in which 2D slices are tiled into the atlas must be set in the sortOrder field. The default behavior is to tile the 2D slices that represent the Z axis of the volume data in "ROW” (row-major) order. For each slice of the ImageTextureAtlas the next slice in the Z axis is the contiguous slice in the row of the matrix of slices. When the sortOrder is set to "CHANNEL" the next slice of the atlas in the Z axis direction is stored in the the contiguous color channel.  <br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;text-align:center"><span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"><img src="https://lh4.googleusercontent.com/geAt7x8gCDWBTnvMU-ym8Etz0DATP_6bl1TdhhNirMTQqLSdLgnMnjvYIsBJK1o5mML67u99DJ9BQFMlv-RGoV_70hiFQ7Kx5aoS-EVT--9hyVHE-nXHvT5wC1JKYULH7cM8j7_V" style="border: medium none;" width="456" height="417"></span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;text-align:center"><span style="font-size:9pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">A 2D image representing an </span><span style="font-size:9pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">ImageTextureAtlas </span><span style="font-size:9pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">of the </span><span style="font-size:9pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">MRI ventricles (Volvis)</span><span style="font-size:9pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> dataset (color inverted and contrast enhanced) as a set of 2D slices tiled into a matrix configuration</span></p><br>Not only to represent raw volume data, the ImageTextureAtlas can also be used for gradient volume data and segmented volume data.<br><br>Surface normals are specified to be provided as an additional 3D texture. Using the same approach as before, we can create an ImageTextureAtlas using the color channels of the 2D texture to store the vector information of gradient data. We encode the gradient vector for each pixel in the atlas in the RGB color channels {R: X, G: Y, B: Z}.<br><br>Listing below shows an example declaration of the gradient data.<br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-color:rgb(0,0,0);border-style:solid;border-width:1pt;padding:2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"><ImageTextureAtlas containerField="surfaceNormals" url="gradient.png" slicesOverX="8" slicesOverY="8" channels=”RGB” sortOrger=”NONE”> </ImageTextureAtlas></span></p><br>The containerField and URL attributes are the only modifications required for the ImageTextureAtlas declaration. The containerField attribute is used to target the volume data voxels field in a X3DVolumeDataNode or gradient data surfaceNormals field in a X3DVolumeStyleNode. This also requires, for the X3DVolumeStyleNode type nodes with a surfaceNormals attribute, to accept a X3DTexture2DNode as an input argument.<br><br>The following Listing definition shows how X3DVolumeData derived nodes, such as the VolumeData, should allow a 2D texture input to accept the ImageTextureAtlas as a parameter.<br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);border-top:1pt solid rgb(0,0,0);padding:2pt 2pt 0pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">VolumeData : X3DVolumeDataNode {</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFVec3f [in,out] dimensions 1 1 1 (0,∞)</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFNode [in,out] metadata NULL [X3DMetadataObject]</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFNode [in,out] renderStyle NULL [X3DVolumeRenderStyleNode]</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFNode [in,out] voxels NULL [X3DTexture3DNode, X3DTexture2DNode]</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFVec3f [] bboxCenter 0 0 0 (-∞,∞)</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFVec3f [] bboxSize -1 -1 -1 [0,∞) or -1 -1 -1</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);border-bottom:1pt solid rgb(0,0,0);padding:0pt 2pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">}</span></p><br>The SegmentedVolumeData node allows the user to discern regions of the volume and apply different rendering styles to each one. The segmented region must be labeled per voxel.<br><br>Textures provide a mechanism to input data to the GPU, updating directly the visualization. In the Web platform we can take advantage of the 2D canvas API to create or modify images that can be copied to the GPU. This is of special interest to reflect dynamic changes in the data and, for instance, to perform the construction of the atlas in the browser.<br><br>Listing below shows an ImageTextureAtlas node declaration with a canvas. The hideChildren attribute hides the atlas image visibility from the user, but makes it available to be modified with JavaScript.<br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);border-top:1pt solid rgb(0,0,0);padding:2pt 2pt 0pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"><ImageTextureAtlas containerField="voxels" url="" slicesOverX="8" slicesOverY="8" </span><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">hideChildren="true"</span><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">></span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> <canvas id="v" style="width:2048px; height:2048px;"></span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">  </canvas></span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);border-bottom:1pt solid rgb(0,0,0);padding:0pt 2pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></ImageTextureAtlas></span></p>

<span style="font-size:11pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"></span>

</div><div>
<h2 dir="ltr" style="line-height:1.38;margin-top:18pt;margin-bottom:6pt" id="gmail-docs-internal-guid-560362bd-7fff-8c6a-f109-3954ec2fadff"><span style="font-size:16pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">1.2 </span><span style="font-size:16pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">MPRVolumeStyle </span><span style="font-size:16pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">node</span></h2>

</div><div>The Multi-Planar Reconstruction (MPR) is a wide spread rendering technique. Essentially, it enables the user to define arbitrary planes slicing through the volume data. The rendering algorithm resamples the volume data to reconstruct the desired plane. Usually, the following planes are defined: Axial, Sagital, Coronal and Oblique.<br><br>The following Listing shows the proposed X3D MPR volume rendering style definition.</div><div><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);border-top:1pt solid rgb(0,0,0);padding:2pt 2pt 0pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">MPRVolumeStyle : X3DVolumeRenderStyleNode  {</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFBool [in,out] enabled TRUE</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFNode [in,out] metadata NULL [X3DMetadataObject]</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFNode [in,out] transferFunction NULL [X3DTexture2DNode, X3DTexture3DNode]</span></p><p style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFBool [in,out] forceOpaque TRUE<br></span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> MFNode [in,out] planes NULL [MPRPlane]</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);border-bottom:1pt solid rgb(0,0,0);padding:0pt 2pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">}</span></p><br>An additional interesting enhancement to MPR is the ability to add a transfer function (TF) in order to illustrate or filter regions in the reconstructed planes. It is used to correlate the visual output with obtained results. The proposed MPR node defines a <i>transferFunction </i>attribute with the same functionality as the one already defined in the OpacityMapVolumeStyle. This node also defines a planes attribute to allow the user to declare arbitrary planes.<br><br>The following Listing presents an arbitrary plane definition for the MPRVolumeStyle node. The <i>normal </i>attribute defines the normal vector of the plane, while the <i>position </i>attribute establishes the position of the plane from the origin of the volume in the normal direction.</div><div><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);border-top:1pt solid rgb(0,0,0);padding:2pt 2pt 0pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">MPRPlane : X3DNode {</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFBool [in,out] enabled TRUE</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFNode [in,out] metadata NULL [X3DMetadataObject]</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFVec3 [in,out] normal 0 0 1</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFFloat [in,out] position 0.0 [0,1]</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);border-bottom:1pt solid rgb(0,0,0);padding:0pt 2pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">}</span></p>

</div><div><div></div><div>
<div>
<h2 dir="ltr" style="line-height:1.38;margin-top:18pt;margin-bottom:6pt" id="gmail-docs-internal-guid-3c35ce2f-7fff-dc3b-f939-b12a0dee9f7d"><span style="font-size:16pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">2.2 </span><span style="font-size:16pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:italic;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">allowViewpointInside </span><span style="font-size:16pt;font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">attribute for inside exploration</span></h2>Allowing to place the viewers virtual camera inside the volume provides a new perspective to analyze the data. Some regions of the volume data can be occluded even after filtering the data with a transfer function (TF). We suggest to define a new attribute to enable or disable this behavior for performance purposes.<br><br>The following Listing shows the definition with the proposed attribute.<br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);border-top:1pt solid rgb(0,0,0);padding:2pt 2pt 0pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">X3DVolumeDataNode : X3DChildNode, X3DBoundedObject</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFVec3f [in,out] dimensions 1 1 1 (0,∞)</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFNode [in,out] metadata NULL [X3DMetadataObject]</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFVec3f [] bboxCenter  0 0 0 (-∞,∞)</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> SFVec3f [] bboxSize -1 -1 -1 [0,∞) or -1 -1 -1</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);padding:0pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:700;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">SFBool [in,out] allowViewPointInside TRUE</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;border-left:1pt solid rgb(0,0,0);border-right:1pt solid rgb(0,0,0);border-bottom:1pt solid rgb(0,0,0);padding:0pt 2pt 2pt"><span style="font-size:11pt;font-family:"Courier New";color:rgb(0,0,0);background-color:transparent;font-weight:400;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap">}</span></p><br>Our proposal is to declare a new boolean attribute allowViewPointInside to all nodes inherited by the X3DVolumeDataNode. By default we suggest to allow the inspection of the volume data and if the user does not require to do so, it can be explicitly disabled. This feature allows to avoid additional computation.

</div>

</div><div><br></div><div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><a href="http://www.vicomtech.org" target="_blank"><img src="http://www.vicomtech.org/firmas/html/Vicomtech209.png" width="209px" height="50px" border="0"></a><br><span style="font-size:12px;color:black;font-family:CENTURY GOTHIC;font-weight:bold">Ander Arbelaiz Aranzasti</span><br><span style="font-size:12px;color:black;font-family:CENTURY GOTHIC">Researcher | Investigador</span><br><br><span style="font-size:12px;color:black;font-family:CENTURY GOTHIC"><a href="mailto:aarbelaiz@vicomtech.org" style="color:black" target="_blank">aarbelaiz@vicomtech.org</a></span><br><span style="font-size:12px;color:black;font-family:CENTURY GOTHIC">+[34] 943 30 92 30</span><span style="font-size:11px;color:black;font-family:CENTURY GOTHIC">Industry and Advanced Manufacturing | Industria y Fabricación Avanzada</span><br><br><a href="https://www.linkedin.com/company/vicomtech" target="_blank"><img src="http://www.vicomtech.org/firmas/html/linkedinCuadrado.png" longdesc="http://Linkedin" border="0"></a> <a href="https://www.youtube.com/user/VICOMTech" target="_blank"><img src="http://www.vicomtech.org/firmas/html/youtubeCuadrado.png" longdesc="http://YouTube" border="0"></a> <a href="https://twitter.com/@Vicomtech" target="_blank"><img src="http://www.vicomtech.org/firmas/html/twitterCuadrado.png" longdesc="http://Twitter" border="0"></a><br><span style="font-size:12px;color:black;font-family:CENTURY GOTHIC">member of: <a href="http://www.graphicsmedia.net/" target="_blank"><img src="http://www.vicomtech.org/firmas/html/gmn68.png" longdesc="http://GraphicsMediaNet" style="vertical-align:middle" width="110px" height="38px" border="0"></a></span><br><span style="font-size:10px;color:black;font-family:CENTURY GOTHIC;font-weight:normal;font-style:italic"><a href="http://www.vicomtech.org/en/proteccion-datos" style="color:black" target="_blank">Legal Notice - Privacy policy</a></span></div></div></div></div></div>