Extra Attributes
Unterstützung für Punktwolken mit beliebigen Zusatzattributen (06.08.2025)
Förderjahr 2023 / Projekt Call #18 / ProjektID: 6863 / Projekt: Potree-Next

Bis Version 1.3 war LAS sehr rigide und hat nur eine begrenzte, vordefinierte Menge von Attributen erlaubt. Seit version 1.4 werden auch beliebige extra bytes/atttribute erlaubt, die sich nach und nach zusätzlicher Beliebtheit erfreuen. 

Mit diesem Update unterstützt Potree-Next jetzt auch frei programmierbare extra attributes, wodurch Nutzer ihre Punktwolkenattribute aus verschiedensten Softwarepaketen visualisieren können. Terrasolid nutzt zum Beispiel eigene Zusatzattribute "Group" und "Normal", mit speziellen encodings die so nicht standardisiert, und daher ausserhalb von Terrasolid nicht verwendbar sind. In Potree-Next können Nutzer jetzt eigene vertex-shader schreiben die zur Laufzeit die bytes der extra attributes dekodieren und in Farben umwandeln. 

Im folgenden Bild ist dieselbe Punktwolke einmal mit Standard RGB Farben zu sehen, und darunter die Attribute "Normals", "Returns", und "Groups".

  • Normals können für Beleuchtungsmodelle genutzt werden, welche Nutzer mit vertex shadern nun recht einfach Programmieren können.
  • "Returns" ist kein spezielles Attribut sondern setzt sich aus "Number of Returns" und "Return Number" zusammen. Potree-Next zeigt einem diese standardmässig separat an, aber mit einem eigenen vertex-shader können user diese in die aus den Lastools bekannte visualisierung umwandeln.
  • "Groups" ist ebenfalls ein Terrasolid-spezifisches Attribut welches dekodiert werden muss um vernünftig angezeigt zu werden.

extra attributes

Support für das "normal" Attribut aus Terrasolid können Nutzer z.b. folgendermaßen einbauen:  

let TERRASCAN_NORMAL = {
    name: "normal (terrascan 2-15-15)",
    condition: (attribute) => (attribute.description === "Normal vector 2+15+15 bits"),
    inputs: [],
    wgsl: `
        fn mapping(pointID : u32, attrib : AttributeDescriptor, node : Node, position : vec4f) -> vec4f {
            var PI = 3.1415;
            var HML = (2.0 * PI) / 32767.0;
            var VML = PI / 32767.0;
            
            var offset = node.numPoints * attrib.offset + attrib.byteSize * pointID;
            var value = readU32(offset);

            var mask_15b = (1u << 15u) - 1u;

            var dim = value & 3u;
            var horzAngle = f32((value >>  2u) & mask_15b);
            var vertAngle = f32((value >> 17u) & mask_15b);

            var ang = (VML * vertAngle) - 0.5 * PI;
            var zvl = sin(ang);
            var xml = sqrt( 1.0 - (zvl * zvl));

            var normal : vec3<f32>;
            normal.x = xml * cos(HML * horzAngle);
            normal.y = xml * sin(HML * horzAngle);
            normal.z = zvl;

            var color = vec4f(normal, 1.0);

            return color;
        }
    `,
};

material.registerMapping(TERRASCAN_NORMAL);

 

In der Auswahl der darzustellenden Attribute scheint nun "normal (terrascan 2-15-15)" als weiteres Mapping zur Auswahl auf, welches die Normalen richtig dekodiert und darstellt -- Zusätzlich zu dem Standardmapping "scalar" welches bei eindimensionalen Zahlenwerten immer aufscheint, aber in diesem Fall nicht geeignet ist. 

 

 

CAPTCHA
Diese Frage dient der Überprüfung, ob Sie ein menschlicher Besucher sind und um automatisierten SPAM zu verhindern.