{"id":974,"date":"2026-10-01T15:54:12","date_gmt":"2026-10-01T13:54:12","guid":{"rendered":"https:\/\/tree-inspection-technologies.de\/?page_id=974"},"modified":"2026-10-16T21:14:56","modified_gmt":"2026-10-16T19:14:56","slug":"logeos","status":"publish","type":"page","link":"https:\/\/tree-inspection-technologies.de\/englisch\/logeos\/","title":{"rendered":"LoGeoS"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"974\" class=\"elementor elementor-974\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6c0e3d1 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"6c0e3d1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6c0e3d2 elementor-widget elementor-widget-html\" data-id=\"6c0e3d2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- LoGeoS Hero 3D \u2013 Einbettung f\u00fcr das Elementor-HTML-Widget.\n     Erzeugt von build.sh, nicht von Hand bearbeiten. Alle Styles unter #logeos-hero,\n     damit nichts mit dem Theme kollidiert. -->\n<style>\n  #logeos-hero {\n    --lg-bg: #06101a; --lg-teal: #2ee6f6; --lg-text: #e8eef2; --lg-muted: #7f95a4;\n    position: relative; height: 380vh;\n    width: 100%;\n    background: var(--lg-bg); color: var(--lg-text);\n    font-family: 'Inter', system-ui, sans-serif; -webkit-font-smoothing: antialiased;\n  }\n  #logeos-hero *, #logeos-hero *::before, #logeos-hero *::after { box-sizing: border-box; margin: 0; padding: 0; }\n  #logeos-hero .lg-sticky {\n    position: sticky; top: 0; height: 100vh; width: 100%;\n    overflow: hidden; background: var(--lg-bg);\n  }\n  #logeos-hero canvas { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }\n  #logeos-hero .lg-sticky::after {\n    content: ''; position: absolute; inset: 0; pointer-events: none; bottom: var(--lg-cut, 0px);\n    background: linear-gradient(to top, rgba(3,9,16,.92) 0%, rgba(3,9,16,.65) 18%, rgba(3,9,16,0) 46%);\n  }\n  #logeos-hero .lg-ui {\n    position: absolute; inset: 0; z-index: 2; pointer-events: none;\n    \/* --lg-cut: wie weit der Bildbereich unten aus dem Fenster ragt (per Script) *\/\n    bottom: var(--lg-cut, 0px);\n    display: flex; flex-direction: column; justify-content: flex-end;\n    padding: clamp(20px, 4vw, 56px);\n  }\n  #logeos-hero .caption-stack { position: relative; height: 160px; max-width: 560px; }\n  #logeos-hero .caption {\n    position: absolute; bottom: 0; left: 0;\n    opacity: 0; transform: translateY(14px);\n    transition: opacity .5s ease, transform .5s ease;\n  }\n  #logeos-hero .caption.visible { opacity: 1; transform: translateY(0); }\n  #logeos-hero .caption h2 {\n    font-family: 'Inter', system-ui, sans-serif; color: var(--lg-text);\n    font-size: clamp(28px, 3.6vw, 48px); font-weight: 900;\n    letter-spacing: normal; line-height: 1.05; margin-bottom: 14px;\n  }\n  #logeos-hero .caption p {\n    font-family: 'Inter', system-ui, sans-serif;\n    color: #a9bac6; font-size: clamp(16px, 1.25vw, 18px); line-height: 1.6; font-weight: 400;\n  }\n  #logeos-hero .caption em { color: var(--lg-teal); font-style: normal; }\n  #logeos-hero .lg-label {\n    font-size: 12px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase;\n    color: var(--lg-teal); margin-bottom: 14px;\n  }\n  #logeos-hero .scroll-hint {\n    position: absolute; bottom: calc(20px + var(--lg-cut, 0px)); left: 50%; transform: translateX(-50%); z-index: 3;\n    font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase;\n    color: var(--lg-muted); animation: lg-pulse 2.4s ease-in-out infinite;\n  }\n  @keyframes lg-pulse { 0%,100% { opacity: .3 } 50% { opacity: .85 } }\n  @media (max-width: 720px) {\n    #logeos-hero { height: 320vh; }\n    #logeos-hero .caption-stack { height: 190px; }\n    #logeos-hero .scroll-hint { display: none; }\n  }\n  \/* Sprache: TranslatePress setzt auf englischen Seiten lang=\"en-GB\" *\/\n  #logeos-hero .lg-en { display: none; }\n  html[lang^=\"en\"] #logeos-hero .lg-en { display: block; }\n  html[lang^=\"en\"] #logeos-hero span.lg-en { display: inline; }\n  html[lang^=\"en\"] #logeos-hero .lg-de { display: none; }\n<\/style>\n\n<section id=\"logeos-hero\" aria-label=\"LoGeoS\">\n  <div class=\"lg-sticky\">\n    <canvas id=\"hero-canvas\" aria-hidden=\"true\"><\/canvas>\n    <div class=\"lg-ui\">\n      <div class=\"caption-stack\">\n        <div class=\"caption\" data-phase=\"0,0.10\">\n          <p class=\"lg-label\" data-no-translation>LoGeoS \u00b7 Low Effort Geometry Scanner<\/p>\n          <div class=\"lg-de\" lang=\"de\" data-no-translation>\n            <h2>Kein Baum ist rund.<\/h2>\n            <p>Wurzelanl\u00e4ufe, ovale Querschnitte, Beulen \u2013 die Form entscheidet \u00fcber die Statik.<\/p>\n          <\/div>\n          <div class=\"lg-en\" lang=\"en\" data-no-translation>\n            <h2>No tree is round.<\/h2>\n            <p>Root flares, oval cross-sections, bulges \u2013 the shape determines stability.<\/p>\n          <\/div>\n        <\/div>\n        <div class=\"caption\" data-phase=\"0.10,0.55\">\n          <div class=\"lg-de\" lang=\"de\" data-no-translation>\n            <h2>Einmal umrunden.<\/h2>\n            <p>Die iPhone-Kamera erkennt die nummerierten Schilder an den Messpunkten \u2013 jedes erfasste Schild leuchtet <em>gr\u00fcn<\/em>.<\/p>\n          <\/div>\n          <div class=\"lg-en\" lang=\"en\" data-no-translation>\n            <h2>One walk around.<\/h2>\n            <p>The iPhone camera recognises the numbered tags at the measuring points \u2013 every captured tag lights up <em>green<\/em>.<\/p>\n          <\/div>\n        <\/div>\n        <div class=\"caption\" data-phase=\"0.55,0.90\">\n          <div class=\"lg-de\" lang=\"de\" data-no-translation>\n            <h2>Jeder Messpunkt in 3D.<\/h2>\n            <p>Bis zu 48 Messpunkte, r\u00e4umlich erfasst \u2013 samt GPS-Position und Nordausrichtung.<\/p>\n          <\/div>\n          <div class=\"lg-en\" lang=\"en\" data-no-translation>\n            <h2>Every measuring point in 3D.<\/h2>\n            <p>Up to 48 measuring points captured in space \u2013 including GPS position and north direction.<\/p>\n          <\/div>\n        <\/div>\n        <div class=\"caption\" data-phase=\"0.90,1.01\">\n          <div class=\"lg-de\" lang=\"de\" data-no-translation>\n            <h2>Bereit f\u00fcr die Tomographie.<\/h2>\n            <p>Export als .pit, .trt oder .txt \u2013 oder direkt in eine bestehende .pit- bzw. .trt-Datei einf\u00fcgen.<\/p>\n          <\/div>\n          <div class=\"lg-en\" lang=\"en\" data-no-translation>\n            <h2>Ready for tomography.<\/h2>\n            <p>Export as .pit, .trt or .txt \u2013 or merge straight into an existing .pit or .trt file.<\/p>\n          <\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n    <div class=\"scroll-hint\" data-no-translation><span class=\"lg-de\" lang=\"de\">Scrollen<\/span><span class=\"lg-en\" lang=\"en\">Scroll<\/span><\/div>\n  <\/div>\n<\/section>\n\n<script type=\"module\">\nimport * as THREE from 'https:\/\/cdn.jsdelivr.net\/npm\/three@0.169.0\/build\/three.module.min.js';\n\n\/\/ ===== glsl.js\n\n\/**\n * Gemeinsame GLSL-Bausteine f\u00fcr alle Materialien der Hero-Animation.\n * Als JS-Strings, damit kein Build-Step n\u00f6tig ist.\n *\/\n\n\/** 3D Value-Noise + fbm. Deterministisch, ohne Texturen. *\/\nconst NOISE = \/* glsl *\/ `\nfloat hash31(vec3 p) {\n  p = fract(p * 0.3183099 + vec3(0.71, 0.113, 0.419));\n  p *= 17.0;\n  return fract(p.x * p.y * p.z * (p.x + p.y + p.z));\n}\n\nfloat vnoise(vec3 x) {\n  vec3 i = floor(x);\n  vec3 f = fract(x);\n  f = f * f * (3.0 - 2.0 * f);\n  return mix(\n    mix(mix(hash31(i + vec3(0,0,0)), hash31(i + vec3(1,0,0)), f.x),\n        mix(hash31(i + vec3(0,1,0)), hash31(i + vec3(1,1,0)), f.x), f.y),\n    mix(mix(hash31(i + vec3(0,0,1)), hash31(i + vec3(1,0,1)), f.x),\n        mix(hash31(i + vec3(0,1,1)), hash31(i + vec3(1,1,1)), f.x), f.y),\n    f.z);\n}\n\nfloat fbm(vec3 p, int octaves) {\n  float a = 0.5;\n  float s = 0.0;\n  for (int i = 0; i < 6; i++) {\n    if (i >= octaves) break;\n    s += a * vnoise(p);\n    p *= 2.03;\n    a *= 0.5;\n  }\n  return s;\n}\n`;\n\n\/**\n * Der Kern der Animation: der azimutale Scan-Reveal.\n *\n * F\u00fcr jeden Fragment wird der Winkel um die Stammachse bestimmt und mit dem\n * Scan-Fortschritt verglichen. Ergebnis:\n *   1.0 = bereits erfasst (Wireframe)\n *   0.0 = noch nicht erfasst (Rinde)\n * Dazwischen liegt die \"Scan-Front\", auf der der \u00dcbergang stattfindet.\n *\/\nconst REVEAL = \/* glsl *\/ `\nuniform float uProgress;   \/\/ 0..1+ Scan-Fortschritt (Anteil des Umlaufs)\nuniform float uScanStart;  \/\/ Startwinkel des Scans, 0..1\nuniform float uFeather;    \/\/ Breite der \u00dcbergangszone, in Umlauf-Anteilen\nuniform vec2  uAxis;       \/\/ Stammachse in XZ (meist 0,0)\n\n\/\/ Position im Scan-Umlauf: 0 = Startwinkel, 1 = volle Runde\nfloat scanCoord(vec3 worldPos) {\n  vec2 d = worldPos.xz - uAxis;\n  float phi = atan(d.y, d.x);              \/\/ -PI..PI\n  float a = (phi + 3.14159265) \/ 6.28318531; \/\/ 0..1\n  \/\/ Scan l\u00e4uft gegen den Winkel: im Bild von links nach rechts\n  return fract(uScanStart - a + 1.0);\n}\n\n\/\/ 0 = unber\u00fchrt, 1 = vollst\u00e4ndig erfasst\nfloat reveal(vec3 worldPos) {\n  float rel = scanCoord(worldPos);\n  return 1.0 - smoothstep(uProgress - uFeather, uProgress, rel);\n}\n`;\n\n\/**\n * Der Hintergrundverlauf wird in WebGL gerendert, nicht in CSS \u2013 nur so kennen\n * die Materialien die exakte Hintergrundfarbe an jedem Bildpunkt und k\u00f6nnen\n * ohne sichtbare Kante hineinblenden (Bodenrand, Tiefenabfall).\n *\/\nconst BACKDROP = \/* glsl *\/ `\nuniform vec2 uResolution;\n\nvec3 backdropColor(vec2 fragCoord) {\n  vec2 uv = fragCoord \/ uResolution;\n  vec2 d = (uv - vec2(0.5, 0.42)) \/ vec2(0.90, 0.70);\n  float r = clamp(length(d) * 1.15, 0.0, 1.0);\n  \/\/ Werte im LINEAREN Raum \u2013 der Renderer konvertiert am Ende nach sRGB.\n  \/\/ (entspricht #0d1c2a \/ #06101a \/ #020810)\n  vec3 inner = vec3(0.0040, 0.0117, 0.0242);\n  vec3 mid   = vec3(0.0019, 0.0052, 0.0110);\n  vec3 outer = vec3(0.0006, 0.0024, 0.0052);\n  return r < 0.55\n    ? mix(inner, mid, smoothstep(0.0, 0.55, r))\n    : mix(mid, outer, smoothstep(0.55, 1.0, r));\n}\n`;\n\n\/** Vertex-Shader, den sich Solid- und Wire-Material teilen. *\/\nconst VERTEX = \/* glsl *\/ `\nuniform float uSurfaceOffset; \/\/ schiebt das grobe Drahtnetz minimal nach au\u00dfen\n\nattribute vec3 aBary;     \/\/ Barycentrische Koordinaten f\u00fcr Single-Pass-Wireframe\nattribute vec3 aNormalS;  \/\/ Analytisch berechnete, weiche Normale\nattribute vec2 aSurf;     \/\/ x = Winkel 0..1, y = H\u00f6he 0..1\nattribute float aKind;    \/\/ 0 = Stamm, 1 = Boden\n\nvarying vec3  vWorldPos;\nvarying vec3  vNormalW;\nvarying vec3  vBary;\nvarying vec2  vSurf;\nvarying float vKind;\n\nvoid main() {\n  vec4 wp = modelMatrix * vec4(position + aNormalS * uSurfaceOffset, 1.0);\n  vWorldPos = wp.xyz;\n  vNormalW  = normalize(mat3(modelMatrix) * aNormalS);\n  vBary     = aBary;\n  vSurf     = aSurf;\n  vKind     = aKind;\n  gl_Position = projectionMatrix * viewMatrix * wp;\n}\n`;\n\n\/\/ ===== treeGeometry.js\n\n\n\/**\n * Prozeduraler Baumstamm-Fu\u00df mit Wurzelanl\u00e4ufen und umgebender Bodenscheibe.\n *\n * Bewusst KEIN kreisrunder Zylinder: echte B\u00e4ume sind oval, haben Beulen und\n * kr\u00e4ftige Wurzelanl\u00e4ufe. Genau das ist ja der Grund, warum die Geometrie\n * \u00fcberhaupt gemessen werden muss.\n *\n * Erzeugt eine non-indexed BufferGeometry, damit jedes Dreieck eigene\n * barycentrische Koordinaten bekommt (Single-Pass-Wireframe im Shader).\n *\/\n\n\/\/ ---------------------------------------------------------------- Noise (CPU)\n\nfunction hash31(x, y, z) {\n  let px = x * 0.3183099 + 0.71;\n  let py = y * 0.3183099 + 0.113;\n  let pz = z * 0.3183099 + 0.419;\n  px = (px - Math.floor(px)) * 17.0;\n  py = (py - Math.floor(py)) * 17.0;\n  pz = (pz - Math.floor(pz)) * 17.0;\n  const v = px * py * pz * (px + py + pz);\n  return v - Math.floor(v);\n}\n\nfunction vnoise(x, y, z) {\n  const ix = Math.floor(x), iy = Math.floor(y), iz = Math.floor(z);\n  let fx = x - ix, fy = y - iy, fz = z - iz;\n  fx = fx * fx * (3 - 2 * fx);\n  fy = fy * fy * (3 - 2 * fy);\n  fz = fz * fz * (3 - 2 * fz);\n  const lerp = (a, b, t) => a + (b - a) * t;\n  const c000 = hash31(ix, iy, iz),     c100 = hash31(ix + 1, iy, iz);\n  const c010 = hash31(ix, iy + 1, iz), c110 = hash31(ix + 1, iy + 1, iz);\n  const c001 = hash31(ix, iy, iz + 1), c101 = hash31(ix + 1, iy, iz + 1);\n  const c011 = hash31(ix, iy + 1, iz + 1), c111 = hash31(ix + 1, iy + 1, iz + 1);\n  return lerp(\n    lerp(lerp(c000, c100, fx), lerp(c010, c110, fx), fy),\n    lerp(lerp(c001, c101, fx), lerp(c011, c111, fx), fy),\n    fz);\n}\n\nfunction fbm(x, y, z, octaves = 4) {\n  let a = 0.5, s = 0;\n  for (let i = 0; i < octaves; i++) {\n    s += a * vnoise(x, y, z);\n    x *= 2.03; y *= 2.03; z *= 2.03;\n    a *= 0.5;\n  }\n  return s;\n}\n\n\/\/ ------------------------------------------------------------ Form-Parameter\n\nconst TREE = {\n  \/\/ Bewusst h\u00f6her als der Bildausschnitt: der Stamm l\u00e4uft oben aus dem Bild,\n  \/\/ statt mit einer sichtbaren Schnittkante zu enden.\n  height: 5.4,\n  baseRadius: 0.64,   \/\/ alter Alleebaum: deutlich kr\u00e4ftiger als im LOFOR-Hero\n  flareTop: 0.22,     \/\/ bis zu welchem H\u00f6henanteil die Wurzelanl\u00e4ufe reichen\n  groundRadius: 6.0,  \/\/ Radius der Bodenscheibe (Rand wird ausgeblendet)\n  radialSegments: 260,\n  heightSegments: 130,\n  groundRings: 28,\n};\n\n\/**\n * Rindenwunde wie am Foto: ein l\u00e4nglicher, linsenf\u00f6rmiger Streifen, an dem die\n * Rinde fehlt und das verwitterte Holz frei liegt. Seitlich davon w\u00f6lbt sich\n * die \u00dcberwallung (Kallus) als Wulst auf.\n * Dieselben Zahlen stehen im Shader (materials.js, woundMask) \u2013 bei \u00c4nderungen\n * beide anpassen.\n *\/\nconst WOUND = {\n  theta: 0.62,     \/\/ Richtung (rad) \u2013 von der Startposition der Kamera aus gut sichtbar\n  t0: -0.02,       \/\/ unten: reicht bis in den Boden\n  t1: 0.50,        \/\/ oben: endet spitz auf knapp 3 m\n  halfWidth: 0.34, \/\/ halbe Breite an der dicksten Stelle (rad)\n};\n\n\/** 0..1 innerhalb der Wunde, plus Wulst am Rand. d = normierter Abstand zur Mittellinie. *\/\nfunction woundMask(theta, t) {\n  const u = (t - WOUND.t0) \/ (WOUND.t1 - WOUND.t0);\n  if (u <= 0 || u >= 1) return { inside: 0, lip: 0 };\n  \/\/ Linsenform: unten breit, oben spitz zulaufend\n  const w = WOUND.halfWidth * Math.pow(Math.sin(Math.PI * Math.pow(u, 0.8)), 0.7);\n  \/\/ leicht geschwungene Mittellinie\n  const center = WOUND.theta + 0.05 * Math.sin(u * 5.0);\n  let dTheta = theta - center;\n  dTheta = Math.atan2(Math.sin(dTheta), Math.cos(dTheta));\n  const d = Math.abs(dTheta) \/ Math.max(w, 1e-4);\n  const s = (a, b, x) => { const k = Math.min(Math.max((x - a) \/ (b - a), 0), 1); return k * k * (3 - 2 * k); };\n  const inside = 1 - s(0.82, 1.0, d);\n  const lip = Math.exp(-Math.pow((d - 1.20) \/ 0.34, 2)) * Math.pow(Math.sin(Math.PI * u), 0.5);\n  return { inside, lip };\n}\n\n\/** Leichte Kr\u00fcmmung der Stammachse \u2013 Alleeb\u00e4ume stehen selten lotrecht. *\/\nfunction trunkCenter(t) {\n  return [0.17 * Math.pow(t, 1.6) - 0.03 * Math.sin(t * 6.0), 0.07 * Math.sin(t * 3.8)];\n}\n\n\/** Radius des Stamms bei Winkel theta (rad) und relativer H\u00f6he t (0..1). *\/\nfunction trunkRadius(theta, t) {\n  const cx = Math.cos(theta), cz = Math.sin(theta);\n\n  \/\/ Grundverj\u00fcngung nach oben\n  let r = TREE.baseRadius * (1.0 - 0.15 * t);\n\n  \/\/ Deutlich unrunder Querschnitt \u2013 die Lappen drehen sich mit der H\u00f6he etwas\n  const twist = t * 1.4;\n  r *= 1.0\n    + 0.11 * Math.cos(2.0 * theta + 0.55 + twist)\n    + 0.06 * Math.cos(3.0 * theta - 1.2 - twist * 0.6)\n    + 0.03 * Math.cos(5.0 * theta + 2.1 + twist);\n\n  \/\/ Gro\u00dffl\u00e4chige Beulen, langsam \u00fcber die H\u00f6he wandernd\n  const bulge = fbm(cx * 1.6 + 5.0, cz * 1.6 + 5.0, t * 3.2, 4) - 0.5;\n  r *= 1.0 + 0.26 * bulge;\n\n  \/\/ L\u00e4ngsfalten: W\u00fclste, wie sie alte St\u00e4mme \u00fcber den Wurzelanl\u00e4ufen bilden\n  const folds = [\n    { dir: 1.20, w: 0.20, amp: 0.045, top: 0.55 },\n    { dir: 2.35, w: 0.14, amp: 0.035, top: 0.75 },\n    { dir: 3.95, w: 0.24, amp: 0.050, top: 0.45 },\n    { dir: 5.10, w: 0.16, amp: 0.030, top: 0.65 },\n  ];\n  for (const f of folds) {\n    let d = theta - f.dir; d = Math.atan2(Math.sin(d), Math.cos(d));\n    const fade = Math.max(0, 1 - t \/ f.top);\n    r += f.amp * Math.exp(-(d * d) \/ (f.w * f.w)) * Math.pow(fade, 0.7);\n  }\n\n  \/\/ Ein paar Beulen\/Maserknollen\n  const burls = [\n    { dir: 4.55, t: 0.30, s: 0.020, amp: 0.05 },\n    { dir: 2.90, t: 0.47, s: 0.030, amp: 0.04 },\n    { dir: 0.95, t: 0.62, s: 0.020, amp: 0.035 },\n  ];\n  for (const b of burls) {\n    let d = theta - b.dir; d = Math.atan2(Math.sin(d), Math.cos(d));\n    const dt = (t - b.t) * 3.0;\n    r += b.amp * Math.exp(-(d * d * 0.35 + dt * dt) \/ b.s);\n  }\n\n  \/\/ Wurzelanl\u00e4ufe: einzelne Rippen mit unterschiedlicher Reichweite nach oben.\n  const ribs = [\n    { dir: 0.35, amp: 0.95, sharp: 6.0, reach: 1.00 },\n    { dir: 1.55, amp: 0.60, sharp: 9.0, reach: 0.62 },\n    { dir: 2.70, amp: 0.82, sharp: 5.0, reach: 0.85 },\n    { dir: 3.60, amp: 0.42, sharp: 11.0, reach: 0.48 },\n    { dir: 4.60, amp: 0.70, sharp: 7.0, reach: 0.75 },\n    { dir: 5.55, amp: 0.55, sharp: 8.0, reach: 0.58 },\n  ];\n  for (const rib of ribs) {\n    const top = TREE.flareTop * rib.reach;\n    if (t >= top) continue;\n    const fall = Math.pow(1 - t \/ top, 2.2);\n    const d = Math.cos(theta - rib.dir);\n    if (d > 0) r += fall * rib.amp * Math.pow(d, rib.sharp) * 0.55;\n  }\n\n  \/\/ Gemeinsame Verbreiterung des Fu\u00dfes, in die sich die Rippen einbetten\n  const foot = Math.pow(Math.max(0, 1 - t \/ (TREE.flareTop * 1.35)), 3.0);\n  r += foot * 0.20;\n\n  \/\/ Wunde: Holz liegt etwas tiefer, die R\u00e4nder w\u00f6lben sich auf\n  const wm = woundMask(theta, t);\n  r += -0.085 * wm.inside + 0.15 * wm.lip;\n\n  \/\/ Feine Rindenwelligkeit, damit die Silhouette nicht glatt wirkt\n  r += 0.014 * (fbm(cx * 7.0, cz * 7.0, t * 9.0, 3) - 0.5);\n\n  return r;\n}\n\n\/**\n * Nachschlagetabelle f\u00fcr trunkRadius.\n *\n * Die LiDAR-Strahlen m\u00fcssen pro Bild wissen, wo sie auf den Stamm treffen.\n * trunkRadius direkt auszuwerten w\u00e4re daf\u00fcr zu teuer (fbm pro Aufruf), die\n * Form ist aber statisch \u2013 also einmal abtasten und bilinear interpolieren.\n *\/\nfunction buildRadiusLUT(nTheta = 512, nT = 192) {\n  const data = new Float32Array(nTheta * nT);\n  for (let j = 0; j < nT; j++) {\n    const t = j \/ (nT - 1);\n    for (let i = 0; i < nTheta; i++) {\n      data[j * nTheta + i] = trunkRadius((i \/ nTheta) * Math.PI * 2, t);\n    }\n  }\n  return { data, nTheta, nT };\n}\n\n\/** @param theta rad (beliebig), @param t 0..1 *\/\nfunction sampleRadius(lut, theta, t) {\n  const { data, nTheta, nT } = lut;\n  let a = (theta \/ (Math.PI * 2)) % 1;\n  if (a < 0) a += 1;\n  const fi = a * nTheta;\n  const i0 = Math.floor(fi) % nTheta;\n  const i1 = (i0 + 1) % nTheta;\n  const fu = fi - Math.floor(fi);\n\n  const ft = Math.min(Math.max(t, 0), 1) * (nT - 1);\n  const j0 = Math.floor(ft);\n  const j1 = Math.min(j0 + 1, nT - 1);\n  const fv = ft - j0;\n\n  const r00 = data[j0 * nTheta + i0], r10 = data[j0 * nTheta + i1];\n  const r01 = data[j1 * nTheta + i0], r11 = data[j1 * nTheta + i1];\n  return (r00 * (1 - fu) + r10 * fu) * (1 - fv) + (r01 * (1 - fu) + r11 * fu) * fv;\n}\n\n\/** H\u00f6he des Bodens bei Winkel theta und Abstand d von der Stammachse. *\/\nfunction groundHeight(theta, d) {\n  const cx = Math.cos(theta) * d, cz = Math.sin(theta) * d;\n  \/\/ Wurzelteller: leichte Aufw\u00f6lbung direkt am Stamm\n  const mound = 0.18 * Math.exp(-Math.pow(d \/ 1.15, 2.0));\n  const rough = 0.055 * (fbm(cx * 1.9, 3.7, cz * 1.9, 4) - 0.5);\n  const coarse = 0.09 * (fbm(cx * 0.6, 11.2, cz * 0.6, 3) - 0.5);\n  return mound + rough + coarse;\n}\n\n\/\/ ------------------------------------------------------------- Geometrie-Bau\n\n\/**\n * Baut ein Gitter aus Punkten und trianguliert es.\n * Die Diagonale jedes Quads wird pseudozuf\u00e4llig gekippt und die Punkte leicht\n * verschoben \u2013 dadurch entsteht das unregelm\u00e4\u00dfige Netz eines echten Scans\n * statt eines offensichtlichen Zylindergitters.\n *\/\nfunction triangulateGrid(grid, out, kind, flip = false) {\n  const rows = grid.length;\n  const cols = grid[0].length;\n  const bary = [[1, 0, 0], [0, 1, 0], [0, 0, 1]];\n\n  const pushTri = (a, b, c) => {\n    const tri = flip ? [a, c, b] : [a, b, c];\n    for (let k = 0; k < 3; k++) {\n      const v = tri[k];\n      out.position.push(v.p[0], v.p[1], v.p[2]);\n      out.normal.push(v.n[0], v.n[1], v.n[2]);\n      out.surf.push(v.s[0], v.s[1]);\n      out.bary.push(bary[k][0], bary[k][1], bary[k][2]);\n      out.kind.push(kind);\n    }\n  };\n\n  for (let j = 0; j < rows - 1; j++) {\n    for (let i = 0; i < cols; i++) {\n      const i2 = (i + 1) % cols;\n      const v00 = grid[j][i], v01 = grid[j][i2];\n      const v10 = grid[j + 1][i], v11 = grid[j + 1][i2];\n      \/\/ Diagonale kippen -> Netz wirkt organisch statt gerastert\n      if (hash31(i * 1.7, j * 2.3, 4.1) > 0.5) {\n        pushTri(v00, v10, v11);\n        pushTri(v00, v11, v01);\n      } else {\n        pushTri(v00, v10, v01);\n        pushTri(v01, v10, v11);\n      }\n    }\n  }\n}\n\n\/**\n * @param {number} scale Aufl\u00f6sungsfaktor. Das Solid braucht ein feines Netz f\u00fcr\n *   eine saubere Silhouette, das Drahtmodell ein grobes, damit die einzelnen\n *   Dreiecke lesbar bleiben statt zuzumatschen. Beide nutzen dieselbe\n *   Formfunktion, liegen also deckungsgleich.\n *\/\nfunction buildTreeGeometry(scale = 1) {\n  const N = Math.round(TREE.radialSegments * scale);\n  const M = Math.round(TREE.heightSegments * scale);\n  const groundRings = Math.max(6, Math.round(TREE.groundRings * scale));\n  const out = { position: [], normal: [], surf: [], bary: [], kind: [] };\n\n  \/\/ ---- Stamm -------------------------------------------------------------\n  const trunkGrid = [];\n  for (let j = 0; j <= M; j++) {\n    \/\/ Ringe unten dichter setzen, dort sitzt die interessante Geometrie\n    const t = Math.pow(j \/ M, 1.45);\n    const y = t * TREE.height;\n    const row = [];\n    for (let i = 0; i < N; i++) {\n      \/\/ Jitter in Winkel und H\u00f6he, aber pro Ring konsistent an der Naht\n      const jt = (hash31(i * 3.1, j * 5.7, 1.3) - 0.5) * (Math.PI * 2 \/ N) * 0.55;\n      const theta = (i \/ N) * Math.PI * 2 + jt;\n      const jy = (hash31(i * 2.9, j * 1.1, 7.7) - 0.5) * (TREE.height \/ M) * 0.5;\n      const yy = Math.max(0, y + (j === 0 || j === M ? 0 : jy));\n      const tt = yy \/ TREE.height;\n\n      const cc = trunkCenter(tt);\n      const r = trunkRadius(theta, tt);\n      const lx = Math.cos(theta) * r;\n      const lz = Math.sin(theta) * r;\n      const px = lx + cc[0];\n      const pz = lz + cc[1];\n\n      \/\/ Normale numerisch aus der Radiusfunktion (inkl. Achskr\u00fcmmung)\n      const h = 0.004;\n      const tY = Math.min(1, tt + h);\n      const cY = trunkCenter(tY);\n      const rT = trunkRadius(theta + h, tt);\n      const rY = trunkRadius(theta, tY);\n      const tanT = [\n        Math.cos(theta + h) * rT - lx, 0, Math.sin(theta + h) * rT - lz,\n      ];\n      const tanY = [\n        Math.cos(theta) * rY + cY[0] - px, (tY - tt) * TREE.height, Math.sin(theta) * rY + cY[1] - pz,\n      ];\n      let nx = tanT[1] * tanY[2] - tanT[2] * tanY[1];\n      let ny = tanT[2] * tanY[0] - tanT[0] * tanY[2];\n      let nz = tanT[0] * tanY[1] - tanT[1] * tanY[0];\n      const len = Math.hypot(nx, ny, nz) || 1;\n      nx \/= len; ny \/= len; nz \/= len;\n      \/\/ nach au\u00dfen orientieren\n      if (nx * lx + nz * lz < 0) { nx = -nx; ny = -ny; nz = -nz; }\n\n      row.push({\n        p: [px, yy, pz],\n        n: [nx, ny, nz],\n        s: [theta \/ (Math.PI * 2), tt],\n      });\n    }\n    trunkGrid.push(row);\n  }\n  triangulateGrid(trunkGrid, out, 0);\n\n  \/\/ ---- Boden -------------------------------------------------------------\n  \/\/ Innerer Rand folgt exakt der Stammkontur bei t=0, damit kein Spalt entsteht.\n  const groundGrid = [];\n  for (let j = 0; j <= groundRings; j++) {\n    const f = Math.pow(j \/ groundRings, 1.7); \/\/ innen dichter\n    const row = [];\n    for (let i = 0; i < N; i++) {\n      const theta = (i \/ N) * Math.PI * 2;\n      const inner = trunkRadius(theta, 0.0) * 0.985;\n      const d = inner + f * (TREE.groundRadius - inner);\n      const jd = (hash31(i * 4.3, j * 3.3, 9.1) - 0.5) * (TREE.groundRadius \/ groundRings) * 0.7;\n      \/\/ Innerer und \u00e4u\u00dferer Rand ohne Jitter: innen sitzt er am Stamm,\n      \/\/ au\u00dfen bliebe sonst eine ausgefranste Silhouette stehen.\n      const dd = (j === 0 || j === groundRings) ? d : d + jd;\n      const y = j === 0 ? groundHeight(theta, dd) * 0.35 : groundHeight(theta, dd);\n\n      const px = Math.cos(theta) * dd;\n      const pz = Math.sin(theta) * dd;\n\n      const h = 0.02;\n      const hx = groundHeight(theta, dd + h) - y;\n      const ht = groundHeight(theta + h \/ Math.max(dd, 0.1), dd) - y;\n      let nx = -hx * Math.cos(theta) - ht * -Math.sin(theta);\n      let nz = -hx * Math.sin(theta) - ht * Math.cos(theta);\n      const nlen = Math.hypot(nx, h, nz) || 1;\n\n      row.push({\n        p: [px, y, pz],\n        n: [nx \/ nlen, h \/ nlen, nz \/ nlen],\n        s: [theta \/ (Math.PI * 2), f],\n      });\n    }\n    groundGrid.push(row);\n  }\n  \/\/ Horizontale Fl\u00e4che: Umlaufsinn ist gegenl\u00e4ufig zum Stamm, sonst wird\n  \/\/ die Scheibe von oben weggecullt.\n  triangulateGrid(groundGrid, out, 1, true);\n\n  \/\/ ---- BufferGeometry ----------------------------------------------------\n  const g = new THREE.BufferGeometry();\n  g.setAttribute('position', new THREE.Float32BufferAttribute(out.position, 3));\n  g.setAttribute('aNormalS', new THREE.Float32BufferAttribute(out.normal, 3));\n  g.setAttribute('aSurf', new THREE.Float32BufferAttribute(out.surf, 2));\n  g.setAttribute('aBary', new THREE.Float32BufferAttribute(out.bary, 3));\n  g.setAttribute('aKind', new THREE.Float32BufferAttribute(out.kind, 1));\n  g.computeBoundingSphere();\n  return g;\n}\n\n\/\/ ===== materials.js\n\n\n\/**\n * Zwei Materialien auf DERSELBEN Geometrie:\n *\n *  1. Solid  \u2013 Rinde\/Boden, opak. Verschwindet dort, wo der Scan schon war\n *              (per Noise-Dissolve, damit die Kante zerf\u00e4llt statt zu schneiden).\n *              Weil es dort auch kein Depth mehr schreibt, scheinen die\n *              Netzlinien der R\u00fcckseite durch \u2013 genau wie in einem echten Scan.\n *\n *  2. Wire   \u2013 das Dreiecksnetz, additiv geblendet, erscheint dort, wo der\n *              Scan bereits war.\n *\/\n\nconst SHARED_UNIFORMS = () => ({\n  uProgress:      { value: 0.0 },\n  uScanStart:     { value: 0.0 },\n  uFeather:       { value: 0.075 },\n  uAxis:          { value: new THREE.Vector2(0, 0) },\n  uTime:          { value: 0.0 },\n  uResolution:    { value: new THREE.Vector2(1, 1) },\n  \/\/ Wandert mit der Kamera \u2013 bei einer Umrundung w\u00e4re ein festes Licht\n  \/\/ die halbe Animation lang auf der abgewandten Seite.\n  uKeyDir:        { value: new THREE.Vector3(0.55, 0.72, 0.42) },\n});\n\nconst LIGHTS = \/* glsl *\/ `\nuniform vec3 uKeyDir;\nconst vec3 FILL_DIR = normalize(vec3(-0.62, 0.18, -0.55));\n\/\/ Alle Farbliterale im LINEAREN Raum \u2013 der Renderer konvertiert nach sRGB.\nconst vec3 KEY_COL  = vec3(1.00, 0.90, 0.72);\nconst vec3 FILL_COL = vec3(0.021, 0.148, 0.235);\nconst vec3 AMB_COL  = vec3(0.014, 0.026, 0.040);\n`;\n\n\/** Vollfl\u00e4chiger Hintergrundverlauf, gerendert vor allem anderen. *\/\nfunction createBackdrop(uniforms) {\n  const mat = new THREE.ShaderMaterial({\n    uniforms: { uResolution: uniforms.uResolution },\n    vertexShader: \/* glsl *\/ `\n      void main() { gl_Position = vec4(position.xy, 1.0, 1.0); }\n    `,\n    fragmentShader: \/* glsl *\/ `\n      precision highp float;\n      ${BACKDROP}\n      void main() {\n        gl_FragColor = vec4(backdropColor(gl_FragCoord.xy), 1.0);\n        #include <colorspace_fragment>\n      }\n    `,\n    depthTest: false,\n    depthWrite: false,\n  });\n  const mesh = new THREE.Mesh(new THREE.PlaneGeometry(2, 2), mat);\n  mesh.frustumCulled = false;\n  mesh.renderOrder = -1;\n  return mesh;\n}\n\nfunction createSolidMaterial(uniforms) {\n  return new THREE.ShaderMaterial({\n    uniforms: {\n      ...uniforms,\n      \/\/ eigenes Uniform je Material, nicht geteilt: nur das Drahtnetz wird versetzt\n      uSurfaceOffset: { value: 0.0 },\n      uBarkTint:  { value: new THREE.Color('#584b3e') },\n      uGroundTint:{ value: new THREE.Color('#3b362c') },\n      uEdgeColor: { value: new THREE.Color('#8ef4ff') },\n    },\n    vertexShader: VERTEX,\n    fragmentShader: \/* glsl *\/ `\n      precision highp float;\n      ${NOISE}\n      ${REVEAL}\n      ${LIGHTS}\n      ${BACKDROP}\n\n      uniform vec3  uBarkTint;\n      uniform vec3  uGroundTint;\n      uniform vec3  uEdgeColor;\n      uniform float uTime;\n\n      varying vec3  vWorldPos;\n      varying vec3  vNormalW;\n      varying vec3  vBary;\n      varying vec2  vSurf;\n      varying float vKind;\n\n      \/\/ H\u00f6henfeld der Rinde: L\u00e4ngsfurchen, die von horizontalen Rissen in\n      \/\/ Platten zerteilt werden \u2013 nicht blo\u00df gestreckter Noise.\n      float barkHeight(vec3 p) {\n        vec3 q = vec3(p.x, p.y * 0.30, p.z) * 6.5;\n\n        float furrow = fbm(q, 4);\n        furrow = 1.0 - abs(furrow * 2.0 - 1.0);   \/\/ Grate zwischen den Furchen\n        furrow = pow(furrow, 1.7);\n\n        \/\/ Querrisse: unterbrechen die L\u00e4ngsstruktur\n        float cracks = fbm(vec3(q.x * 0.7, q.y * 5.0, q.z * 0.7) + 41.0, 3);\n        float plates = smoothstep(0.30, 0.72, cracks);\n\n        float fine = fbm(q * 5.5 + 7.0, 3);\n        return clamp(furrow * (0.50 + 0.50 * plates) * 0.78 + fine * 0.22, 0.0, 1.0);\n      }\n\n      float gWoundD = 9.0; \/\/ normierter Abstand zur Wundmitte (f\u00fcr die Schattenfuge)\n      \/\/ Rindenwunde \u2013 gleiche Zahlen wie WOUND\/woundMask in treeGeometry.js\n      float woundInside(vec2 surf) {\n        float u = (surf.y - (-0.02)) \/ (0.50 + 0.02);\n        if (u <= 0.0 || u >= 1.0) return 0.0;\n        float w = 0.34 * pow(sin(3.14159265 * pow(u, 0.8)), 0.7);\n        float center = 0.62 + 0.05 * sin(u * 5.0);\n        float dT = surf.x * 6.28318531 - center;\n        dT = atan(sin(dT), cos(dT));\n        float d = abs(dT) \/ max(w, 1e-4);\n        gWoundD = d;\n        return 1.0 - smoothstep(0.80, 0.98, d);\n      }\n\n      \/\/ Verwittertes Holz: feine L\u00e4ngsmaserung, einzelne dunkle Trockenrisse\n      float woodHeight(vec3 p) {\n        vec3 q = vec3(p.x * 16.0, p.y * 0.55, p.z * 16.0);\n        float grain = fbm(q, 3);\n        float crack = smoothstep(0.012, 0.0, abs(fbm(vec3(p.x * 7.0, p.y * 0.35, p.z * 7.0) + 13.0, 3) - 0.5));\n        float ridge = 1.0 - abs(grain * 2.0 - 1.0);\n        return clamp(pow(ridge, 1.4) * 0.85 + 0.12 - crack * 0.8, 0.0, 1.0);\n      }\n\n      float groundHeightField(vec3 p) {\n        return fbm(p * 6.0 + 21.0, 4) * 0.7 + fbm(p * 22.0, 3) * 0.3;\n      }\n\n      void main() {\n        float rev = reveal(vWorldPos);\n\n        \/\/ Dissolve: die Rinde zerf\u00e4llt entlang der Scan-Front, statt hart\n        \/\/ abgeschnitten zu werden.\n        float dis = fbm(vWorldPos * 16.0, 3);\n        if (rev > 0.30 + 0.34 * dis) discard;\n\n        bool isGround = vKind > 0.5;\n\n        \/\/ --- Oberfl\u00e4chenstruktur + Bump ---\n        float h = isGround ? groundHeightField(vWorldPos) : barkHeight(vWorldPos);\n        vec3 N = normalize(vNormalW);\n        vec3 T = normalize(cross(vec3(0.0, 1.0, 0.0), N) + vec3(1e-5));\n        vec3 B = cross(N, T);\n        float e = 0.012;\n        float hT = isGround ? groundHeightField(vWorldPos + T * e) : barkHeight(vWorldPos + T * e);\n        float hB = isGround ? groundHeightField(vWorldPos + B * e) : barkHeight(vWorldPos + B * e);\n        float wound = isGround ? 0.0 : woundInside(vSurf);\n        if (wound > 0.001) {\n          float w0 = woodHeight(vWorldPos);\n          float wT = woodHeight(vWorldPos + T * e);\n          float wB = woodHeight(vWorldPos + B * e);\n          h = mix(h, w0, wound); hT = mix(hT, wT, wound); hB = mix(hB, wB, wound);\n        }\n        float bumpStrength = isGround ? 1.6 : 3.4;\n        bumpStrength *= mix(1.0, 0.8, wound);\n        N = normalize(N - (T * (hT - h) + B * (hB - h)) * bumpStrength \/ e * 0.02);\n\n        \/\/ --- Farbe ---\n        vec3 albedo;\n        if (isGround) {\n          vec3 soil = mix(uGroundTint * 0.55, uGroundTint * 1.25, h);\n          float litter = smoothstep(0.55, 0.85, fbm(vWorldPos * 9.0 + 5.0, 3));\n          albedo = mix(soil, vec3(0.073, 0.047, 0.019), litter * 0.5);\n        } else {\n          vec3 deep  = uBarkTint * 0.32;   \/\/ Furchengrund\n          vec3 crest = uBarkTint * 1.00;   \/\/ Rindenr\u00fccken\n          albedo = mix(deep, crest, smoothstep(0.15, 0.85, h));\n          \/\/ Moos\/Feuchte im unteren Bereich\n          float moss = smoothstep(0.14, 0.0, vSurf.y) * smoothstep(0.45, 0.8, fbm(vWorldPos * 4.0 + 30.0, 3));\n          albedo = mix(albedo, vec3(0.016, 0.033, 0.014), moss * 0.6);\n          \/\/ Freiliegendes, vergrautes Holz in der Wunde\n          vec3 wood = mix(vec3(0.075, 0.066, 0.054), vec3(0.230, 0.210, 0.178), smoothstep(0.10, 0.90, h));\n          albedo = mix(albedo, wood, wound);\n        }\n\n        \/\/ --- Beleuchtung ---\n        float key  = max(dot(N, normalize(uKeyDir)), 0.0);\n        float fill = max(dot(N, FILL_DIR), 0.0);\n        float ao   = isGround ? 1.0 : mix(mix(0.40, 0.75, wound), 1.0, smoothstep(0.05, 0.5, h));\n        \/\/ Schattenfuge: Holz am Wundrand liegt im Schatten des Wulstes\n        ao *= 1.0 - 0.65 * wound * smoothstep(0.55, 0.95, gWoundD);\n        \/\/ Kontaktschatten am Stammfu\u00df\n        ao *= mix(0.30, 1.0, smoothstep(0.0, 0.45, vWorldPos.y));\n\n        vec3 col = albedo * (AMB_COL + KEY_COL * key * 2.1 + FILL_COL * fill * 0.9) * ao;\n\n        \/\/ Dezentes Rim-Light gegen den dunklen Hintergrund\n        vec3 V = normalize(cameraPosition - vWorldPos);\n        float rim = pow(1.0 - max(dot(N, V), 0.0), 4.0);\n        col += vec3(0.010, 0.064, 0.107) * rim * 0.55;\n\n        \/\/ Exakt gegen die Hintergrundfarbe an diesem Bildpunkt blenden \u2013\n        \/\/ nur so bleibt keine sichtbare Silhouettenkante stehen.\n        vec3 bg = backdropColor(gl_FragCoord.xy);\n        float depth = length(cameraPosition - vWorldPos);\n        col = mix(col, bg, smoothstep(6.0, 15.0, depth));\n\n        \/\/ Die Bodenscheibe l\u00f6st sich zum Rand hin im Hintergrund auf, statt\n        \/\/ als Platte im Nichts zu schweben. Perspektivisch nimmt der \u00e4u\u00dfere\n        \/\/ Ring nur wenige Pixel ein \u2013 der Fade muss fr\u00fch in der Fl\u00e4che fertig\n        \/\/ sein, nicht erst am Rand.\n        if (isGround) col = mix(col, bg, smoothstep(0.06, 0.45, vSurf.y));\n\n        \/\/ --- Scan-Front: gl\u00fcht kurz auf, bevor sie zerf\u00e4llt ---\n        \/\/ Nur das letzte St\u00fcck vor dem Zerfall gl\u00fcht, nicht die ganze\n        \/\/ \u00dcbergangszone \u2013 sonst frisst der Streifen das Bild auf.\n        float front = smoothstep(0.10, 0.34, rev);\n        col = mix(col, uEdgeColor * 0.55, front * 0.5);\n\n        gl_FragColor = vec4(col, 1.0);\n        #include <colorspace_fragment>\n      }\n    `,\n    side: THREE.FrontSide,\n  });\n}\n\nfunction createWireMaterial(uniforms) {\n  return new THREE.ShaderMaterial({\n    uniforms: {\n      ...uniforms,\n      uSurfaceOffset: { value: 0.0 },\n      uWireColor:  { value: new THREE.Color('#2ee6f6') },\n      uFrontColor: { value: new THREE.Color('#bff6ff') },\n      uLineWidth:  { value: 1.15 },\n      uBackFade:   { value: 0.34 },\n    },\n    vertexShader: VERTEX,\n    fragmentShader: \/* glsl *\/ `\n      precision highp float;\n      ${NOISE}\n      ${REVEAL}\n\n      uniform vec3  uWireColor;\n      uniform vec3  uFrontColor;\n      uniform float uLineWidth;\n      uniform float uBackFade;\n      uniform float uTime;\n\n      varying vec3  vWorldPos;\n      varying vec3  vNormalW;\n      varying vec3  vBary;\n      varying vec2  vSurf;\n      varying float vKind;\n\n      void main() {\n        float rev = reveal(vWorldPos);\n        if (rev < 0.015) discard;\n\n        \/\/ Single-Pass-Wireframe \u00fcber barycentrische Koordinaten:\n        \/\/ konstante Linienbreite in Pixeln, unabh\u00e4ngig von der Entfernung.\n        vec3 d  = fwidth(vBary);\n        vec3 a3 = smoothstep(vec3(0.0), d * uLineWidth, vBary);\n        float edge = 1.0 - min(min(a3.x, a3.y), a3.z);\n        if (edge < 0.004) discard;\n\n        \/\/ R\u00fcckseitige Linien schw\u00e4cher -> Tiefenwirkung im Drahtmodell\n        float facing = gl_FrontFacing ? 1.0 : uBackFade;\n\n        \/\/ Entfernungsabh\u00e4ngig ausd\u00fcnnen, sonst matscht das Netz hinten zu\n        float dist = length(cameraPosition - vWorldPos);\n        float distFade = 1.0 - smoothstep(4.0, 11.0, dist) * 0.55;\n\n        float appear = smoothstep(0.015, 0.40, rev);\n\n        \/\/ Frische Linien direkt hinter der Scan-Front leuchten heller\n        float hot = smoothstep(0.45, 0.08, rev);\n        vec3 col = mix(uWireColor, uFrontColor, hot * 0.8);\n        float intensity = edge * appear * facing * distFade * (0.85 + hot * 0.7);\n\n        \/\/ Boden zur\u00fccknehmen und nach au\u00dfen ausblenden \u2013 wie beim Solid, sonst\n        \/\/ laufen die Bodenlinien bis an den Bildrand.\n        if (vKind > 0.5) intensity *= 0.62 * (1.0 - smoothstep(0.06, 0.42, vSurf.y));\n\n        gl_FragColor = vec4(col * intensity, intensity);\n        #include <colorspace_fragment>\n      }\n    `,\n    transparent: true,\n    blending: THREE.AdditiveBlending,\n    depthWrite: false,\n    depthTest: true,\n    side: THREE.DoubleSide,\n  });\n}\n\n\/\/ ===== tags.js\n\n\n\/**\n * Nummernschilder f\u00fcr LoGeoS.\n *\n * Wie am echten Baum: ein Ring nummerierter Schilder auf einer Messh\u00f6he,\n * jeweils an einem Nagel. Die Schilder erscheinen zu Beginn nacheinander\n * (\u201eSchilder setzen\u201c) und leuchten gr\u00fcn auf, sobald die Scan-Front sie\n * erreicht \u2013 so wie die App erkannte Schilder gr\u00fcn markiert.\n *\n * Alles h\u00e4ngt am Scroll-Fortschritt, nicht an der Zeit. R\u00fcckw\u00e4rts scrollen\n * spielt die Sequenz deshalb sauber r\u00fcckw\u00e4rts ab.\n *\/\n\nconst TAGS = {\n  count: 16,\n  height: 0.95,      \/\/ Messh\u00f6he in Welt-Einheiten (Stamm ist 5.4 hoch)\n  width: 0.15,       \/\/ gegen\u00fcber der Realit\u00e4t vergr\u00f6\u00dfert, sonst nur Pixel\n  offset: 0.022,     \/\/ Abstand zur Rinde \u2013 liegt \u00fcber dem Drahtnetz\n  green: 0x34c759,   \/\/ iOS-Systemgr\u00fcn, wie in der App\n};\n\n\/\/ ------------------------------------------------------------ Texturen\n\nconst TEX_W = 256;\nconst TEX_H = 320;\n\n\/** Kontur des Schilds: Rechteck mit Giebel oben (wie die echten Anh\u00e4nger). *\/\nfunction tagPath(ctx, inset = 0) {\n  const l = 14 + inset, r = TEX_W - 14 - inset;\n  const top = 10 + inset * 1.4, shoulder = 92 + inset * 0.4, bottom = TEX_H - 10 - inset;\n  const rad = 16;\n  ctx.beginPath();\n  ctx.moveTo(TEX_W \/ 2, top);\n  ctx.lineTo(r, shoulder);\n  ctx.lineTo(r, bottom - rad);\n  ctx.quadraticCurveTo(r, bottom, r - rad, bottom);\n  ctx.lineTo(l + rad, bottom);\n  ctx.quadraticCurveTo(l, bottom, l, bottom - rad);\n  ctx.lineTo(l, shoulder);\n  ctx.closePath();\n}\n\nfunction drawTagTexture(number) {\n  const c = document.createElement('canvas');\n  c.width = TEX_W; c.height = TEX_H;\n  const ctx = c.getContext('2d');\n\n  \/\/ Wei\u00dfer Tr\u00e4ger\n  tagPath(ctx);\n  ctx.fillStyle = '#eceae4';\n  ctx.fill();\n\n  \/\/ Orangefarbenes Feld mit dunkler Holzmaserung\n  const fx = 34, fy = 104, fw = TEX_W - 68, fh = TEX_H - 128;\n  ctx.save();\n  ctx.beginPath();\n  ctx.rect(fx, fy, fw, fh);\n  ctx.clip();\n  ctx.fillStyle = '#e8902c';\n  ctx.fillRect(fx, fy, fw, fh);\n  ctx.strokeStyle = '#2a1a10';\n  ctx.lineCap = 'round';\n  \/\/ Maserung pro Nummer leicht verschieden, sonst sehen alle gleich aus\n  const seed = number * 1.37;\n  for (let k = 0; k < 6; k++) {\n    const x0 = fx + 10 + k * (fw \/ 5.4) + Math.sin(seed + k) * 6;\n    ctx.lineWidth = 4 + (k % 3) * 2.5;\n    ctx.beginPath();\n    for (let y = fy - 4; y <= fy + fh + 4; y += 6) {\n      const x = x0 + Math.sin(y * 0.045 + seed + k * 0.8) * 9\n        + Math.sin(y * 0.013 + k) * 7;\n      if (y === fy - 4) ctx.moveTo(x, y); else ctx.lineTo(x, y);\n    }\n    ctx.stroke();\n  }\n  ctx.restore();\n\n  \/\/ Helles Zahlenfeld in der Mitte\n  const cx = TEX_W \/ 2, cy = fy + fh \/ 2;\n  ctx.fillStyle = 'rgba(250,236,205,0.92)';\n  ctx.beginPath();\n  ctx.arc(cx, cy, 52, 0, Math.PI * 2);\n  ctx.fill();\n  ctx.fillStyle = '#16100b';\n  ctx.font = `600 ${number > 9 ? 64 : 76}px Inter, \"Helvetica Neue\", Arial, sans-serif`;\n  ctx.textAlign = 'center';\n  ctx.textBaseline = 'middle';\n  ctx.fillText(String(number), cx, cy + 3);\n\n  \/\/ Loch und Nagelkopf\n  ctx.fillStyle = '#7d8388';\n  ctx.beginPath();\n  ctx.arc(cx, 66, 13, 0, Math.PI * 2);\n  ctx.fill();\n  ctx.fillStyle = '#c9ced2';\n  ctx.beginPath();\n  ctx.arc(cx - 3, 63, 6, 0, Math.PI * 2);\n  ctx.fill();\n\n  const tex = new THREE.CanvasTexture(c);\n  tex.colorSpace = THREE.SRGBColorSpace;\n  tex.anisotropy = 4;\n  return tex;\n}\n\n\/** Gr\u00fcner Leuchtrahmen \u2013 dieselbe Kontur, weichgezeichnet. *\/\nfunction drawGlowTexture() {\n  const pad = 48;\n  const c = document.createElement('canvas');\n  c.width = TEX_W + pad * 2; c.height = TEX_H + pad * 2;\n  const ctx = c.getContext('2d');\n  ctx.translate(pad, pad);\n  ctx.strokeStyle = '#ffffff';\n  ctx.shadowColor = '#ffffff';\n  ctx.lineJoin = 'round';\n  \/\/ Zwei Durchg\u00e4nge: weicher Hof + klare Kante\n  ctx.shadowBlur = 34; ctx.lineWidth = 14;\n  tagPath(ctx, -10); ctx.stroke();\n  ctx.shadowBlur = 8; ctx.lineWidth = 7;\n  tagPath(ctx, -10); ctx.stroke();\n  const tex = new THREE.CanvasTexture(c);\n  tex.colorSpace = THREE.SRGBColorSpace;\n  return { tex, scale: (TEX_W + pad * 2) \/ TEX_W };\n}\n\n\/\/ ------------------------------------------------------------ Aufbau\n\nconst clamp01 = (x) => Math.min(Math.max(x, 0), 1);\nconst smooth = (a, b, x) => { const t = clamp01((x - a) \/ (b - a)); return t * t * (3 - 2 * t); };\n\n\/** Oberfl\u00e4chenpunkt und Normale des Stamms bei Winkel theta, H\u00f6he y. *\/\nfunction surfaceFrame(theta, y) {\n  const t = y \/ TREE.height;\n  const r = trunkRadius(theta, t);\n  const c = trunkCenter(t);\n  const p = new THREE.Vector3(Math.cos(theta) * r + c[0], y, Math.sin(theta) * r + c[1]);\n  const h = 0.004;\n  const rT = trunkRadius(theta + h, t);\n  const rY = trunkRadius(theta, t + h);\n  const tanT = new THREE.Vector3(Math.cos(theta + h) * rT + c[0], y, Math.sin(theta + h) * rT + c[1]).sub(p);\n  const cY = trunkCenter(t + h);\n  const tanY = new THREE.Vector3(Math.cos(theta) * rY + cY[0], y + h * TREE.height, Math.sin(theta) * rY + cY[1]).sub(p);\n  const n = new THREE.Vector3().crossVectors(tanT, tanY).normalize();\n  if (n.x * (p.x - c[0]) + n.z * (p.z - c[1]) < 0) n.negate();\n  return { p, n };\n}\n\nfunction createTags(scene, scanStart = 0) {\n  const group = new THREE.Group();\n  const plane = new THREE.PlaneGeometry(TAGS.width, TAGS.width * TEX_H \/ TEX_W);\n  const glow = drawGlowTexture();\n  const nailGeo = new THREE.CylinderGeometry(0.0035, 0.0035, 1, 6);\n  nailGeo.rotateX(Math.PI \/ 2); \/\/ entlang +Z (Blickrichtung des Schilds)\n  nailGeo.translate(0, 0, -0.5);\n\n  const tags = [];\n  for (let i = 0; i < TAGS.count; i++) {\n    \/\/ Gleichm\u00e4\u00dfig in Scan-Reihenfolge verteilt: Schild 1 wird zuerst erfasst,\n    \/\/ dann das rechts daneben usw. (Umkehrung von scanCoord im Shader)\n    const theta = (scanStart - (i + 0.5) \/ TAGS.count) * Math.PI * 2 - Math.PI;\n    \/\/ Schilder sitzen nie exakt auf einer Linie\n    const y = TAGS.height + Math.sin(i * 2.31) * 0.025;\n    const { p, n: nSurf } = surfaceFrame(theta, y);\n    \/\/ Schilder h\u00e4ngen wie in echt eher radial \u2013 auf dem steilen Wulst st\u00fcnden sie\n    \/\/ sonst hochkant zur Kamera und w\u00e4ren kaum zu sehen.\n    const radial = new THREE.Vector3(Math.cos(theta), 0, Math.sin(theta));\n    const n = nSurf.clone().lerp(radial, 0.6).normalize();\n\n    const holder = new THREE.Group();\n    \/\/ Am Wundwulst w\u00f6lbt sich die Rinde unter dem flachen Schild auf \u2013 so weit\n    \/\/ nach au\u00dfen schieben, dass keine Ecke in der Rinde verschwindet.\n    const halfAngle = (TAGS.width * 0.5) \/ Math.max(Math.hypot(p.x, p.z), 0.1);\n    let bulge = 0;\n    for (let k = -4; k <= 4; k++) {\n      const q = surfaceFrame(theta + (k \/ 4) * halfAngle, y).p;\n      bulge = Math.max(bulge, q.clone().sub(p).dot(n));\n    }\n    holder.position.copy(p).addScaledVector(n, TAGS.offset + bulge);\n    \/\/ Flach an der Rinde, Oberkante bleibt oben\n    holder.lookAt(holder.position.clone().add(n));\n    holder.rotateZ(Math.sin(i * 1.93) * 0.07);\n\n    const mat = new THREE.MeshBasicMaterial({\n      map: drawTagTexture(i + 1),\n      transparent: true,\n      alphaTest: 0.5,\n      side: THREE.DoubleSide,\n    });\n    const tagMesh = new THREE.Mesh(plane, mat);\n    tagMesh.renderOrder = 3;\n\n    const glowMat = new THREE.MeshBasicMaterial({\n      map: glow.tex,\n      color: TAGS.green,\n      transparent: true,\n      opacity: 0,\n      blending: THREE.AdditiveBlending,\n      depthWrite: false,\n    });\n    const glowMesh = new THREE.Mesh(plane, glowMat);\n    glowMesh.scale.setScalar(glow.scale);\n    glowMesh.position.z = 0.003;\n    glowMesh.renderOrder = 4;\n\n    \/\/ Nagel: vom Schildloch bis in die Rinde\n    const nail = new THREE.Mesh(nailGeo, new THREE.MeshBasicMaterial({ color: 0x9aa3aa }));\n    nail.scale.set(1, 1, TAGS.offset + bulge + 0.01);\n    nail.position.y = TAGS.width * (TEX_H \/ TEX_W) * (0.5 - 66 \/ TEX_H);\n\n    holder.add(tagMesh, glowMesh, nail);\n    group.add(holder);\n\n    \/\/ Winkel wie im Shader (scanCoord): atan2(z, x) \u2192 0..1\n    const a = (Math.atan2(p.z, p.x) + Math.PI) \/ (Math.PI * 2);\n    tags.push({ holder, tagMesh, mat, glowMat, nail, n, a, index: i });\n  }\n\n  scene.add(group);\n\n  const lightDir = new THREE.Vector3();\n\n  \/**\n   * @param scroll        gegl\u00e4tteter Scroll-Anteil 0..1\n   * @param scanProgress  Fortschritt der Scan-Front (wie uProgress)\n   * @param scanStart     Startwinkel (wie uScanStart)\n   * @param keyDir        Lichtrichtung (uKeyDir), damit die Schilder zur Rinde passen\n   *\/\n  function update(scroll, scanProgress, scanStart, keyDir) {\n    lightDir.copy(keyDir).normalize();\n    for (const t of tags) {\n      \/\/ 1) Schilder setzen: nacheinander einblenden, bevor der Scan startet\n      const appearAt = 0.015 + (t.index \/ TAGS.count) * 0.07;\n      const appear = smooth(appearAt, appearAt + 0.02, scroll);\n      t.holder.visible = appear > 0.001;\n      t.holder.scale.setScalar(0.6 + 0.4 * appear);\n      t.mat.opacity = appear;\n\n      \/\/ Einfaches Licht, damit die Schilder auf der Schattenseite nicht leuchten\n      const lambert = Math.max(0, t.n.dot(lightDir));\n      const shade = 0.30 + 0.80 * lambert;\n\n      \/\/ 2) Erkennung: die Scan-Front hat das Schild passiert\n      const rel = ((scanStart - t.a) % 1 + 1) % 1;\n      const since = scanProgress - rel;\n      const hit = smooth(0.0, 0.012, since);\n      \/\/ kurzer Aufblitz, danach bleibt ein ruhiger gr\u00fcner Rahmen\n      const flash = hit * Math.exp(-Math.max(0, since) * 38);\n\n      t.glowMat.opacity = appear * (hit * 1.0 + flash * 1.2);\n      t.mat.color.setScalar(shade).lerp(\n        new THREE.Color(TAGS.green).multiplyScalar(shade + 0.4), hit * 0.18 + flash * 0.5,\n      );\n      t.holder.scale.multiplyScalar(1 + flash * 0.12);\n    }\n  }\n\n  return { group, update };\n}\n\n\/\/ ===== main.js\n\n\/\/ iPhone- und LiDAR-Module bleiben im Ordner (phone.js, lidar.js), werden hier\n\/\/ aber bewusst nicht eingebunden \u2013 der Hero zeigt nur den Baum und den Scan.\n\n\/\/ ---------------------------------------------------------------- Grundsetup\n\nconst canvas = document.getElementById('hero-canvas');\nconst scrollEl = document.getElementById('hero-scroll') || document.getElementById('logeos-hero');\n\nconst renderer = new THREE.WebGLRenderer({\n  canvas,\n  antialias: true,\n  alpha: true,\n  powerPreference: 'high-performance',\n});\nrenderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\nrenderer.setClearColor(0x000000, 0);\n\nconst scene = new THREE.Scene();\nconst camera = new THREE.PerspectiveCamera(38, 1, 0.1, 100);\n\n\/\/ Auf kleinen Ger\u00e4ten grober aufl\u00f6sen \u2013 das Netz bleibt trotzdem lesbar.\nif (window.innerWidth < 720) {\n  TREE.radialSegments = 128;\n  TREE.heightSegments = 76;\n  TREE.groundRings = 20;\n}\n\nconst uniforms = SHARED_UNIFORMS();\nconst solidMat = createSolidMaterial(uniforms);\nconst wireMat = createWireMaterial(uniforms);\n\n\/\/ Feines Netz f\u00fcr die Rinde, grobes f\u00fcr das Drahtmodell \u2013 sonst matschen die\n\/\/ Dreiecke im Scan-Look zu einer Fl\u00e4che zusammen.\nconst solidMesh = new THREE.Mesh(buildTreeGeometry(1.0), solidMat);\nconst wireMesh = new THREE.Mesh(buildTreeGeometry(0.42), wireMat);\n\/\/ Das grobe Netz liegt geometrisch minimal innerhalb des feinen \u2013 anheben,\n\/\/ damit es an der Scan-Front nicht angeschnitten wird.\nwireMat.uniforms.uSurfaceOffset.value = 0.012;\nwireMesh.renderOrder = 2;\n\nscene.add(createBackdrop(uniforms), solidMesh, wireMesh);\n\n\/\/ ------------------------------------------------------------- Kamerafahrt\n\n\/\/ Blickziel liegt tief am Stammfu\u00df \u2013 dort sitzt die relevante Geometrie.\nconst LOOK_AT = new THREE.Vector3(0, 1.15, 0);\n\nconst params = {\n  scanStart: 0.62,   \/\/ Startwinkel des Scans (0..1 des Umlaufs)\n  camLead: 0.018,    \/\/ Kamera-Versatz zur Scan-Front\n  turns: 1.0,        \/\/ volle Umrundungen \u00fcber den Scroll\n  scanFrom: 0.10,    \/\/ ab welchem Scroll-Anteil der Scan beginnt\n  scanTo: 0.88,      \/\/ bis wann er l\u00e4uft\n  overscan: 1.07,    \/\/ etwas \u00fcber 1, damit der Kreis sauber schlie\u00dft\n};\n\n\/\/ Nummernschilder am Stamm \u2013 leuchten gr\u00fcn auf, sobald der Scan sie erfasst\nconst tags = createTags(scene, params.scanStart);\n\nconst smoothstep = (a, b, x) => {\n  const t = Math.min(Math.max((x - a) \/ (b - a), 0), 1);\n  return t * t * (3 - 2 * t);\n};\nconst remap = (x, a, b) => Math.min(Math.max((x - a) \/ (b - a), 0), 1);\nconst lerp = (a, b, t) => a + (b - a) * t;\n\nfunction updateCamera(scanProgress, scroll, time) {\n  const angle = (params.scanStart - scanProgress - params.camLead) * Math.PI * 2 - Math.PI;\n\n  \/\/ Vor dem Scan weiter weg und h\u00f6her, w\u00e4hrend des Scans n\u00e4her heran,\n  \/\/ danach wieder etwas zur\u00fcck, damit das fertige Modell ganz zu sehen ist.\n  const approach = smoothstep(0, params.scanFrom + 0.05, scroll);\n  const settle = smoothstep(params.scanTo, 1.0, scroll);\n  \/\/ Im Hochformat muss die Kamera weiter weg, sonst passt die Bodenscheibe nicht.\n  const aspectComp = Math.max(1, Math.pow(1.35 \/ camera.aspect, 0.8));\n  const radius = lerp(lerp(7.0, 5.2, approach), 6.4, settle) * aspectComp;\n  const height = lerp(lerp(2.6, 1.70, approach), 2.35, settle);\n\n  \/\/ Ganz leichtes Atmen, damit das Bild bei Scroll-Stillstand nicht einfriert\n  const breathe = Math.sin(time * 0.35) * 0.012;\n\n  camera.position.set(\n    Math.cos(angle + breathe) * radius,\n    height + Math.sin(time * 0.27) * 0.03,\n    Math.sin(angle + breathe) * radius,\n  );\n  camera.lookAt(LOOK_AT);\n\n  \/\/ Das Licht wandert mit: seitlich versetzt zur Kamera, damit die zugewandte\n  \/\/ Seite modelliert wirkt statt flach ausgeleuchtet.\n  const lightAngle = angle - 0.62;\n  uniforms.uKeyDir.value.set(\n    Math.cos(lightAngle) * 0.72,\n    0.62,\n    Math.sin(lightAngle) * 0.72,\n  ).normalize();\n}\n\n\/\/ ------------------------------------------------------------- Scroll-Rig\n\nlet targetScroll = 0;\nlet currentScroll = 0;\nlet scrollOverride = null; \/\/ vom Debug-Panel gesetzt\n\n\/\/ Autoplay, wenn kein Scrollweg da ist (eingebettet, feste H\u00f6he, Vorschau)\n\/\/ oder per ?autoplay=1 erzwungen. Sonst st\u00fcnde die Animation dort still.\nconst forceAutoplay = new URLSearchParams(location.search).has('autoplay');\nlet autoplayT = 0;\n\nfunction scrollRange() {\n  return scrollEl.offsetHeight - window.innerHeight;\n}\n\n\/**\n * Wird jeden Frame gelesen statt \u00fcber ein scroll-Event. Ein Event kann\n * ausbleiben, wenn die Seite in einem fremden Container liegt \u2013 der\n * direkte Messwert stimmt immer.\n *\/\nfunction readScroll() {\n  const total = scrollRange();\n  const scrolled = -scrollEl.getBoundingClientRect().top;\n  return total > 0 ? Math.min(Math.max(scrolled \/ total, 0), 1) : 0;\n}\n\n\/\/ ------------------------------------------------------------- Resize\n\nfunction resize() {\n  const w = canvas.clientWidth;\n  const h = canvas.clientHeight;\n  if (canvas.width !== w * renderer.getPixelRatio() || canvas.height !== h * renderer.getPixelRatio()) {\n    renderer.setSize(w, h, false);\n  }\n  camera.aspect = w \/ h;\n  camera.updateProjectionMatrix();\n  \/\/ In Ger\u00e4tepixeln \u2013 der Hintergrundverlauf wird \u00fcber gl_FragCoord ausgewertet.\n  uniforms.uResolution.value.set(canvas.width, canvas.height);\n}\nwindow.addEventListener('resize', resize);\n\n\/\/ ------------------------------------------------------------- Debug-Panel\n\nconst ui = {\n  progress: document.getElementById('dbg-progress'),\n  manual: document.getElementById('dbg-manual'),\n  feather: document.getElementById('dbg-feather'),\n  line: document.getElementById('dbg-line'),\n  lead: document.getElementById('dbg-lead'),\n  start: document.getElementById('dbg-start'),\n  readout: document.getElementById('dbg-readout'),\n};\n\n\/\/ Auf der Website gibt es kein Debug-Panel \u2013 dann alles \u00fcberspringen.\nconst hasDebug = !!document.getElementById('debug');\nif (hasDebug) {\n  ui.manual.addEventListener('change', () => {\n    scrollOverride = ui.manual.checked ? parseFloat(ui.progress.value) : null;\n  });\n  ui.progress.addEventListener('input', () => {\n    if (ui.manual.checked) scrollOverride = parseFloat(ui.progress.value);\n  });\n  ui.feather.addEventListener('input', () => { uniforms.uFeather.value = parseFloat(ui.feather.value); });\n  ui.line.addEventListener('input', () => { wireMat.uniforms.uLineWidth.value = parseFloat(ui.line.value); });\n  ui.lead.addEventListener('input', () => { params.camLead = parseFloat(ui.lead.value); });\n  ui.start.addEventListener('input', () => { params.scanStart = parseFloat(ui.start.value); });\n\n  document.addEventListener('keydown', (e) => {\n    if (e.key === 'd' || e.key === 'D') {\n      document.getElementById('debug').classList.toggle('hidden');\n    }\n  });\n}\n\n\/\/ ------------------------------------------------------------- Phasentexte\n\nconst captions = [...scrollEl.querySelectorAll('[data-phase]')];\nfunction updateCaptions(scroll) {\n  for (const el of captions) {\n    const [from, to] = el.dataset.phase.split(',').map(Number);\n    const vis = scroll >= from && scroll < to;\n    el.classList.toggle('visible', vis);\n  }\n}\n\n\/\/ ------------------------------------------------------------- Render-Loop\n\nconst clock = new THREE.Clock();\nlet elapsed = 0;\n\nfunction frame() {\n  \/\/ getElapsedTime w\u00fcrde getDelta intern zur\u00fccksetzen \u2013 deshalb nur getDelta\n  \/\/ lesen und die Gesamtzeit selbst f\u00fchren.\n  const dt = Math.min(clock.getDelta(), 0.1);\n  elapsed += dt;\n  const time = elapsed;\n  resize();\n\n  if (forceAutoplay || scrollRange() <= 0) {\n    const prev = autoplayT;\n    autoplayT = (autoplayT + dt \/ 14) % 1.35;  \/\/ 14 s Durchlauf, dann Pause\n    if (autoplayT < prev) currentScroll = 0;   \/\/ R\u00fccksprung nicht gl\u00e4tten\n    targetScroll = Math.min(autoplayT, 1);\n  } else {\n    targetScroll = readScroll();\n  }\n\n  const target = scrollOverride !== null ? scrollOverride : targetScroll;\n  currentScroll += (target - currentScroll) * 0.10;\n\n  const scanProgress = remap(currentScroll, params.scanFrom, params.scanTo)\n    * params.turns * params.overscan;\n\n  uniforms.uProgress.value = scanProgress;\n  uniforms.uScanStart.value = params.scanStart;\n  uniforms.uTime.value = time;\n\n  updateCamera(scanProgress, currentScroll, time);\n  tags.update(currentScroll, scanProgress, params.scanStart, uniforms.uKeyDir.value);\n  updateCaptions(currentScroll);\n\n  if (hasDebug) {\n    ui.readout.textContent =\n      `scroll ${currentScroll.toFixed(3)}  \u00b7  scan ${scanProgress.toFixed(3)}`;\n    if (scrollOverride === null) ui.progress.value = String(currentScroll);\n  }\n\n  renderer.render(scene, camera);\n}\n\n\/\/ Zum Inspizieren aus der Konsole\nwindow.LOGEOS = { scene, camera, renderer, uniforms, params, solidMat, wireMat };\n\ntargetScroll = readScroll();\ncurrentScroll = targetScroll;\nresize();\nrenderer.setAnimationLoop(frame);\n<\/script>\n<script>\n\/* Header: bleibt zu Beginn der Animation stehen und gleitet erst nach etwa\n   einem Drittel des Scrollwegs heraus \u2013 sonst wirkt der Einstieg wie eine Falle. *\/\n(function () {\n  var header = document.getElementById('masthead');\n  var hero = document.getElementById('logeos-hero');\n  if (!header || !hero) return;\n  header.style.position = 'sticky';\n  header.style.top = '0';\n  header.style.zIndex = '50';\n  header.style.transition = 'transform .45s cubic-bezier(.2,.7,.2,1)';\n  var sticky = hero.querySelector('.lg-sticky');\n  var hidden = false;\n  \/\/ Safari (Mac und iPhone) h\u00e4lt position: sticky auf dieser Seite nicht.\n  \/\/ F\u00e4llt das auf, \u00fcbernimmt das Skript das Festhalten selbst.\n  var pinJs = false;\n  function pin(r) {\n    var st = sticky.style;\n    if (r.top > 0) { st.position = 'absolute'; st.top = '0'; st.bottom = ''; st.left = '0'; st.width = '100%'; }\n    else if (r.bottom <= window.innerHeight) { st.position = 'absolute'; st.top = 'auto'; st.bottom = '0'; st.left = '0'; st.width = '100%'; }\n    else { st.position = 'fixed'; st.top = '0'; st.bottom = ''; st.left = r.left + 'px'; st.width = r.width + 'px'; }\n  }\n  function update() {\n    var r = hero.getBoundingClientRect();\n    if (!pinJs && r.top < -24 && r.bottom > window.innerHeight + 24 &&\n        Math.abs(sticky.getBoundingClientRect().top) > 2) {\n      pinJs = true;\n    }\n    if (pinJs) pin(r);\n    \/\/ Texte immer im sichtbaren Bereich halten, auch solange die Animation\n    \/\/ noch unter dem Header beginnt und unten aus dem Fenster ragt.\n    var cut = Math.max(0, sticky.getBoundingClientRect().bottom - window.innerHeight);\n    hero.style.setProperty('--lg-cut', cut + 'px');\n    var range = hero.offsetHeight - window.innerHeight;\n    var p = range > 0 ? -r.top \/ range : 0;\n    var hide = p > 0.30;\n    if (hide !== hidden) {\n      hidden = hide;\n      header.style.transform = hide ? 'translateY(-100%)' : '';\n    }\n  }\n  window.addEventListener('scroll', update, { passive: true });\n  window.addEventListener('resize', update);\n  update();\n})();\n<\/script>\n<script>\n\/* Videos weiter unten erst laden, wenn man in ihre N\u00e4he scrollt \u2013 sonst teilen\n   sich ~30 MB Video die Leitung mit der Hero-Animation. Die Video-Widgets stehen\n   auf preload=\"none\" ohne Autoplay; abgespielt wird hier, sobald sie sichtbar werden. *\/\ndocument.addEventListener('DOMContentLoaded', function () {\n  var vids = [].slice.call(document.querySelectorAll('video.e-self-hosted-video-base'))\n    .filter(function (v) { return !v.autoplay && v.loop; });\n  if (!vids.length) return;\n  function play(v) {\n    v.muted = true; v.playsInline = true;\n    if (v.preload !== 'auto') { v.preload = 'auto'; v.load(); }\n    var p = v.play(); if (p && p.catch) p.catch(function () {});\n  }\n  if (!('IntersectionObserver' in window)) { vids.forEach(play); return; }\n  var io = new IntersectionObserver(function (entries) {\n    entries.forEach(function (e) {\n      if (e.isIntersecting) play(e.target); else if (!e.target.paused) e.target.pause();\n    });\n  }, { rootMargin: '400px 0px' });\n  vids.forEach(function (v) { io.observe(v); });\n});\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-323f3750 e-con e-atomic-element e-div-block-base e-default-div e-127bce1b-2fa8 \" data-id=\"323f3750\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"323f3750\">\n    <div class=\"elementor-element elementor-element-64b67fc1 e-con e-atomic-element e-flexbox-base e-default-div e-3a4f67c0-bb1e \" data-id=\"64b67fc1\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"64b67fc1\">\n    <div class=\"elementor-element elementor-element-64113ab5 e-con e-atomic-element e-div-block-base e-default-div e-12fcd420-5541 \" data-id=\"64113ab5\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"64113ab5\">\n    <div class=\"elementor-element elementor-element-33078177 e-con e-atomic-element e-div-block-base e-default-div e-114bc8a2-de47 \" data-id=\"33078177\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"33078177\">\n    \t\t\t<span class=\"e-5df968fc-cbb5 e-paragraph-base e-default-span\" data-interaction-id=\"77f64801\">AR-Geometrieerfassung f\u00fcr die Tomographie<\/span>\n\t\t\n<\/div>\n\t\t\t<h1 data-interaction-id=\"24da3a9f\" class=\"e-28c49024-f4b8 e-heading-base e-default-h1\">3D-Messpunktpositionen in unter 2 Minuten<\/h1>\n\t\t\t\t\t<p class=\"e-241b7272-40b5 e-paragraph-base e-default-p\" data-interaction-id=\"31df42ee\">LoGeoS \u2013 der Low Effort Geometry Scanner \u2013 erfasst die 3D-Positionen aller Messpunkte am Stamm per Augmented Reality. Einmal mit dem iPhone um den Baum, und die Geometrie f\u00fcr Ihre Tomographie-Berechnung steht.<\/p>\n\t\t<div class=\"elementor-element elementor-element-5ab49301 e-con e-atomic-element e-flexbox-base e-default-div e-ea879e8-62be \" data-id=\"5ab49301\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"5ab49301\">\n    \t\t\t<a href=\"mailto:mail@tree-inspection-technologies.de?subject=Demo-Anfrage%20LoGeoS\" target=\"_self\" class=\"e-751de8c6-fd0a e-button-base e-default-a\" data-interaction-id=\"3427404e\">\n\tDemo anfragen --&gt;\n<\/a>\n\t\t\n<\/div>\n\t\t\t<p class=\"e-ffcd1d1-4888 e-paragraph-base e-default-p\" data-interaction-id=\"3b5f0451\">iOS-App \u00b7 Deutsch &amp; Englisch \u00b7 Export als .pit, .trt und .txt<\/p>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-3398821 e-con e-atomic-element e-flexbox-base e-default-div e-28b12e40-144e \" data-id=\"3398821\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"3398821\">\n    \t\t\t\t  \t<video\n    data-id=\"34a357b1\" data-interaction-id=\"34a357b1\"\n    data-e-type=\"e-self-hosted-video\" data-interactions=\"null\"\n    class=\"e-101b7e6e-c888 e-self-hosted-video-base\"\n\t\tclass=\"e-self-hosted-video-base\"\n\t\tposter=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-scan-nahaufnahme-poster.jpg\"\t\t\t\tmuted\t\tloop\t\t\t\tplaysinline\t\tcontrolslist=\"nodownload\"\t\tpreload=\"none\"\n\t>\n\t\t<source src=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-scan-nahaufnahme-web.mp4#t=0\">\n\t<\/video>\n\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" class=\"e-image-base e-default-img e-52a78b46-b719\" data-interaction-id=\"181bbc86\" id=\"1072\" src=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-strassenbaum-web.jpg\" width=\"800\" height=\"601\" srcset=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-strassenbaum-web.jpg 980w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-strassenbaum-web-300x225.jpg 300w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-strassenbaum-web-768x577.jpg 768w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-strassenbaum-web-16x12.jpg 16w\" alt=\"LoGeoS-Nummernschilder an einem Stra\u00dfenbaum f\u00fcr die Tomographie-Geometrie\"\/>\t\t\n<\/div>\n\n<\/div>\n\n<\/div>\n<div class=\"elementor-element elementor-element-162c5b9c e-con e-atomic-element e-div-block-base e-default-div e-24f07ca6-b5f4 \" data-id=\"162c5b9c\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"162c5b9c\">\n    <div class=\"elementor-element elementor-element-7273d616 e-con e-atomic-element e-div-block-base e-default-div e-1a8579e8-b46f \" data-id=\"7273d616\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"7273d616\">\n    \t\t\t<p class=\"e-5ea2e415-21e8 e-paragraph-base e-default-p\" data-interaction-id=\"184910b4\">Vorteile<\/p>\n\t\t\t\t\t<h2 data-interaction-id=\"7c7070b1\" class=\"e-42ab9867-eb13 e-heading-base e-default-h2\">Messpunkt Geometrie in &lt; 2 Minuten<\/h2>\n\t\t\t\t\t<p class=\"e-7da7999f-5432 e-paragraph-base e-default-p\" data-interaction-id=\"24c49438\">Die Geometrie der Messpunkte ist die Grundlage jeder Tomographie \u2013 ihre Erfassung gestaltet sich bei gro\u00dfen B\u00e4umen jedoch oft als aufwendig. LoGeoS vereinfacht diesen Schritt erheblich: Nummerierte Schilder an den Messn\u00e4geln gen\u00fcgen \u2013 die LoGeoS App erfasst die Positionen per Kamera und LiDAR automatisch und pr\u00e4zise.<\/p>\n\t\t<div class=\"elementor-element elementor-element-1aa96cee e-con e-atomic-element e-grid-base e-default-div e-6e8b364f-82bc \" data-id=\"1aa96cee\" data-element_type=\"e-grid\" data-e-type=\"e-grid\" data-interaction-id=\"1aa96cee\">\n    <div class=\"elementor-element elementor-element-4098da7f e-con e-atomic-element e-div-block-base e-default-div e-fcb38b5-795d \" data-id=\"4098da7f\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"4098da7f\">\n    \t\t\t<p class=\"e-4f62266f-c569 e-paragraph-base e-default-p\" data-interaction-id=\"4b1c7884\">Scannen statt messen<\/p>\n\t\t\t\t\t<p class=\"e-6073ca70-64cd e-paragraph-base e-default-p\" data-interaction-id=\"3d4a04d8\">Die App erkennt jedes nummerierte Schild automatisch und speichert seine Position im Raum. Erkannte Schilder werden gr\u00fcn markiert \u2013 Sie sehen jederzeit, was noch fehlt.<\/p>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-15954396 e-con e-atomic-element e-div-block-base e-default-div e-4b8966a7-dc35 \" data-id=\"15954396\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"15954396\">\n    \t\t\t<p class=\"e-54d3112a-5f0f e-paragraph-base e-default-p\" data-interaction-id=\"1ee06c6f\">Echte 3D-Positionen<\/p>\n\t\t\t\t\t<p class=\"e-758b175f-a49c e-paragraph-base e-default-p\" data-interaction-id=\"50d79f23\">Erfasst wird die r\u00e4umliche Lage jedes Messnagels \u2013 inklusive Nagell\u00e4nge und Schildposition. F\u00fcr den Export werden die Punkte auf die best-fit Ebene projiziert.<\/p>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-38b824bd e-con e-atomic-element e-div-block-base e-default-div e-5d2c1ade-5cd8 \" data-id=\"38b824bd\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"38b824bd\">\n    \t\t\t<p class=\"e-192d1f96-a0b6 e-paragraph-base e-default-p\" data-interaction-id=\"70bf7841\">Auch bei schwieriger Stammform<\/p>\n\t\t\t\t\t<p class=\"e-685f2c60-b8ba e-paragraph-base e-default-p\" data-interaction-id=\"2920422d\">Wurzelanl\u00e4ufe, W\u00fclste, unrunde Querschnitte: Wo andere Verfahren an ihre Grenzen sto\u00dfen, erfasst die LoGeoS App die tats\u00e4chliche Lage jedes Messpunktes schnell und pr\u00e4zise.<\/p>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-6506e40d e-con e-atomic-element e-div-block-base e-default-div e-61ad3c99-e102 \" data-id=\"6506e40d\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"6506e40d\">\n    \t\t\t<p class=\"e-4c609242-89d3 e-paragraph-base e-default-p\" data-interaction-id=\"399f10b9\">Direkt ins Tomographie-Format<\/p>\n\t\t\t\t\t<p class=\"e-41232988-d681 e-paragraph-base e-default-p\" data-interaction-id=\"64085e01\">Export als neue .pit-, .trt- oder .txt-Datei \u2013 oder die Scandaten direkt in eine vorhandene .pit- bzw. .trt-Datei einf\u00fcgen. Die urspr\u00fcngliche Dateistruktur bleibt erhalten.<\/p>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-5f49600 e-con e-atomic-element e-div-block-base e-default-div e-74c6ba8c-c136 \" data-id=\"5f49600\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"5f49600\">\n    \t\t\t<p class=\"e-4d882b5e-d88a e-paragraph-base e-default-p\" data-interaction-id=\"1d4712a5\">GPS und Nordrichtung inklusive<\/p>\n\t\t\t\t\t<p class=\"e-21e45956-46ca e-paragraph-base e-default-p\" data-interaction-id=\"55ea4a97\">Beim Anlegen eines Projekts wird der Standort automatisch gespeichert, der nach Norden weisende Messpunkt per Kompass bestimmt. Alle B\u00e4ume finden Sie auf der Karte wieder.<\/p>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-574f3c9d e-con e-atomic-element e-div-block-base e-default-div e-97370fc-c632 \" data-id=\"574f3c9d\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"574f3c9d\">\n    \t\t\t<p class=\"e-241325b0-2bbb e-paragraph-base e-default-p\" data-interaction-id=\"723fc093\">Flexibel bis 48 Messpunkte<\/p>\n\t\t\t\t\t<p class=\"e-58f7ba91-f6ee e-paragraph-base e-default-p\" data-interaction-id=\"3ade73e5\">Von einem bis 48 Messpunkten pro Baum. Die H\u00f6he der Messebene geben Sie ein \u2013 oder lassen sie \u00fcber ein Bodenschild direkt aus dem Scan berechnen.<\/p>\n\t\t\n<\/div>\n\n<\/div>\n<div class=\"elementor-element elementor-element-4718c901 e-con e-atomic-element e-flexbox-base e-default-div e-136bf8f3-1a9e \" data-id=\"4718c901\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"4718c901\">\n    \t\t\t<img decoding=\"async\" class=\"e-image-base e-default-img e-31da9c5f-d074\" data-interaction-id=\"133ad6c3\" id=\"1055\" src=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-aerial-testing-icon-v2.png\" width=\"384\" height=\"384\" srcset=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-aerial-testing-icon-v2.png 384w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-aerial-testing-icon-v2-300x300.png 300w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-aerial-testing-icon-v2-150x150.png 150w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-aerial-testing-icon-v2-12x12.png 12w\" alt=\"Symbol: Baumkletterer h\u00e4ngt im Gurt am Seil und scannt ein Messpunktschild mit dem iPhone\"\/>\t\t<div class=\"elementor-element elementor-element-6dafc04b e-con e-atomic-element e-div-block-base e-default-div e-3252a184-7547 \" data-id=\"6dafc04b\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"6dafc04b\">\n    \t\t\t<p class=\"e-1a90294-2f62 e-paragraph-base e-default-p\" data-interaction-id=\"121f9bf5\">Einsatz in der Baumkrone<\/p>\n\t\t\t\t\t<h3 data-interaction-id=\"32bb3bb8\" class=\"e-16ffa296-e7f5 e-heading-base e-default-h3\">Aerial Testing<\/h3>\n\t\t\t\t\t<p class=\"e-47306570-57ec e-paragraph-base e-default-p\" data-interaction-id=\"7687484a\">F\u00fcr Messungen in gr\u00f6\u00dferer H\u00f6he sind Anwender oft mit Seilen im Baum unterwegs \u2013 unter diesen Bedingungen z\u00e4hlt jeder gesparte Handgriff. Andere Verfahren erfordern hier meist zus\u00e4tzliches Messequipment, das sich beim Klettern nur schwer handhaben l\u00e4sst. Die LoGeoS App reduziert den Aufwand auf ein Minimum: Schild anbringen, mit der Kamera abfahren, fertig. Weniger Zeit, weniger Technik, mehr Arbeitssicherheit.<\/p>\n\t\t\n<\/div>\n\n<\/div>\n\n<\/div>\n\n<\/div>\n<div class=\"elementor-element elementor-element-4f468581 e-con e-atomic-element e-div-block-base e-default-div e-42c86364-5ede \" data-id=\"4f468581\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"4f468581\">\n    <div class=\"elementor-element elementor-element-6020edec e-con e-atomic-element e-div-block-base e-default-div e-35c8caa6-e3e7 \" data-id=\"6020edec\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"6020edec\">\n    \t\t\t<p class=\"e-7b09eb31-fdd1 e-paragraph-base e-default-p\" data-interaction-id=\"2011ba41\">Ablauf<\/p>\n\t\t\t\t\t<h2 data-interaction-id=\"42ca7661\" class=\"e-4b68ac88-8ccd e-heading-base e-default-h2\">In vier Schritten zur Geometrie<\/h2>\n\t\t<div class=\"elementor-element elementor-element-59626d52 e-con e-atomic-element e-grid-base e-default-div e-5003337c-492b \" data-id=\"59626d52\" data-element_type=\"e-grid\" data-e-type=\"e-grid\" data-interaction-id=\"59626d52\">\n    <div class=\"elementor-element elementor-element-6f92c63 e-con e-atomic-element e-grid-base e-default-div e-d3a7762-4b4e \" data-id=\"6f92c63\" data-element_type=\"e-grid\" data-e-type=\"e-grid\" data-interaction-id=\"6f92c63\">\n    <div class=\"elementor-element elementor-element-3e869629 e-con e-atomic-element e-div-block-base e-default-div e-5a4ec7b3-25aa \" data-id=\"3e869629\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"3e869629\">\n    \t\t\t<p class=\"e-7f6c2772-81e1 e-paragraph-base e-default-p\" data-interaction-id=\"14a0870f\">01<\/p>\n\t\t<div class=\"elementor-element elementor-element-5b3fef14 e-con e-atomic-element e-div-block-base e-default-div e-f48dba9-724e \" data-id=\"5b3fef14\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"5b3fef14\">\n    \n<\/div>\n\t\t\t<p class=\"e-50658eda-a4b0 e-paragraph-base e-default-p\" data-interaction-id=\"5127e708\">Projekt anlegen<\/p>\n\t\t\t\t\t<p class=\"e-1a8c765d-5660 e-paragraph-base e-default-p\" data-interaction-id=\"2521ae2c\">Baumnummer eingeben, Anzahl der Messpunkte w\u00e4hlen. GPS-Position und Datum werden automatisch gespeichert.<\/p>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-12d33550 e-con e-atomic-element e-div-block-base e-default-div e-7a71e522-f1e7 \" data-id=\"12d33550\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"12d33550\">\n    \t\t\t<p class=\"e-7aa34b52-cd45 e-paragraph-base e-default-p\" data-interaction-id=\"c37a49f\">02<\/p>\n\t\t<div class=\"elementor-element elementor-element-7bb5b751 e-con e-atomic-element e-div-block-base e-default-div e-2424396d-125c \" data-id=\"7bb5b751\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"7bb5b751\">\n    \n<\/div>\n\t\t\t<p class=\"e-190bd44-702f e-paragraph-base e-default-p\" data-interaction-id=\"285bfe08\">Schilder anbringen<\/p>\n\t\t\t\t\t<p class=\"e-2c84269-face e-paragraph-base e-default-p\" data-interaction-id=\"73cc55f1\">Die nummerierten Schilder an den Messn\u00e4geln befestigen. Nagell\u00e4nge und Befestigungsart (mittig oder oben) legen Sie im Projekt fest.<\/p>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-492ce4cc e-con e-atomic-element e-div-block-base e-default-div e-10a857b3-7293 \" data-id=\"492ce4cc\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"492ce4cc\">\n    \t\t\t<p class=\"e-22dfc3b5-bba7 e-paragraph-base e-default-p\" data-interaction-id=\"6c84b26d\">03<\/p>\n\t\t<div class=\"elementor-element elementor-element-65766b4 e-con e-atomic-element e-div-block-base e-default-div e-3afea09f-3053 \" data-id=\"65766b4\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"65766b4\">\n    \n<\/div>\n\t\t\t<p class=\"e-7c71bd7c-494f e-paragraph-base e-default-p\" data-interaction-id=\"266ba44a\">Scannen<\/p>\n\t\t\t\t\t<p class=\"e-5157b1f7-303d e-paragraph-base e-default-p\" data-interaction-id=\"3e9fdb4b\">Mit dem iPhone in 20\u201350 cm Abstand langsam um den Stamm gehen. Jedes erkannte Schild leuchtet gr\u00fcn \u2013 sind alle erfasst, auf \u201eFertig\u201c tippen.<\/p>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-50b9c3c9 e-con e-atomic-element e-div-block-base e-default-div e-775fd3f2-8cd4 \" data-id=\"50b9c3c9\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"50b9c3c9\">\n    \t\t\t<p class=\"e-117f76dc-76aa e-paragraph-base e-default-p\" data-interaction-id=\"40206153\">04<\/p>\n\t\t<div class=\"elementor-element elementor-element-19b2e250 e-con e-atomic-element e-div-block-base e-default-div e-573b2e23-22d8 \" data-id=\"19b2e250\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"19b2e250\">\n    \n<\/div>\n\t\t\t<p class=\"e-663f442c-db62 e-paragraph-base e-default-p\" data-interaction-id=\"2fe03cb8\">Pr\u00fcfen &amp; exportieren<\/p>\n\t\t\t\t\t<p class=\"e-677649be-c43c e-paragraph-base e-default-p\" data-interaction-id=\"38bc2070\">Ergebnis in Draufsicht, Ebenenprojektion oder 3D kontrollieren, Abst\u00e4nde nachmessen und als .pit-, .trt- oder .txt-Datei exportieren.<\/p>\n\t\t\n<\/div>\n\n<\/div>\n<div class=\"elementor-element elementor-element-1d8cc2aa e-con e-atomic-element e-div-block-base e-default-div e-62350c9a-1fff \" data-id=\"1d8cc2aa\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"1d8cc2aa\">\n    \t\t\t\t  \t<video\n    data-id=\"58e69e97\" data-interaction-id=\"58e69e97\"\n    data-e-type=\"e-self-hosted-video\" data-interactions=\"null\"\n    class=\"e-35acbac-fc6d e-self-hosted-video-base\"\n\t\tclass=\"e-self-hosted-video-base\"\n\t\tposter=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-scan-rund-um-den-baum-poster.jpg\"\t\t\t\tmuted\t\tloop\t\t\t\tplaysinline\t\tcontrolslist=\"nodownload\"\t\tpreload=\"none\"\n\t>\n\t\t<source src=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-scan-rund-um-den-baum-web.mp4#t=0\">\n\t<\/video>\n\t\t\t\t\t<p class=\"e-3dc4fd94-8165 e-paragraph-base e-default-p\" data-interaction-id=\"20fa595\">Einmal rund um den Baum \u2013 so einfach ist der Scan.<\/p>\n\t\t\n<\/div>\n\n<\/div>\n\n<\/div>\n\n<\/div>\n<div class=\"elementor-element elementor-element-183ab8fb e-con e-atomic-element e-div-block-base e-default-div e-33c18216-d50f \" data-id=\"183ab8fb\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"183ab8fb\">\n    <div class=\"elementor-element elementor-element-648c173e e-con e-atomic-element e-grid-base e-default-div e-2a7a213e-ceda \" data-id=\"648c173e\" data-element_type=\"e-grid\" data-e-type=\"e-grid\" data-interaction-id=\"648c173e\">\n    <div class=\"elementor-element elementor-element-56594d67 e-con e-atomic-element e-div-block-base e-default-div e-3c194f71-a0cd \" data-id=\"56594d67\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"56594d67\">\n    \t\t\t<p class=\"e-a1b3933-1301 e-paragraph-base e-default-p\" data-interaction-id=\"68aa29bb\">DIE APP<\/p>\n\t\t\t\t\t<h2 data-interaction-id=\"2fc07c54\" class=\"e-ad1a9bd-4086 e-heading-base e-default-h2\">Alles im Blick. Direkt am Baum.<\/h2>\n\t\t\t\t\t<p class=\"e-24d38b8c-898d e-paragraph-base e-default-p\" data-interaction-id=\"66cb0902\">Noch vor Ort sehen Sie, ob die Geometrie stimmt \u2013 und korrigieren, bevor Sie zum n\u00e4chsten Baum gehen.<\/p>\n\t\t\t\t\t<p class=\"e-51792b2f-157c e-paragraph-base e-default-p\" data-interaction-id=\"7ab6eda8\"><span>\u2014&nbsp;&nbsp;<strong>Drei Ansichten:<\/strong> Draufsicht, Ebenenprojektion und drehbare 3D-Ansicht<\/span><br><span>\u2014&nbsp;&nbsp;<strong>Abst\u00e4nde messen:<\/strong> 3D-Distanz zwischen zwei beliebigen Messpunkten per Fingertipp<\/span><br><span>\u2014&nbsp;&nbsp;<strong>Kantenabst\u00e4nde:<\/strong> Abst\u00e4nde benachbarter Messpunkte auf einen Blick<\/span><br><span>\u2014&nbsp;&nbsp;<strong>Rindenumriss:<\/strong> ungef\u00e4hre Rindenkontur aus den Schildpositionen<\/span><br><span>\u2014&nbsp;&nbsp;<strong>Karte:<\/strong> alle B\u00e4ume mit Baumnummer, auch als Satellitenansicht<\/span><br><span>\u2014&nbsp;&nbsp;<strong>Ersatzschilder:<\/strong> verlorene Schilder einfach neu zuordnen<\/span><\/p>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-157249ea e-con e-atomic-element e-flexbox-base e-default-div e-470e956a-e4e9 \" data-id=\"157249ea\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"157249ea\">\n    <div class=\"elementor-element elementor-element-1b95d4a7 e-con e-atomic-element e-div-block-base e-default-div e-1618df99-d01b \" data-id=\"1b95d4a7\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"1b95d4a7\">\n    \t\t\t\t  \t<video\n    data-id=\"784bf5a6\" data-interaction-id=\"784bf5a6\"\n    data-e-type=\"e-self-hosted-video\" data-interactions=\"null\"\n    class=\"e-36f551e3-d378 e-self-hosted-video-base\"\n\t\tclass=\"e-self-hosted-video-base\"\n\t\tposter=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-app-schilderkennung-poster.jpg\"\t\t\t\tmuted\t\tloop\t\t\t\tplaysinline\t\tcontrolslist=\"nodownload\"\t\tpreload=\"none\"\n\t>\n\t\t<source src=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-app-schilderkennung-web.mp4#t=0\">\n\t<\/video>\n\t\t\t\t\t<p class=\"e-246d86d3-cb3b e-paragraph-base e-default-p\" data-interaction-id=\"70036474\">AR-Scan: Schilder werden erkannt<\/p>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-76188647 e-con e-atomic-element e-div-block-base e-default-div e-50a4ad8a-fb45 \" data-id=\"76188647\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"76188647\">\n    \t\t\t\t  \t<video\n    data-id=\"43eb55b1\" data-interaction-id=\"43eb55b1\"\n    data-e-type=\"e-self-hosted-video\" data-interactions=\"null\"\n    class=\"e-1aeeea8e-20b9 e-self-hosted-video-base\"\n\t\tclass=\"e-self-hosted-video-base\"\n\t\tposter=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-app-3d-ergebnis-poster.jpg\"\t\t\t\tmuted\t\tloop\t\t\t\tplaysinline\t\tcontrolslist=\"nodownload\"\t\tpreload=\"none\"\n\t>\n\t\t<source src=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-app-3d-ergebnis-web.mp4#t=0\">\n\t<\/video>\n\t\t\t\t\t<p class=\"e-19cb87ac-4f5a e-paragraph-base e-default-p\" data-interaction-id=\"10eeeb8b\">3D-Ansicht mit Abst\u00e4nden<\/p>\n\t\t\n<\/div>\n\n<\/div>\n\n<\/div>\n\n<\/div>\n<div class=\"elementor-element elementor-element-1f0493bc e-con e-atomic-element e-div-block-base e-default-div e-3a9fde81-fb77 \" data-id=\"1f0493bc\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"1f0493bc\">\n    <div class=\"elementor-element elementor-element-55405598 e-con e-atomic-element e-div-block-base e-default-div e-3688e0a2-2ca4 \" data-id=\"55405598\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"55405598\">\n    \t\t\t<p class=\"e-454d5b3b-9dc6 e-paragraph-base e-default-p\" data-interaction-id=\"1230ef1\">Im Feld<\/p>\n\t\t\t\t\t<h2 data-interaction-id=\"169b374a\" class=\"e-4492b5c9-8b51 e-heading-base e-default-h2\">Gemacht f\u00fcr den Alltag am Baum<\/h2>\n\t\t<div class=\"elementor-element elementor-element-420034ae e-con e-atomic-element e-grid-base e-default-div e-5aef4a56-eee4 \" data-id=\"420034ae\" data-element_type=\"e-grid\" data-e-type=\"e-grid\" data-interaction-id=\"420034ae\">\n    \t\t\t<img decoding=\"async\" class=\"e-image-base e-default-img e-5cdc7adb-fbeb\" data-interaction-id=\"5f2d1872\" id=\"1071\" src=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-baum-abendlicht-web-1024x768.jpg\" width=\"800\" height=\"600\" srcset=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-baum-abendlicht-web-1024x768.jpg 1024w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-baum-abendlicht-web-300x225.jpg 300w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-baum-abendlicht-web-768x576.jpg 768w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-baum-abendlicht-web-16x12.jpg 16w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-baum-abendlicht-web.jpg 1160w\" alt=\"Nummerierte LoGeoS-Messpunktschilder rund um einen Baumstamm im Abendlicht\"\/>\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" class=\"e-image-base e-default-img e-5cc84c34-e71a\" data-interaction-id=\"5d13aa2e\" id=\"1073\" src=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-komplexe-stammgeometrie-web-1024x768.jpg\" width=\"800\" height=\"600\" srcset=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-komplexe-stammgeometrie-web-1024x768.jpg 1024w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-komplexe-stammgeometrie-web-300x225.jpg 300w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-komplexe-stammgeometrie-web-768x576.jpg 768w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-komplexe-stammgeometrie-web-16x12.jpg 16w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-komplexe-stammgeometrie-web.jpg 1160w\" alt=\"LoGeoS-Messpunkte an einem Baum mit unregelm\u00e4\u00dfiger Stammgeometrie\"\/>\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" class=\"e-image-base e-default-img e-29bf3e16-a829\" data-interaction-id=\"957ed60\" id=\"1069\" src=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-nummernschilder-am-stamm-web.jpg\" width=\"720\" height=\"960\" srcset=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-nummernschilder-am-stamm-web.jpg 720w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-nummernschilder-am-stamm-web-225x300.jpg 225w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-nummernschilder-am-stamm-web-9x12.jpg 9w\" alt=\"Nummerierte Messpunktschilder an N\u00e4geln im Baumstamm f\u00fcr den LoGeoS AR-Scan\"\/>\t\t\n<\/div>\n\n<\/div>\n\n<\/div>\n<div class=\"elementor-element elementor-element-416f2609 e-con e-atomic-element e-div-block-base e-default-div e-28c7e85-7b80 \" data-id=\"416f2609\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"416f2609\">\n    <div class=\"elementor-element elementor-element-16389827 e-con e-atomic-element e-div-block-base e-default-div e-6a48fed7-2416 \" data-id=\"16389827\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"16389827\">\n    \t\t\t<p class=\"e-11dfba7b-95c1 e-paragraph-base e-default-p\" data-interaction-id=\"1c34c35e\">FAQ<\/p>\n\t\t\t\t\t<h2 data-interaction-id=\"6791fc3d\" class=\"e-86bf968-4cbe e-heading-base e-default-h2\">H\u00e4ufige Fragen zu LoGeoS<\/h2>\n\t\t<div class=\"elementor-element elementor-element-31704266 e-con e-atomic-element e-accordion-base  e-6ccc16c9-8182 \" data-id=\"31704266\" data-element_type=\"e-accordion\" data-e-type=\"e-accordion\" data-interaction-id=\"31704266\">\n    <details class=\"elementor-element elementor-element-ac0ebdc e-con e-atomic-element e-accordion-item-base  e-5df921a-6f7e \" data-id=\"ac0ebdc\" data-element_type=\"e-accordion-item\" data-e-type=\"e-accordion-item\" data-interaction-id=\"ac0ebdc\"  name=\"31704266\">\n    <summary class=\"elementor-element elementor-element-42063cfc e-con e-atomic-element e-accordion-item-header-base  e-4299220b-f8c9 \" data-id=\"42063cfc\" data-element_type=\"e-accordion-item-header\" data-e-type=\"e-accordion-item-header\" data-interaction-id=\"42063cfc\">\n    <span class=\"elementor-element elementor-element-7fe63593 e-con e-atomic-element e-accordion-item-title-base  \" data-id=\"7fe63593\" data-element_type=\"e-accordion-item-title\" data-e-type=\"e-accordion-item-title\" data-interaction-id=\"7fe63593\">\n    \t\t\t<p class=\"e-283f5020-54e9 e-paragraph-base e-default-p\" data-interaction-id=\"205080fd\">Welche Dateiformate kann LoGeoS exportieren?<\/p>\n\t\t\n<\/span>\n<div class=\"elementor-element elementor-element-5aac4ef5 e-con e-atomic-element e-accordion-item-icon-base  \" data-id=\"5aac4ef5\" data-element_type=\"e-accordion-item-icon\" data-e-type=\"e-accordion-item-icon\" data-interaction-id=\"5aac4ef5\" aria-hidden=\"true\">\n    \n<\/div>\n\n<\/summary>\n<div class=\"elementor-element elementor-element-451588e5 e-con e-atomic-element e-accordion-item-content-base  e-19691189-3dcc \" data-id=\"451588e5\" data-element_type=\"e-accordion-item-content\" data-e-type=\"e-accordion-item-content\" data-interaction-id=\"451588e5\">\n    \t\t\t<p class=\"e-77644cb0-6f6f e-paragraph-base e-default-p\" data-interaction-id=\"772d8f57\">LoGeoS exportiert die Scandaten als .pit-, .trt- oder .txt-Datei. Sie k\u00f6nnen eine neue Datei erstellen oder die Daten in eine vorhandene .pit- bzw. .trt-Datei einf\u00fcgen \u2013 deren Struktur bleibt dabei erhalten. Exportierte Dateien teilen Sie \u00fcber das iOS-Teilen-Men\u00fc.<\/p>\n\t\t\n<\/div>\n\n<\/details>\n<details class=\"elementor-element elementor-element-684942dc e-con e-atomic-element e-accordion-item-base  e-7ee873cf-dda2 \" data-id=\"684942dc\" data-element_type=\"e-accordion-item\" data-e-type=\"e-accordion-item\" data-interaction-id=\"684942dc\"  name=\"31704266\">\n    <summary class=\"elementor-element elementor-element-17ed26bc e-con e-atomic-element e-accordion-item-header-base  e-18a06c66-28eb \" data-id=\"17ed26bc\" data-element_type=\"e-accordion-item-header\" data-e-type=\"e-accordion-item-header\" data-interaction-id=\"17ed26bc\">\n    <span class=\"elementor-element elementor-element-6b8074fe e-con e-atomic-element e-accordion-item-title-base  \" data-id=\"6b8074fe\" data-element_type=\"e-accordion-item-title\" data-e-type=\"e-accordion-item-title\" data-interaction-id=\"6b8074fe\">\n    \t\t\t<p class=\"e-7964d69f-9bdd e-paragraph-base e-default-p\" data-interaction-id=\"31a6266c\">Wie viele Messpunkte sind m\u00f6glich?<\/p>\n\t\t\n<\/span>\n<div class=\"elementor-element elementor-element-60772f28 e-con e-atomic-element e-accordion-item-icon-base  \" data-id=\"60772f28\" data-element_type=\"e-accordion-item-icon\" data-e-type=\"e-accordion-item-icon\" data-interaction-id=\"60772f28\" aria-hidden=\"true\">\n    \n<\/div>\n\n<\/summary>\n<div class=\"elementor-element elementor-element-3beb1a4f e-con e-atomic-element e-accordion-item-content-base  e-4590871a-5cbe \" data-id=\"3beb1a4f\" data-element_type=\"e-accordion-item-content\" data-e-type=\"e-accordion-item-content\" data-interaction-id=\"3beb1a4f\">\n    \t\t\t<p class=\"e-535ccec3-5107 e-paragraph-base e-default-p\" data-interaction-id=\"63eec4f7\">Pro Baum lassen sich 1 bis 48 Messpunkte anlegen. Zus\u00e4tzlich kann ein Schild mit h\u00f6herer Nummer als Bodenschild dienen, um die H\u00f6he der Messebene automatisch zu bestimmen.<\/p>\n\t\t\n<\/div>\n\n<\/details>\n<details class=\"elementor-element elementor-element-6c73403d e-con e-atomic-element e-accordion-item-base  e-78d90a-1e2d \" data-id=\"6c73403d\" data-element_type=\"e-accordion-item\" data-e-type=\"e-accordion-item\" data-interaction-id=\"6c73403d\"  name=\"31704266\">\n    <summary class=\"elementor-element elementor-element-62b6d089 e-con e-atomic-element e-accordion-item-header-base  e-2830876-453f \" data-id=\"62b6d089\" data-element_type=\"e-accordion-item-header\" data-e-type=\"e-accordion-item-header\" data-interaction-id=\"62b6d089\">\n    <span class=\"elementor-element elementor-element-29ee035d e-con e-atomic-element e-accordion-item-title-base  \" data-id=\"29ee035d\" data-element_type=\"e-accordion-item-title\" data-e-type=\"e-accordion-item-title\" data-interaction-id=\"29ee035d\">\n    \t\t\t<p class=\"e-54ad60ef-4aa5 e-paragraph-base e-default-p\" data-interaction-id=\"79447be1\">Worauf muss ich beim Scannen achten?<\/p>\n\t\t\n<\/span>\n<div class=\"elementor-element elementor-element-6cd35656 e-con e-atomic-element e-accordion-item-icon-base  \" data-id=\"6cd35656\" data-element_type=\"e-accordion-item-icon\" data-e-type=\"e-accordion-item-icon\" data-interaction-id=\"6cd35656\" aria-hidden=\"true\">\n    \n<\/div>\n\n<\/summary>\n<div class=\"elementor-element elementor-element-10c494cf e-con e-atomic-element e-accordion-item-content-base  e-4f17eb2d-aaf4 \" data-id=\"10c494cf\" data-element_type=\"e-accordion-item-content\" data-e-type=\"e-accordion-item-content\" data-interaction-id=\"10c494cf\">\n    \t\t\t<p class=\"e-6b78266-d84d e-paragraph-base e-default-p\" data-interaction-id=\"6ccbc20e\">Bewegen Sie das iPhone langsam und gleichm\u00e4\u00dfig in etwa 20\u201350 cm Abstand zu den Schildern. Der Scanner braucht ausreichend Licht \u2013 bei Dunkelheit funktioniert er nicht. Spiegelungen und Blendung auf den Schildern sollten Sie vermeiden.<\/p>\n\t\t\n<\/div>\n\n<\/details>\n<details class=\"elementor-element elementor-element-29d32940 e-con e-atomic-element e-accordion-item-base  e-d61ca9-a29e \" data-id=\"29d32940\" data-element_type=\"e-accordion-item\" data-e-type=\"e-accordion-item\" data-interaction-id=\"29d32940\"  name=\"31704266\">\n    <summary class=\"elementor-element elementor-element-f157d23 e-con e-atomic-element e-accordion-item-header-base  e-4ebb51e9-b91d \" data-id=\"f157d23\" data-element_type=\"e-accordion-item-header\" data-e-type=\"e-accordion-item-header\" data-interaction-id=\"f157d23\">\n    <span class=\"elementor-element elementor-element-78abd353 e-con e-atomic-element e-accordion-item-title-base  \" data-id=\"78abd353\" data-element_type=\"e-accordion-item-title\" data-e-type=\"e-accordion-item-title\" data-interaction-id=\"78abd353\">\n    \t\t\t<p class=\"e-69b211ed-8617 e-paragraph-base e-default-p\" data-interaction-id=\"13611dd3\">Was passiert, wenn ein Schild verloren geht?<\/p>\n\t\t\n<\/span>\n<div class=\"elementor-element elementor-element-3672d0d3 e-con e-atomic-element e-accordion-item-icon-base  \" data-id=\"3672d0d3\" data-element_type=\"e-accordion-item-icon\" data-e-type=\"e-accordion-item-icon\" data-interaction-id=\"3672d0d3\" aria-hidden=\"true\">\n    \n<\/div>\n\n<\/summary>\n<div class=\"elementor-element elementor-element-2285bc0a e-con e-atomic-element e-accordion-item-content-base  e-10efbf08-395f \" data-id=\"2285bc0a\" data-element_type=\"e-accordion-item-content\" data-e-type=\"e-accordion-item-content\" data-interaction-id=\"2285bc0a\">\n    \t\t\t<p class=\"e-7e256592-fbc5 e-paragraph-base e-default-p\" data-interaction-id=\"750b4822\">Kein Problem: In den Einstellungen ordnen Sie einfach ein Ersatzschild mit h\u00f6herer Nummer dem verlorenen Schild zu. Bis zu drei solcher Zuordnungen sind m\u00f6glich, sie gelten f\u00fcr alle Projekte.<\/p>\n\t\t\n<\/div>\n\n<\/details>\n<details class=\"elementor-element elementor-element-21a3eaf e-con e-atomic-element e-accordion-item-base  e-3ac0a3da-f3d6 \" data-id=\"21a3eaf\" data-element_type=\"e-accordion-item\" data-e-type=\"e-accordion-item\" data-interaction-id=\"21a3eaf\"  name=\"31704266\">\n    <summary class=\"elementor-element elementor-element-8675fda e-con e-atomic-element e-accordion-item-header-base  e-4642b443-afbb \" data-id=\"8675fda\" data-element_type=\"e-accordion-item-header\" data-e-type=\"e-accordion-item-header\" data-interaction-id=\"8675fda\">\n    <span class=\"elementor-element elementor-element-8bd9a6d e-con e-atomic-element e-accordion-item-title-base  \" data-id=\"8bd9a6d\" data-element_type=\"e-accordion-item-title\" data-e-type=\"e-accordion-item-title\" data-interaction-id=\"8bd9a6d\">\n    \t\t\t<p class=\"e-15208fd5-a2e7 e-paragraph-base e-default-p\" data-interaction-id=\"21ea11e7\">Kann ich einen Scan wiederholen oder nachbearbeiten?<\/p>\n\t\t\n<\/span>\n<div class=\"elementor-element elementor-element-5d8e2607 e-con e-atomic-element e-accordion-item-icon-base  \" data-id=\"5d8e2607\" data-element_type=\"e-accordion-item-icon\" data-e-type=\"e-accordion-item-icon\" data-interaction-id=\"5d8e2607\" aria-hidden=\"true\">\n    \n<\/div>\n\n<\/summary>\n<div class=\"elementor-element elementor-element-48d4cda0 e-con e-atomic-element e-accordion-item-content-base  e-434a2f7d-d86b \" data-id=\"48d4cda0\" data-element_type=\"e-accordion-item-content\" data-e-type=\"e-accordion-item-content\" data-interaction-id=\"48d4cda0\">\n    \t\t\t<p class=\"e-5d443f5c-f065 e-paragraph-base e-default-p\" data-interaction-id=\"97559b\">Ja. Ein neuer Scan ist jederzeit m\u00f6glich und ersetzt die vorherigen Daten. Nagell\u00e4ngen, Schildpositionen, Messebenenh\u00f6he und Projektfotos lassen sich im Projekteditor auch nachtr\u00e4glich anpassen \u2013 global oder f\u00fcr einzelne N\u00e4gel.<\/p>\n\t\t\n<\/div>\n\n<\/details>\n<details class=\"elementor-element elementor-element-55f107fb e-con e-atomic-element e-accordion-item-base  e-18ba9384-41ab \" data-id=\"55f107fb\" data-element_type=\"e-accordion-item\" data-e-type=\"e-accordion-item\" data-interaction-id=\"55f107fb\"  name=\"31704266\">\n    <summary class=\"elementor-element elementor-element-179fdc71 e-con e-atomic-element e-accordion-item-header-base  e-5a8ffc0-257e \" data-id=\"179fdc71\" data-element_type=\"e-accordion-item-header\" data-e-type=\"e-accordion-item-header\" data-interaction-id=\"179fdc71\">\n    <span class=\"elementor-element elementor-element-5fb318cd e-con e-atomic-element e-accordion-item-title-base  \" data-id=\"5fb318cd\" data-element_type=\"e-accordion-item-title\" data-e-type=\"e-accordion-item-title\" data-interaction-id=\"5fb318cd\">\n    \t\t\t<p class=\"e-3962d20-3aaf e-paragraph-base e-default-p\" data-interaction-id=\"21a6bd4b\">Wie verl\u00e4sslich sind die Ergebnisse?<\/p>\n\t\t\n<\/span>\n<div class=\"elementor-element elementor-element-721927fc e-con e-atomic-element e-accordion-item-icon-base  \" data-id=\"721927fc\" data-element_type=\"e-accordion-item-icon\" data-e-type=\"e-accordion-item-icon\" data-interaction-id=\"721927fc\" aria-hidden=\"true\">\n    \n<\/div>\n\n<\/summary>\n<div class=\"elementor-element elementor-element-4d0cd7a5 e-con e-atomic-element e-accordion-item-content-base  e-4312e84f-c892 \" data-id=\"4d0cd7a5\" data-element_type=\"e-accordion-item-content\" data-e-type=\"e-accordion-item-content\" data-interaction-id=\"4d0cd7a5\">\n    \t\t\t<p class=\"e-7e115a8e-d0de e-paragraph-base e-default-p\" data-interaction-id=\"79f30489\">Die Genauigkeit h\u00e4ngt von Lichtverh\u00e4ltnissen, Ger\u00e4t und sorgf\u00e4ltiger Bedienung ab. Mit der Ebenenprojektion, den Kantenabst\u00e4nden und dem Messwerkzeug k\u00f6nnen Sie das Ergebnis direkt am Baum pr\u00fcfen \u2013 kritische Ma\u00dfe sollten Sie wie gewohnt unabh\u00e4ngig kontrollieren.<\/p>\n\t\t\n<\/div>\n\n<\/details>\n\n<\/div>\n<script type=\"application\/ld+json\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@type\":\"FAQPage\",\"mainEntity\":[{\"@type\":\"Question\",\"name\":\"Welche Dateiformate kann LoGeoS exportieren?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"LoGeoS exportiert die Scandaten als .pit-, .trt- oder .txt-Datei. Sie k\\u00f6nnen eine neue Datei erstellen oder die Daten in eine vorhandene .pit- bzw. .trt-Datei einf\\u00fcgen \\u2013 deren Struktur bleibt dabei erhalten. Exportierte Dateien teilen Sie \\u00fcber das iOS-Teilen-Men\\u00fc.\"}},{\"@type\":\"Question\",\"name\":\"Wie viele Messpunkte sind m\\u00f6glich?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Pro Baum lassen sich 1 bis 48 Messpunkte anlegen. Zus\\u00e4tzlich kann ein Schild mit h\\u00f6herer Nummer als Bodenschild dienen, um die H\\u00f6he der Messebene automatisch zu bestimmen.\"}},{\"@type\":\"Question\",\"name\":\"Worauf muss ich beim Scannen achten?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Bewegen Sie das iPhone langsam und gleichm\\u00e4\\u00dfig in etwa 20\\u201350 cm Abstand zu den Schildern. Der Scanner braucht ausreichend Licht \\u2013 bei Dunkelheit funktioniert er nicht. Spiegelungen und Blendung auf den Schildern sollten Sie vermeiden.\"}},{\"@type\":\"Question\",\"name\":\"Was passiert, wenn ein Schild verloren geht?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Kein Problem: In den Einstellungen ordnen Sie einfach ein Ersatzschild mit h\\u00f6herer Nummer dem verlorenen Schild zu. Bis zu drei solcher Zuordnungen sind m\\u00f6glich, sie gelten f\\u00fcr alle Projekte.\"}},{\"@type\":\"Question\",\"name\":\"Kann ich einen Scan wiederholen oder nachbearbeiten?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Ja. Ein neuer Scan ist jederzeit m\\u00f6glich und ersetzt die vorherigen Daten. Nagell\\u00e4ngen, Schildpositionen, Messebenenh\\u00f6he und Projektfotos lassen sich im Projekteditor auch nachtr\\u00e4glich anpassen \\u2013 global oder f\\u00fcr einzelne N\\u00e4gel.\"}},{\"@type\":\"Question\",\"name\":\"Wie verl\\u00e4sslich sind die Ergebnisse?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Die Genauigkeit h\\u00e4ngt von Lichtverh\\u00e4ltnissen, Ger\\u00e4t und sorgf\\u00e4ltiger Bedienung ab. Mit der Ebenenprojektion, den Kantenabst\\u00e4nden und dem Messwerkzeug k\\u00f6nnen Sie das Ergebnis direkt am Baum pr\\u00fcfen \\u2013 kritische Ma\\u00dfe sollten Sie wie gewohnt unabh\\u00e4ngig kontrollieren.\"}}]}<\/script>\n<\/div>\n\n<\/div>\n<div class=\"elementor-element elementor-element-7d3e7443 e-con e-atomic-element e-div-block-base e-default-div e-789d2b5b-a7c5 \" data-id=\"7d3e7443\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"7d3e7443\">\n    <div class=\"elementor-element elementor-element-64a47a26 e-con e-atomic-element e-grid-base e-default-div e-3076e249-4a19 \" data-id=\"64a47a26\" data-element_type=\"e-grid\" data-e-type=\"e-grid\" data-interaction-id=\"64a47a26\">\n    <div class=\"elementor-element elementor-element-1d013114 e-con e-atomic-element e-div-block-base e-default-div e-64e11ad4-917c \" data-id=\"1d013114\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"1d013114\">\n    \t\t\t<p class=\"e-39d35e9f-5dfc e-paragraph-base e-default-p\" data-interaction-id=\"2cf02bcd\">Kontakt<\/p>\n\t\t\t\t\t<h2 data-interaction-id=\"1a38f90d\" class=\"e-1a9eda51-5574 e-heading-base e-default-h2\">LoGeoS ausprobieren<\/h2>\n\t\t\t\t\t<p class=\"e-76e3bf54-b6ec e-paragraph-base e-default-p\" data-interaction-id=\"24fbd76c\">Sie arbeiten mit Schalltomographie und m\u00f6chten die Geometrieerfassung beschleunigen? Wir zeigen Ihnen LoGeoS gern im Einsatz und beantworten Ihre Fragen.<\/p>\n\t\t\t\t\t<a href=\"mailto:mail@tree-inspection-technologies.de?subject=Anfrage%20zu%20LoGeoS\" target=\"_self\" class=\"e-551c9a70-a0ee e-button-base e-default-a\" data-interaction-id=\"ba48362\">\n\tKontakt aufnehmen --&gt;\n<\/a>\n\t\t\n<\/div>\n<div class=\"elementor-element elementor-element-6e3cbd53 e-con e-atomic-element e-flexbox-base e-default-div e-53a15536-70c2 \" data-id=\"6e3cbd53\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"6e3cbd53\">\n    \t\t\t<img loading=\"lazy\" decoding=\"async\" class=\"e-image-base e-default-img e-163bb47e-e223\" data-interaction-id=\"5b9f6d32\" id=\"1078\" src=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/AppIcon-web-150x150.jpg\" width=\"150\" height=\"150\" srcset=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/AppIcon-web-150x150.jpg 150w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/AppIcon-web-300x300.jpg 300w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/AppIcon-web-12x12.jpg 12w, https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/AppIcon-web.jpg 420w\" alt=\"App-Icon der LOFOR\u00ae App f\u00fcr iPhone und iPad\"\/>\t\t<div class=\"elementor-element elementor-element-1be9ad72 e-con e-atomic-element e-div-block-base e-default-div e-2a6e7cdb-fd94 \" data-id=\"1be9ad72\" data-element_type=\"e-div-block\" data-e-type=\"e-div-block\" data-interaction-id=\"1be9ad72\">\n    \t\t\t<p class=\"e-38734ff5-8850 e-paragraph-base e-default-p\" data-interaction-id=\"2cdaebce\">Auch interessant<\/p>\n\t\t\t\t\t<h3 data-interaction-id=\"494e61b0\" class=\"e-48b4dc28-f9d3 e-heading-base e-default-h3\">LOFOR\u00ae \u2013 Laser Deflektometer<\/h3>\n\t\t\t\t\t<p class=\"e-52c4e239-766c e-paragraph-base e-default-p\" data-interaction-id=\"7f8703b4\">Biegelinie, Torsion und Wurzeltellerneigung unter Last \u2013 f\u00fcr Zugversuch und Windreaktionsmessung.<\/p>\n\t\t\t\t\t<a href=\"\/lofor\/\" target=\"_self\" class=\"e-d93c28f-4553 e-button-base e-default-a\" data-interaction-id=\"4d67e769\">\n\tZu LOFOR\u00ae --&gt;\n<\/a>\n\t\t\n<\/div>\n\n<\/div>\n\n<\/div>\n\n<\/div>\n<div class=\"elementor-element elementor-element-7a1c0d3 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"7a1c0d3\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7a1c0d9 elementor-widget elementor-widget-html\" data-id=\"7a1c0d9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<script type=\"application\/ld+json\">{\"@context\":\"https:\/\/schema.org\",\"@type\":\"Product\",\"@id\":\"https:\/\/tree-inspection-technologies.de\/logeos\/#product\",\"name\":\"LoGeoS \u2013 Low Effort Geometry Scanner\",\"alternateName\":\"LoGeoS\",\"description\":\"iOS-App zur Erfassung der Messpunkt-Geometrie f\u00fcr die Schalltomographie. LoGeoS erkennt die nummerierten Schilder an den Messn\u00e4geln per AR-Scan mit dem iPhone, erfasst die 3D-Positionen aller Messpunkte und exportiert sie als .pit-, .trt- oder .txt-Datei.\",\"brand\":{\"@type\":\"Brand\",\"name\":\"LoGeoS\"},\"manufacturer\":{\"@id\":\"https:\/\/tree-inspection-technologies.de\/#organization\"},\"category\":\"Messtechnik f\u00fcr die Baumdiagnostik\",\"url\":\"https:\/\/tree-inspection-technologies.de\/logeos\/\",\"image\":[\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-komplexe-stammgeometrie.jpg\",\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-nummernschilder-am-stamm.jpg\"],\"audience\":{\"@type\":\"Audience\",\"audienceType\":\"Baumsachverst\u00e4ndige und Anwender der Schalltomographie\"},\"additionalProperty\":[{\"@type\":\"PropertyValue\",\"name\":\"Messpunkte pro Baum\",\"value\":\"1\u201348\"},{\"@type\":\"PropertyValue\",\"name\":\"Scanabstand\",\"value\":\"ca. 20\u201350 cm\"},{\"@type\":\"PropertyValue\",\"name\":\"Exportformate\",\"value\":\".pit, .trt, .txt; Einf\u00fcgen in vorhandene .pit- bzw. .trt-Dateien\"},{\"@type\":\"PropertyValue\",\"name\":\"Zusatzdaten\",\"value\":\"GPS-Position und Nordrichtung per Kompass\"},{\"@type\":\"PropertyValue\",\"name\":\"Ansichten\",\"value\":\"Draufsicht, Ebenenprojektion, drehbare 3D-Ansicht\"},{\"@type\":\"PropertyValue\",\"name\":\"Plattform\",\"value\":\"iOS-App\"},{\"@type\":\"PropertyValue\",\"name\":\"Sprachen\",\"value\":\"Deutsch, Englisch\"}]}<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>LoGeoS \u00b7 Low Effort Geometry Scanner Kein Baum ist ein Zylinder. Wurzelanl\u00e4ufe, ovale Querschnitte, Beulen \u2013 die Form entscheidet \u00fcber die Statik. No tree is a cylinder. Root flares, oval cross-sections, bulges \u2013 the shape determines stability. Einmal umrunden. Die iPhone-Kamera erkennt die nummerierten Schilder an den Messpunkten \u2013 jedes erfasste Schild leuchtet gr\u00fcn. One walk around. The iPhone camera recognises the numbered tags at the measuring points \u2013 every captured tag lights up green. Jeder Messpunkt in 3D. Bis zu 48 Messpunkte, r\u00e4umlich erfasst \u2013 samt GPS-Position und Nordausrichtung. Every measuring point in 3D. Up to 48 measuring points captured in space \u2013 including GPS position and north direction. Bereit f\u00fcr die Tomographie. Export als .pit oder .trt \u2013 oder direkt in eine bestehende Datei einf\u00fcgen. Ready for tomography. Export as .pit or .trt \u2013 or merge straight into an existing file. ScrollenScroll AR-Geometrieerfassung f\u00fcr die Tomographie 3D-Messpunktpositionen in unter 2 Minuten LoGeoS \u2013 der Low Effort Geometry Scanner \u2013 erfasst die 3D-Positionen aller Messpunkte am Stamm per Augmented Reality. Einmal mit dem iPhone um den Baum, und die Geometrie f\u00fcr Ihre Tomographie-Berechnung steht. Demo anfragen &#8211;&gt; LOFOR\u00ae ansehen &#8211;&gt; iOS-App \u00b7 Deutsch &amp; Englisch \u00b7 Export als .pit, .trt und .txt Vorteile Messpunkt Geometrie in &lt; 2 Minuten Die Geometrie der Messpunkte ist die Grundlage jeder Tomographie \u2013 ihre Erfassung gestaltet sich bei gro\u00dfen B\u00e4umen jedoch oft als aufwendig. LoGeoS vereinfacht diesen Schritt erheblich: Nummerierte Schilder an den Messn\u00e4geln gen\u00fcgen \u2013 die LoGeoS App erfasst die Positionen per Kamera und LiDAR automatisch und pr\u00e4zise. Scannen statt messen Die App erkennt jedes nummerierte Schild automatisch und speichert seine Position im Raum. Erkannte Schilder werden gr\u00fcn markiert \u2013 Sie sehen jederzeit, was noch fehlt. Echte 3D-Positionen Erfasst wird die r\u00e4umliche Lage jedes Messnagels \u2013 inklusive Nagell\u00e4nge und Schildposition. F\u00fcr den Export werden die Punkte auf die best-fit Ebene projiziert. Auch bei schwieriger Stammform Wurzelanl\u00e4ufe, W\u00fclste, unrunde Querschnitte: Wo andere Verfahren an ihre Grenzen sto\u00dfen, erfasst die LoGeoS App die tats\u00e4chliche Lage jedes Messpunktes schnell und pr\u00e4zise. Direkt ins Tomographie-Format Export als neue .pit- oder .trt-Datei \u2013 oder die Scandaten direkt in eine vorhandene Datei einf\u00fcgen. Die urspr\u00fcngliche Dateistruktur bleibt erhalten. GPS und Nordrichtung inklusive Beim Anlegen eines Projekts wird der Standort automatisch gespeichert, der nach Norden weisende Messpunkt per Kompass bestimmt. Alle B\u00e4ume finden Sie auf der Karte wieder. Flexibel bis 48 Messpunkte Von einem bis 48 Messpunkten pro Baum. Die H\u00f6he der Messebene geben Sie ein \u2013 oder lassen sie \u00fcber ein Bodenschild direkt aus dem Scan berechnen. Ablauf In vier Schritten zur Geometrie 01 Projekt anlegen Baumnummer eingeben, Anzahl der Messpunkte w\u00e4hlen. GPS-Position und Datum werden automatisch gespeichert. 02 Schilder anbringen Die nummerierten Schilder an den Messn\u00e4geln befestigen. Nagell\u00e4nge und Befestigungsart (mittig oder oben) legen Sie im Projekt fest. 03 Scannen Mit dem iPhone in 20\u201350 cm Abstand langsam um den Stamm gehen. Jedes erkannte Schild leuchtet gr\u00fcn \u2013 sind alle erfasst, auf \u201eFertig\u201c tippen. 04 Pr\u00fcfen &amp; exportieren Ergebnis in Draufsicht, Ebenenprojektion oder 3D kontrollieren, Abst\u00e4nde nachmessen und als .pit-, .trt- oder .txt-Datei exportieren. Einmal rund um den Baum \u2013 so einfach ist der Scan. DIE APP Alles im Blick. Direkt am Baum. Noch vor Ort sehen Sie, ob die Geometrie stimmt \u2013 und korrigieren, bevor Sie zum n\u00e4chsten Baum gehen. \u2014&nbsp;&nbsp;Drei Ansichten: Draufsicht, Ebenenprojektion und drehbare 3D-Ansicht\u2014&nbsp;&nbsp;Abst\u00e4nde messen: 3D-Distanz zwischen zwei beliebigen Messpunkten per Fingertipp\u2014&nbsp;&nbsp;Kantenabst\u00e4nde: Abst\u00e4nde benachbarter Messpunkte auf einen Blick\u2014&nbsp;&nbsp;Rindenumriss: ungef\u00e4hre Rindenkontur aus den Schildpositionen\u2014&nbsp;&nbsp;Karte: alle B\u00e4ume mit Baumnummer, auch als Satellitenansicht\u2014&nbsp;&nbsp;Ersatzschilder: verlorene Schilder einfach neu zuordnen AR-Scan: Schilder werden erkannt 3D-Ansicht mit Abst\u00e4nden Im Feld Gemacht f\u00fcr den Alltag am Baum FAQ H\u00e4ufige Fragen zu LoGeoS Welche Dateiformate kann LoGeoS exportieren? LoGeoS exportiert die Scandaten als .pit- oder .trt-Datei. Sie k\u00f6nnen eine neue Datei erstellen oder die Daten in eine vorhandene .pit- bzw. .trt-Datei einf\u00fcgen \u2013 deren Struktur bleibt dabei erhalten. Exportierte Dateien teilen Sie \u00fcber das iOS-Teilen-Men\u00fc. Wie viele Messpunkte sind m\u00f6glich? Pro Baum lassen sich 1 bis 48 Messpunkte anlegen. Zus\u00e4tzlich kann ein Schild mit h\u00f6herer Nummer als Bodenschild dienen, um die H\u00f6he der Messebene automatisch zu bestimmen. Worauf muss ich beim Scannen achten? Bewegen Sie das iPhone langsam und gleichm\u00e4\u00dfig in etwa 20\u201350 cm Abstand zu den Schildern. Der Scanner braucht ausreichend Licht \u2013 bei Dunkelheit funktioniert er nicht. Spiegelungen und Blendung auf den Schildern sollten Sie vermeiden. Was passiert, wenn ein Schild verloren geht? Kein Problem: In den Einstellungen ordnen Sie einfach ein Ersatzschild mit h\u00f6herer Nummer dem verlorenen Schild zu. Bis zu drei solcher Zuordnungen sind m\u00f6glich, sie gelten f\u00fcr alle Projekte. Kann ich einen Scan wiederholen oder nachbearbeiten? Ja. Ein neuer Scan ist jederzeit m\u00f6glich und ersetzt die vorherigen Daten. Nagell\u00e4ngen, Schildpositionen, Messebenenh\u00f6he und Projektfotos lassen sich im Projekteditor auch nachtr\u00e4glich anpassen \u2013 global oder f\u00fcr einzelne N\u00e4gel. Wie verl\u00e4sslich sind die Ergebnisse? Die Genauigkeit h\u00e4ngt von Lichtverh\u00e4ltnissen, Ger\u00e4t und sorgf\u00e4ltiger Bedienung ab. Mit der Ebenenprojektion, den Kantenabst\u00e4nden und dem Messwerkzeug k\u00f6nnen Sie das Ergebnis direkt am Baum pr\u00fcfen \u2013 kritische Ma\u00dfe sollten Sie wie gewohnt unabh\u00e4ngig kontrollieren. Kontakt LoGeoS ausprobieren Sie arbeiten mit Schalltomographie und m\u00f6chten die Geometrieerfassung beschleunigen? Wir zeigen Ihnen LoGeoS gern im Einsatz und beantworten Ihre Fragen. Kontakt aufnehmen &#8211;&gt; Auch interessant LOFOR\u00ae \u2013 Laser Deflektometer Biegelinie, Torsion und Wurzeltellerneigung unter Last \u2013 f\u00fcr Zugversuch und Windreaktionsmessung. Zu LOFOR\u00ae &#8211;&gt;<\/p>","protected":false},"author":1,"featured_media":953,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-974","page","type-page","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>LoGeoS \u2013 Messpunkt-Geometrie f\u00fcr die Tomographie - Tree Inspection Technologies<\/title>\n<meta name=\"description\" content=\"Bis zu 48 Messpunkte per AR-Scan mit dem iPhone erfassen \u2013 Export f\u00fcr die Tomographie. Ohne Ma\u00dfband, direkt am Baum.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/tree-inspection-technologies.de\/englisch\/logeos\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"LoGeoS \u2013 Messpunkt-Geometrie f\u00fcr die Tomographie - Tree Inspection Technologies\" \/>\n<meta property=\"og:description\" content=\"Bis zu 48 Messpunkte per AR-Scan mit dem iPhone erfassen \u2013 Export f\u00fcr die Tomographie. Ohne Ma\u00dfband, direkt am Baum.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/tree-inspection-technologies.de\/englisch\/logeos\/\" \/>\n<meta property=\"og:site_name\" content=\"Tree Inspection Technologies\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-16T19:14:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-komplexe-stammgeometrie-1024x768.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"768\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":[\"WebPage\",\"ItemPage\"],\"@id\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/logeos\\\/\",\"url\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/logeos\\\/\",\"name\":\"LoGeoS \u2013 Messpunkt-Geometrie f\u00fcr die Tomographie - Tree Inspection Technologies\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/logeos\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/logeos\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/logeos-messpunkte-komplexe-stammgeometrie.jpg\",\"datePublished\":\"2026-10-01T13:54:12+00:00\",\"dateModified\":\"2026-10-16T19:14:56+00:00\",\"description\":\"Bis zu 48 Messpunkte per AR-Scan mit dem iPhone erfassen \u2013 Export f\u00fcr die Tomographie. Ohne Ma\u00dfband, direkt am Baum.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/logeos\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/tree-inspection-technologies.de\\\/logeos\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/logeos\\\/#primaryimage\",\"url\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/logeos-messpunkte-komplexe-stammgeometrie.jpg\",\"contentUrl\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/logeos-messpunkte-komplexe-stammgeometrie.jpg\",\"width\":2200,\"height\":1650,\"caption\":\"LoGeoS-Messpunkte an einem Baum mit unregelm\u00e4\u00dfiger Stammgeometrie\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/logeos\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Start\",\"item\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"LoGeoS\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/#website\",\"url\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/\",\"name\":\"tree-inspection-technologies.de\",\"description\":\"Tree Inspection Technologies \u2013 Messtechnik f\u00fcr die Baumdiagnostik: LOFOR\u00ae Laser Deflektometer und LoGeoS Geometry Scanner\",\"publisher\":{\"@id\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/#organization\",\"name\":\"Tree Inspection Technologies\",\"url\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/website_logo.webp\",\"contentUrl\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/website_logo.webp\",\"width\":350,\"height\":100,\"caption\":\"Tree Inspection Technologies\"},\"image\":{\"@id\":\"https:\\\/\\\/tree-inspection-technologies.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/de.linkedin.com\\\/in\\\/lothar-g\u00f6cke-76034112?trk=public_post_feed-actor-name\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"LoGeoS \u2013 Messpunkt-Geometrie f\u00fcr die Tomographie - Tree Inspection Technologies","description":"Bis zu 48 Messpunkte per AR-Scan mit dem iPhone erfassen \u2013 Export f\u00fcr die Tomographie. Ohne Ma\u00dfband, direkt am Baum.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/tree-inspection-technologies.de\/englisch\/logeos\/","og_locale":"en_GB","og_type":"article","og_title":"LoGeoS \u2013 Messpunkt-Geometrie f\u00fcr die Tomographie - Tree Inspection Technologies","og_description":"Bis zu 48 Messpunkte per AR-Scan mit dem iPhone erfassen \u2013 Export f\u00fcr die Tomographie. Ohne Ma\u00dfband, direkt am Baum.","og_url":"https:\/\/tree-inspection-technologies.de\/englisch\/logeos\/","og_site_name":"Tree Inspection Technologies","article_modified_time":"2026-10-16T19:14:56+00:00","og_image":[{"width":1024,"height":768,"url":"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-komplexe-stammgeometrie-1024x768.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Estimated reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["WebPage","ItemPage"],"@id":"https:\/\/tree-inspection-technologies.de\/logeos\/","url":"https:\/\/tree-inspection-technologies.de\/logeos\/","name":"LoGeoS \u2013 Messpunkt-Geometrie f\u00fcr die Tomographie - Tree Inspection Technologies","isPartOf":{"@id":"https:\/\/tree-inspection-technologies.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/tree-inspection-technologies.de\/logeos\/#primaryimage"},"image":{"@id":"https:\/\/tree-inspection-technologies.de\/logeos\/#primaryimage"},"thumbnailUrl":"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-komplexe-stammgeometrie.jpg","datePublished":"2026-10-01T13:54:12+00:00","dateModified":"2026-10-16T19:14:56+00:00","description":"Bis zu 48 Messpunkte per AR-Scan mit dem iPhone erfassen \u2013 Export f\u00fcr die Tomographie. Ohne Ma\u00dfband, direkt am Baum.","breadcrumb":{"@id":"https:\/\/tree-inspection-technologies.de\/logeos\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/tree-inspection-technologies.de\/logeos\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/tree-inspection-technologies.de\/logeos\/#primaryimage","url":"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-komplexe-stammgeometrie.jpg","contentUrl":"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/logeos-messpunkte-komplexe-stammgeometrie.jpg","width":2200,"height":1650,"caption":"LoGeoS-Messpunkte an einem Baum mit unregelm\u00e4\u00dfiger Stammgeometrie"},{"@type":"BreadcrumbList","@id":"https:\/\/tree-inspection-technologies.de\/logeos\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Start","item":"https:\/\/tree-inspection-technologies.de\/"},{"@type":"ListItem","position":2,"name":"LoGeoS"}]},{"@type":"WebSite","@id":"https:\/\/tree-inspection-technologies.de\/#website","url":"https:\/\/tree-inspection-technologies.de\/","name":"tree-inspection-technologies.de","description":"Tree Inspection Technologies \u2013 Messtechnik f\u00fcr die Baumdiagnostik: LOFOR\u00ae Laser Deflektometer und LoGeoS Geometry Scanner","publisher":{"@id":"https:\/\/tree-inspection-technologies.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/tree-inspection-technologies.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/tree-inspection-technologies.de\/#organization","name":"Tree Inspection Technologies","url":"https:\/\/tree-inspection-technologies.de\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/tree-inspection-technologies.de\/#\/schema\/logo\/image\/","url":"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/website_logo.webp","contentUrl":"https:\/\/tree-inspection-technologies.de\/wp-content\/uploads\/2026\/10\/website_logo.webp","width":350,"height":100,"caption":"Tree Inspection Technologies"},"image":{"@id":"https:\/\/tree-inspection-technologies.de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/de.linkedin.com\/in\/lothar-g\u00f6cke-76034112?trk=public_post_feed-actor-name"]}]}},"_links":{"self":[{"href":"https:\/\/tree-inspection-technologies.de\/englisch\/wp-json\/wp\/v2\/pages\/974","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tree-inspection-technologies.de\/englisch\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tree-inspection-technologies.de\/englisch\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tree-inspection-technologies.de\/englisch\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tree-inspection-technologies.de\/englisch\/wp-json\/wp\/v2\/comments?post=974"}],"version-history":[{"count":10,"href":"https:\/\/tree-inspection-technologies.de\/englisch\/wp-json\/wp\/v2\/pages\/974\/revisions"}],"predecessor-version":[{"id":1037,"href":"https:\/\/tree-inspection-technologies.de\/englisch\/wp-json\/wp\/v2\/pages\/974\/revisions\/1037"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tree-inspection-technologies.de\/englisch\/wp-json\/wp\/v2\/media\/953"}],"wp:attachment":[{"href":"https:\/\/tree-inspection-technologies.de\/englisch\/wp-json\/wp\/v2\/media?parent=974"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}