1"use strict";(globalThis.webpackChunkvrgs_docs_v_3_1=globalThis.webpackChunkvrgs_docs_v_3_1||[]).push([[24359],{6428(e,t,i){i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>a,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"tutorial/tutorial-basics/ta060-add-attributes","title":"Attribute Generation and Analysis","description":"Attributes are attached to both point cloud and surface mesh data.","source":"@site/versioned_docs/version-3.4/tutorial/tutorial-basics/ta060-add-attributes.md","sourceDirName":"tutorial/tutorial-basics","slug":"/tutorial/tutorial-basics/ta060-add-attributes","permalink":"/docs/tutorial/tutorial-basics/ta060-add-attributes","draft":false,"unlisted":false,"editUrl":"https://github.com/vrgeoscience/vrgs_docs_v3/tree/master/versioned_docs/version-3.4/tutorial/tutorial-basics/ta060-add-attributes.md","tags":[],"version":"3.4","sidebarPosition":6,"frontMatter":{"sidebar_position":6,"description":"Attributes are attached to both point cloud and surface mesh data."},"sidebar":"docs","previous":{"title":"Interpretation tools","permalink":"/docs/tutorial/tutorial-basics/ta050-basic-intepretation"},"next":{"title":"Wrap-up","permalink":"/docs/tutorial/tutorial-basics/ta070-congratulations"}}');var s=i(74848),r=i(28453);const a={sidebar_position:6,description:"Attributes are attached to both point cloud and surface mesh data."},o="Attribute Generation and Analysis",l={},c=[{value:"Creating attributes",id:"creating-attributes",level:2},{value:"False Colour",id:"false-colour",level:3},{value:"Attributes common to point clouds and meshes",id:"attributes-common-to-point-clouds-and-meshes",level:2},{value:"Tensor Analysis",id:"tensor-analysis",level:3},{value:"Colour Conversion",id:"colour-conversion",level:3},{value:"Editing and Filtering Attributes",id:"editing-and-filtering-attributes",level:2},{value:"Colour Maps",id:"colour-maps",level:3},{value:"Perceptually uniform (sequential)",id:"perceptually-uniform-sequential",level:4},{value:"Diverging and cyclic",id:"diverging-and-cyclic",level:4},{value:"Single-hue and elevation-specific",id:"single-hue-and-elevation-specific",level:4},{value:"Filters",id:"filters",level:3},{value:"RGB Blended Display",id:"rgb-blended-display",level:3},{value:"See also",id:"see-also",level:2}];function d(e){const t={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",li:"li",ol:"ol",p:"p",section:"section",strong:"strong",sup:"sup",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.header,{children:(0,s.jsx)(t.h1,{id:"attribute-generation-and-analysis",children:"Attribute Generation and Analysis"})}),"\n",(0,s.jsxs)(t.p,{children:["Attributes are attached to both ",(0,s.jsx)(t.strong,{children:"point cloud"})," and ",(0,s.jsx)(t.strong,{children:"surface mesh"})," data. Many attribute functions are common to both ",(0,s.jsx)(t.strong,{children:"point clouds"})," and ",(0,s.jsx)(t.strong,{children:"surface mesh"})," data."]}),"\n",(0,s.jsxs)(t.p,{children:["By default ",(0,s.jsx)(t.strong,{children:"point clouds"})," have ",(0,s.jsx)(t.code,{children:"Red"}),", ",(0,s.jsx)(t.code,{children:"Green"}),", and ",(0,s.jsx)(t.code,{children:"Blue"})," ",(0,s.jsx)(t.code,{children:"(RGB)"})," attributes, and ",(0,s.jsx)(t.code,{children:"intensity"})," if the information exists in the imported data. Sometimes these attributes may be ",(0,s.jsx)(t.code,{children:"NULL"})," (empty). ",(0,s.jsx)(t.em,{children:"VRGS"})," requires ",(0,s.jsx)(t.strong,{children:(0,s.jsx)(t.em,{children:"at least 1"})})," attribute in order to display a dataset. ",(0,s.jsx)(t.code,{children:"Red"}),", ",(0,s.jsx)(t.code,{children:"Green"}),", and ",(0,s.jsx)(t.code,{children:"Blue"})," attributes are preferred. False colour ",(0,s.jsx)(t.code,{children:"RGB"})," can be created based on ",(0,s.jsx)(t.code,{children:"elevation"})," or ",(0,s.jsx)(t.code,{children:"intensity"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"Meshes do not require any attributes to display them if they have associated textures."}),"\n",(0,s.jsx)(t.h2,{id:"creating-attributes",children:"Creating attributes"}),"\n",(0,s.jsx)(t.h3,{id:"false-colour",children:"False Colour"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.em,{children:"Right + click"})," a ",(0,s.jsx)(t.strong,{children:"point cloud"})," or ",(0,s.jsx)(t.strong,{children:"surface mesh"})," in the ",(0,s.jsx)(t.strong,{children:"Data"})," tree, then select ",(0,s.jsx)(t.code,{children:"Visualization \u2192 False Color \u2192 By Elevation"})," to colour the object by height, or ",(0,s.jsx)(t.code,{children:"By Attribute"})," to colour it by an attribute you have already generated."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"WARNING: Creating a false
1colour RGB set will overwrite any existing RGB values."})}),"\n",(0,s.jsx)(t.h2,{id:"attributes-common-to-point-clouds-and-meshes",children:"Attributes common to point clouds and meshes"}),"\n",(0,s.jsx)(t.h3,{id:"tensor-analysis",children:"Tensor Analysis"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.em,{children:"Right + click"})," the object in the ",(0,s.jsx)(t.strong,{children:"Data"})," tree and choose ",(0,s.jsx)(t.code,{children:"Attributes & Analysis \u2192 Tensor Analysis"})," (for a mesh, ",(0,s.jsx)(t.code,{children:"Attributes & Analysis \u2192 Geometry \u2192 Tensor Analysis"}),")."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.strong,{children:"WARNING: Potentially a very long operation."})}),"\n",(0,s.jsxs)(t.p,{children:["An approach developed by Fern\xe1ndez",(0,s.jsx)(t.sup,{children:(0,s.jsx)(t.a,{href:"#user-content-fn-1",id:"user-content-fnref-1","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"1"})})," and developed further by Garc\xeda-Sell\xe9s et. al.",(0,s.jsx)(t.sup,{children:(0,s.jsx)(t.a,{href:"#user-content-fn-2",id:"user-content-fnref-2","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"2"})})," uses a tensor analysis approach to analyse the topography of a ",(0,s.jsx)(t.strong,{children:"point"})," dataset to generate a variety of parameters. The dialog offers two ways of choosing the neighbourhood each point is analysed over:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"Sphere Radius"})," \u2014 the volume of the model around each point that the tensor analysis uses. As a minimum this should be twice the de-cluster distance, or twice the data spacing. Larger values give a smoothed result; small values are more susceptible to noise in the data."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.strong,{children:"K Nearest Neighbours"})," \u2014 use a fixed number of nearest points instead of a fixed distance, which adapts to varying point density. ",(0,s.jsx)(t.strong,{children:"Use Approximate Nearest Neighbours (fast)"})," trades a little accuracy for a large speed gain on big clouds."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"Check All"})," button selects all attributes for output."]}),"\n",(0,s.jsx)(t.p,{children:"The most useful attributes are:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Dip"})," & ",(0,s.jsx)(t.code,{children:"Azimuth"})," (of the outcrop model surface)"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Colinearity"})," (how linear the points are)"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Coplanarity"})," (how flat the points are)"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Observations"})," (the point count \u2014 useful to check if the sphere radius is too small or too big)"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"Grade"})," (0 rejected, 1 good, 2 excellent \u2014 colour the model by this to see at a glance where an orientation measurement can be trusted)"]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Every attribute the dialog can produce is defined in the ",(0,s.jsx)(t.a,{href:"/docs/general/meshes-point-clouds/attributes",children:"Attributes reference"}),", including the ",(0,s.jsx)(t.a,{href:"/docs/general/meshes-point-clouds/attributes#plane-fit-quality",children:"Plane Fit Quality"})," group that ",(0,s.jsx)(t.code,{children:"Grade"})," belongs to."]}),"\n",(0,s.jsx)(t.h3,{id:"colour-conversion",children:"Colour Conversion"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.code,{children:"Attributes & Analysis \u2192 Color Conversion"})," converts the ",(0,s.jsx)(t.code,{children:"RGB"})," values to a different colour space \u2014 greyscale, ",(0,s.jsx)(t.code,{children:"XYZ"}),", ",(0,s.jsx)(t.code,{children:"LAB"})," or ",(0,s.jsx)(t.code,{children:"HSV"})," \u2014 which may give a different visual representation of the data. Meshes can also take their ",(0,s.jsx)(t.code,{children:"RGB"})," straight from the texture."]}
1),"\n",(0,s.jsx)(t.h2,{id:"editing-and-filtering-attributes",children:"Editing and Filtering Attributes"}),"\n",(0,s.jsx)(t.h3,{id:"colour-maps",children:"Colour Maps"}),"\n",(0,s.jsxs)(t.p,{children:["By default, attributes are shown with a ",(0,s.jsx)(t.code,{children:"magma"})," colourmap, chosen in the ",(0,s.jsx)(t.strong,{children:"Properties Panel"})," for the attribute. ",(0,s.jsx)(t.em,{children:"VRGS"})," provides several other ",(0,s.jsx)(t.a,{href:"https://colorcet.com/",children:"perceptually uniform (or linear)"})," colourmaps. Perceptually uniform colourmaps minimise visualisation bias of the data and provide a universally readable dataset for people that may be colour-vision deficient",(0,s.jsx)(t.sup,{children:(0,s.jsx)(t.a,{href:"#user-content-fn-3",id:"user-content-fnref-3","data-footnote-ref":!0,"aria-describedby":"footnote-label",children:"3"})}),"."]}),"\n",(0,s.jsx)(t.h4,{id:"perceptually-uniform-sequential",children:"Perceptually uniform (sequential)"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"magma, inferno, plasma, viridis, cividis"}),"\n",(0,s.jsx)(t.li,{children:"batlow, lipari"}),"\n"]}),"\n",(0,s.jsx)(t.h4,{id:"diverging-and-cyclic",children:"Diverging and cyclic"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"vik, roma, broc (diverging \u2014 for data with a meaningful midpoint)"}),"\n",(0,s.jsx)(t.li,{children:"romaO, vikO, corkO, twilight (cyclic \u2014 for angular data such as azimuth, so that 0\xb0 and 360\xb0 share a colour)"}),"\n"]}),"\n",(0,s.jsx)(t.h4,{id:"single-hue-and-elevation-specific",children:"Single-hue and elevation-specific"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:"Blues, Reds, Greys"}),"\n",(0,s.jsx)(t.li,{children:"Ordnance Survey (OS) Elevation"}),"\n",(0,s.jsx)(t.li,{children:"USGS Elevation"}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:["Attributes can be transformed, edited, and displayed with different colourmaps. Current transforms are ",(0,s.jsx)(t.code,{children:"Log"}),", ",(0,s.jsx)(t.code,{children:"Square Root"}),", ",(0,s.jsx)(t.code,{children:"Clip"}),", ",(0,s.jsx)(t.code,{children:"Box-Cox"}),", ",(0,s.jsx)(t.code,{children:"Normalise"}),", and ",(0,s.jsx)(t.code,{children:"Exponential"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"Clip"})," attribute operation allows high and low values to be truncated, effectively performing a contrast stretch on the attribute. This allows the full colour scale to be used effectively in the display. The red and yellow dotted lines can be dragged to change the degree of clipping."]}),"\n",(0,s.jsx)(t.h3,{id:"filters",children:"Filters"}),"\n",(0,s.jsx)(t.p,{children:"The attribute properties also provide a means to filter by attributes, this allows us to, for example, show only the point where the dip attribute is > 45 degrees. Filters can be set on each attribute and the results of all the filters are combined to give the final display."}),"\n",(0,s.jsxs)(t.p,{children:["In the attributes property page (see above) check the ",(0,s.jsx)(t.code,{children:"Use Filter"})," option. Set the filter minimum and filter maximum values to match the range of values you wish to use. Then in the parent ",(0,s.jsx)(t.strong,{children:"point clouds"})," properties, check the ",(0,s.jsx)(t.code,{children:"Use Attribute Filters"})," box. This allows multiple filters to be switched off easily."]}),"\n",(0,s.jsx)(t.h3,{id:"rgb-blended-display",children:"RGB Blended Display"}),"\n",(0,s.jsxs)(t.p,{children:["False colour displays can be created by using attributes in place of the colour channels in the ",(0,s.jsx)(t.code,{children:"RGB"})," view. A display can be generated, for example, using ",(0,s.jsx)(t.code,{children:"Dip"})," for the ",(0,s.jsx)(t.code,{children:"Red"})," channel, ",(0,s.jsx)(t.code,{children:"Azimuth"})," for the ",(0,s.jsx)(t.code,{children:"Green"})," channel and ",(0,s.jsx)(t.code,{children:"co-planarity"})," for the ",(0,s.jsx)(t.code,{children:"blue"})," channel. In order to do this, show the attributes for the ",(0,s.jsx)(t.strong,{children:"point cloud"}),", then in the ",(0,s.jsx)(t.strong,{children:"Properties Panel"})," select the attributes to replace the ",(0,s.jsx)(t.code,{children:"Red"}),", ",(0,s.jsx)(t.code,{children:"Green"})," and ",(0,s.jsx)(t.code,{children:"Blue"})," colour channels with."]}),"\n",(0,s.jsx)(t.h2,{id:"see-also",children:"See also"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"/docs/general/meshes-point-clouds/attributes",children:"Attributes"})," \u2014 the full definition of every vertex and triangle attribute VRGS can compute."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"/docs/general/meshes-point-clouds/charts-and-plots",children:"Charts, Histograms and Filtering"})," \u2014 plotting an attribute's distribution and dragging the histogram to filter the 3D view."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.a,{href:"/docs/general/meshes-point-clouds/texture-attributes",children:"Texture Attributes"}
1)," \u2014 attributes taken from a mesh's texture rather than its geometry."]}),"\n"]}),"\n","\n",(0,s.jsxs)(t.section,{"data-footnotes":!0,className:"footnotes",children:[(0,s.jsx)(t.h2,{className:"sr-only",id:"footnote-label",children:"Footnotes"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{id:"user-content-fn-1",children:["\n",(0,s.jsxs)(t.p,{children:["Fern\xe1ndez, O. (2005) Obtaining a best fitting plane through 3D georeferenced data. J. Struct. Geol., 27, p. 855-858 ",(0,s.jsx)(t.a,{href:"https://www.sciencedirect.com/science/article/abs/pii/S0191814105000143",children:"https://www.sciencedirect.com/science/article/abs/pii/S0191814105000143"})," ",(0,s.jsx)(t.a,{href:"#user-content-fnref-1","data-footnote-backref":"","aria-label":"Back to reference 1",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{id:"user-content-fn-2",children:["\n",(0,s.jsxs)(t.p,{children:["Garc\xeda-Sell\xe9s, D., Falivene, O., Arbu\xe9s, P., Gratacos, O., Tavani, S. and Munoz, J.A., 2011. Supervised identification and reconstruction of near-planar geological surfaces from terrestrial laser scanning. Computers & Geosciences, 37(10), p.1584-1594. ",(0,s.jsx)(t.a,{href:"https://www.sciencedirect.com/science/article/abs/pii/S0098300411001099",children:"https://www.sciencedirect.com/science/article/abs/pii/S0098300411001099"})," ",(0,s.jsx)(t.a,{href:"#user-content-fnref-2","data-footnote-backref":"","aria-label":"Back to reference 2",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{id:"user-content-fn-3",children:["\n",(0,s.jsxs)(t.p,{children:["Crameri, F., Shephard, G.E. and Heron, P.J., 2020. The misuse of colour in science communication. Nature communications, 11(1), p.5444. ",(0,s.jsx)(t.a,{href:"https://www.nature.com/articles/s41467-020-19160-7",children:"https://www.nature.com/articles/s41467-020-19160-7"})," ",(0,s.jsx)(t.a,{href:"#user-content-fnref-3","data-footnote-backref":"","aria-label":"Back to reference 3",className:"data-footnote-backref",children:"\u21a9"})]}),"\n"]}),"\n"]}),"\n"]})]})}function h(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},28453(e,t,i){i.d(t,{R:()=>a,x:()=>o});var n=i(96540);const s={},r=n.createContext(s);function a(e){const t=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.