Mehr

Gebäude mit fehlender Textur in einer aus ArcScene exportierten 3D-Webszene

Gebäude mit fehlender Textur in einer aus ArcScene exportierten 3D-Webszene


Einer zufälligen Stichprobe von Gebäuden fehlen Texturen. Die Modelle wurden in Sketchup 8 erstellt und nach COLLADA exportiert und dann in ArcScene abgelegt. Alle Texturen sind .jpg">3d arcscene cityengine web-scene exportieren

Sonderausgabe "Fernerkundung basierende Gebäudeextraktion"

Eine Sonderausgabe von Fernerkundung (ISSN 2072-4292). Dieses Sonderheft gehört zur Rubrik "Urbane Fernerkundung".

Deadline für Manuskripteinreichungen: geschlossen (31. Oktober 2019) .

Gedruckte Ausgabe verfügbar!
Eine gedruckte Ausgabe dieser Sonderausgabe finden Sie hier.


1 Antwort 1

Was in der Frage beschrieben wird, ist wahrscheinlich auf fehlende UV-Daten im Modell zurückzuführen (oder alle UVs auf Null gesetzt).

Um es zu lösen, laden Sie das Originalmodell in Blender und fügen Sie eine UV-Map hinzu. Sie müssen das Modell wahrscheinlich auspacken und möglicherweise einige UVs nach dem Auspacken manuell anpassen.

Es reicht nicht aus, die Modelltextur in Blender zu sehen, Blender kann Texturen auf Meshes ohne UVs abbilden, aber das wird nicht in die meisten Game-Engines (wenn nicht alle) exportiert.

Der Benutzer, der die Frage stellt, weiß bereits, was folgt, aber ich füge es der Antwort hinzu, um eine vollständigere Antwort zu erhalten

Ein Modell auspacken

Es wird empfohlen, eine geteilte Ansicht zu verwenden, wobei der UV-Editor in einer der Ansichten sichtbar ist. So teilen Sie Ansichten in Blender: https://www.youtube.com/watch?v=rhh513vUgME

Arbeiten Sie dann in der Ansicht mit dem Modell, wählen Sie das Modell aus, rufen Sie den Bearbeitungsmodus auf, drücken Sie U, klicken Sie im angezeigten Kontextmenü auf Unwrap oder einen der Unwrapping-Algorithmen, die Blender anbietet (versuchen Sie, den Umfang der manuellen Bearbeitung der UVs zu minimieren, die Sie nach dem Auspacken tun müssen, wenn möglich auf Null).

Überprüfen Sie im UV-Map-Editor, ob mit den UVs alles in Ordnung ist, und beheben Sie, was Sie sehen, ist falsch. Dies ist künstlerische Arbeit und Intuition spielt eine grundlegende Rolle.

Gehen Sie nun zum Textur-Panel und überprüfen Sie, ob Sie die UV-Map und keine generierten Koordinaten verwenden.

Schließlich exportieren Sie Ihr Modell, wahrscheinlich ist FBX die beste verfügbare Option, wenn Sie mit Blender und Unity arbeiten. Oder lassen Sie Unity die Blend-Datei verarbeiten (ich halte meine Blend-Dateien vom Unity-Assets-Verzeichnis fern, lange Geschichte, und platziere dort nur den FBX-Export. Dies ist kein Standardverfahren oder so, nur meine persönliche Präferenz).

Bei dieser Frage bedeutet die Verwendung eines externen Materials wahrscheinlich, dass das Material bereits konfiguriert ist, um die UV-Daten aus dem Modell zu verwenden. Daher hat der Schritt, die Eigenschaften des Texturfensters in Blender zu ändern, möglicherweise überhaupt keine Auswirkungen. Wenn Sie sowohl Ihre eigenen Modelle als auch Materialien erstellen, müssen Sie wahrscheinlich das Texturfenster in Blender überprüfen.


2 Antworten 2

Dazu können Sie den Fluchtpunktfilter von Photoshop verwenden.

Am einfachsten ist es, eine 3D-fähige Version von Photoshop zu verwenden, die Sie vermutlich haben, da Sie keine andere 3D-Software erwähnt haben. Es gibt einen alternativen Pfad für diejenigen, die eine Version von Photoshop verwenden, der die 3D-Funktionen fehlen, die ich unten inline behandeln werde.

Diese Technik funktioniert am besten mit einem geradlinigen Foto, also einem ohne Verzerrung. Die Verzerrung macht es Photoshop unmöglich, eine 3D-Geometrie zu erstellen, die genau an den Merkmalen des Fotos ausgerichtet ist. Sie können die von Photoshop erstellte Geometrie manuell bearbeiten, um ein ungenau Modell passend zu Ihrem ungenauen Foto, aber das ist ein vermeidbarer Ärger.

Der beste Weg, um ein geradliniges Foto zu erhalten, besteht darin, ein Objektiv mit geringer Verzerrung zu verwenden, um das Bild aufzunehmen. Die DxO-Objektivdatenbank kann Ihnen bei der Auswahl helfen. Darüber hinaus sollten Sie ein Objektiv verwenden, das von der Objektivkorrekturfunktion von Lightroom oder ACR unterstützt wird, und dann diese automatische Korrektur für Ihr Foto verwenden, bevor Sie versuchen, daraus ein 3D-Modell zu erstellen.

So gehen Sie vor:

Öffnen Sie Ihr Foto in Photoshop und sagen Sie Filter &rarr Fluchtpunkt. Zeichnen Sie mit dem Werkzeug Ebene erstellen eine Box um die Sitzfläche der beiden vollständig sichtbaren Kissen.

Sie müssen ziemlich genau sein, wie Sie diese Ebene erstellen, da sich alle Fehler hier auf den Rest des 3D-Modells übertragen. Photoshop hilft Ihnen dabei: Das Raster innerhalb der Ebene ändert ihre Farbe, um anzuzeigen, wie plausibel die Ebene ist. Sie möchten ein blaues Gitter sehen, nicht gelb oder rot. Ein blaues Gitter garantiert jedoch nicht, dass es für Ihre Szene richtig ist, sondern nur, dass es könnte sein Korrekt.

Halten Sie die Befehlstaste (Mac) oder die Strg-Taste (Windows) gedrückt und ziehen Sie vom Größenänderungsfeld an der Vorderkante dieser Ebene nach unten, um eine neue vertikale Ebene über der Vorderkante dieser entfernten Kissen abzulegen.

Wiederholen Sie nun diese Cmd/Strg-Ziehen-Bewegung noch 4 Mal, um die Ebenen zu erstellen, die das der Kamera am nächsten liegende Kissen bedecken: zuerst eine vertikale, um die verborgene Vorderseite des Kissens abzudecken, dann eine horizontale, die den Sitzbereich bedeckt, dann zwei weitere vertikale diejenigen, um die der Kamera zugewandten Seiten abzudecken.

Verlängern Sie schließlich die erste Ebene, um die Sitzfläche des Inneneckkissens abzudecken.

Größe dieser Ebenen so, dass sie die gesamte sichtbare Fläche abdecken, auch wenn dafür einige Bereiche des Fotos abgedeckt werden müssen, die nicht Teil der Kissen sind:²

Wir werden die Flugzeugabdeckung später anpassen.

Wenn Sie feststellen, dass sich die neuen mit zunehmender Entfernung von der ersten Ebene immer schlechter an den Sofaoberflächen ausrichten, liegt die wahrscheinlichste Ursache darin, dass Sie die erste Ebene nicht genau auf die Sitzfläche des Kissens ausgerichtet haben. Wenn Sie aus dieser falsch ausgerichteten Ebene herausragen, vergrößern Sie diesen Fehler. Die beste Lösung dafür besteht darin, alle außer der ersten Ebene zu löschen und dann ihre Ecken ein wenig zu optimieren, damit sie besser zur Szene passt. Wenn Sie diese anderen 5 Ebenen erneut erweitern, sollten sie jetzt genauer mit der Szene übereinstimmen.

Eine weitere wahrscheinliche Ursache ist, dass Sie den obigen Ratschlag ignoriert haben, mit einem geradlinigen Foto zu beginnen.

Teilen Sie dem Fluchtpunktfilter mit, dass er eine 3D-Ebene an Photoshop zurückgeben soll:

Wenn in Ihrer Photoshop-Version diese Funktion fehlt, bleiben Sie vorerst im Fluchtpunktfilter. Wir werden den nächsten Schritt etwas anders machen, um diesen Mangel an direkter 3D-Unterstützung zu umgehen.

Sagen Sie andernfalls OK, und Sie erhalten eine neue 3D-Ebene mit einem primitiven Modell der von Ihnen skizzierten Sofaoberflächen.

Das beantwortet so ziemlich deine ursprüngliche Frage. Ja, es sind nur 6 Oberflächen in 3D, nicht gerade ein detailliertes Modell, aber wie Sie sehen werden, reicht es für einige Zwecke aus.

Was wir als Nächstes tun werden, ähnelt dem Camera Mapping, einer Technik, die häufig in VFX verwendet wird, um schnelle 3D-Effekte in einer 2D-Szene zu erzielen, ohne vollständig in 3D zu gehen. Anstatt ein Foto auf eine grobe 3D-Geometrie zu projizieren, verwenden wir unsere grobe 3D-Geometrie, um die Projektion von Texturen zurück auf das Foto zu unterstützen.

Wenn Sie die 3D-Ebene aus dem Fluchtpunktfilter-Dialog an Photoshop zurückgeben, werden Sie möglicherweise gefragt, ob Sie zum 3D-Arbeitsbereich springen möchten³, um das Angebot anzunehmen.

Wenn Sie nach den Maßeinheiten für die neue Ebene gefragt werden, können Sie genaue Werte eingeben, wenn Sie damit zufrieden sind, aber dies hat keinen Einfluss auf die Ergebnisse, soweit diese Antwort geht. Dies ist nur von Bedeutung, wenn Sie die 3D-Ebene in ein anderes Programm exportieren und die neue Geometrie an den Maßstab einer größeren Szene anpassen müssen.

Sie sehen nun Ihr primitives 3D-Modell über dem Basisfoto. Photoshop wird versuchen, Texturen aus dem Basisfoto für dieses Modell zu extrahieren, aber machen Sie sich keine Sorgen darüber, wir verwenden die Malwerkzeuge von Photoshop, um diese 3D-Oberflächen stattdessen mit der gewünschten Textur zu füllen.⁴

Hier habe ich den Musterpinsel mit einem knalligen Muster verwendet, damit man den Effekt gut sehen kann. Füllen Sie zunächst alle Oberflächen mit Ihrer Textur:

Beachten Sie, dass sich das Muster in der richtigen Perspektive befindet und in die Ferne schrumpft. Dies geschieht, weil wir auf eine 3D-Oberfläche malen, die der groben Geometrie unserer 2D-Szene entspricht.

Wenn Sie eine Version verwenden, der diese Fähigkeit zum Erstellen eines 3D-Objekts aus Fluchtpunktebenen fehlt, können Sie das Stempelwerkzeug im Dialogfeld Fluchtpunkt verwenden, um flache Texturen auf die Ebenen zu kopieren. Dies hat den gleichen Effekt wie beim Malen auf ein 3D-Modell, bei dem Ihre Textur in der richtigen Perspektive auf die Szene angewendet wird.

Fügen Sie der 3D-Ebene eine schwarze Ebenenmaske hinzu, indem Sie bei gedrückter Wahl-/Alt-Taste auf das Maskensymbol der Ebene klicken und dann weiß über die Bereiche malen, in denen das Muster angezeigt werden soll:

Wie Sie sehen, habe ich hier einen sehr groben Job gemacht. Ich habe die Maske absichtlich etwas größer als nötig gemacht, mit einem großen Pinsel mit harten Kanten und großen, schlampigen Strichen. Wenn dies länger als 30 Sekunden dauert, verschwenden Sie Zeit. Wir werden die Maske im nächsten Schritt mit etwas Detailarbeit zurückdrängen.

Verringern Sie die Deckkraft der Ebene auf etwa 50 %, damit Sie das darunterliegende Foto gut genug sehen können, um die Polsterkanten zu sehen, und verfeinern Sie dann die Kanten Ihrer Maske sorgfältig, um nur die Teile des 3D-Modells abzudecken, die das Muster zeigen möchten.

Profi-Tipp: Ein einzelner Klick mit einem Photoshop-Pinsel gefolgt von einem Umschalt-Klick an einer anderen Stelle gibt Ihnen einen schönen geraden Strich, den Sie nicht einfach von Hand duplizieren können. Hier können Sie mit einem Pinsel mit harten Kanten auf die Ebenenmaske in der Nähe einer Ecke eines Kissens klicken, sodass der Pinsel die Kissenkante gerade noch berührt, und dann bei gedrückter Umschalttaste im gleichen Abstand von der anderen Ecke entlang dieser Kante des Kissens klicken . Auf diese Weise können Sie die Auslenkungen der Maske über die geraden Kanten hinaus schnell und präzise wegschneiden.

Erhöhen Sie die Deckkraft der 3D-Ebene auf 90-100% und stellen Sie den Mischmodus auf einen geeigneten Wert um. Für diese Kombination aus Textur und Hintergrundfoto funktioniert Linear Burn gut:

Voilà, elektronische Polsterung!

Nun, diese Technik ist nicht perfekt. Das Modell besteht nur aus wenigen Ebenen, sodass sich die darauf gemalten Texturen nicht genau um die Kurven des Sofas biegen. Wie Sie im obigen Bild sehen können, kann diese Einschränkung für einige praktische Zwecke keine Rolle spielen. Die Schatten des Fotos vermischen sich mit der Textur, um die Illusion zu erwecken, dass sich die Textur fest um die Sofaoberfläche legt, obwohl dies wirklich nicht der Fall ist.

Eine schnelle Möglichkeit, dies bei Bedarf zu beheben, besteht darin, die Texturen mit den Filtern Verflüssigen und Warp ein wenig zu biegen, um den Konturen zu folgen.

Wenn Sie wirklich ein genaues Modell oder eine 2D-UV-Map-Datei benötigen, um automatisierte Texturersetzungen durchzuführen, haben Sie mehrere Möglichkeiten:

Gehen Sie die Schritte 1 und 2 oben durch. Anstatt die Option "3D-Ebene zu Photoshop zurückgeben" aus dem Flyout-Menü auszuwählen, weisen Sie Photoshop dann an, nach 3DS zu exportieren.

Dadurch erhalten Sie eine 3ds Max-Datei, die auch viele andere 3D-Anwendungen öffnen können. Dieses Format wird weit genug verwendet, sodass Sie in der Regel originalgetreue Importe in andere Programme als 3ds Max durchführen können, insbesondere für so einfache Geometrie wie die hier erstellte.

In Photoshop CS4 Extended oder höher können Sie mit Schritt 3 oben fortfahren, um die 3D-Ebene aus dem Dialogfeld "Fluchtpunktfilter" an Photoshop zurückzugeben, und sagen Sie dann 3D &rarr 3D-Ebene exportieren.

Seltsamerweise gehört das 3ds Max-Format hier nicht zu Ihren Wahlmöglichkeiten. Von denen, die Photoshop bietet, empfehle ich Wavefront OBJ. Es ist ungefähr so ​​weit kompatibel wie *.3ds . Viele 3D-Programme öffnen beide, während andere nur das eine oder das andere öffnen.

COLLADA ist ein offener Standard, daher sollte es theoretisch die beste Option sein, aber ich finde, dass Importeure häufig die Geometrie verstümmeln.⁶ Trotzdem sollten Sie es versuchen, wenn die Optionen *.3ds und *.obj nicht funktionieren Sie.

Photoshop kann auch in STL und DXF exportieren, die zwar weithin unterstützt, aber für diese Art von Arbeit ungeeignet sind. Es sind reale CAD-Formate, keine kreativen Bildformate. Sie könnten sie bei der Herstellung von echten Sofas verwenden.

Alle anderen Optionen sind "Standards" im Sinne von XKCD. Vermeide sie.

Jetzt müssen Sie diese Modelldatei "nur" in einem echten 3D-Modellierer öffnen und verfeinern. Mit einem voll ausgestatteten 3D-Paket können Sie bei Bedarf auch direkt mit der UV-Karte arbeiten.

Dies führt uns jedoch weit außerhalb des Rahmens dieser Site. Auch wenn 3D-Modellierung hier ein Thema wäre, müsste ich, um noch viel weiter zu gehen, im Grunde die Frage beantworten: "Wie macht man 3D-Modellierung?" Dieses Thema braucht ganze Bücher, um es zu erklären. Sie benötigen monatelange Praxis, um Kompetenz zu erwerben, und etwa 10.000 Stunden fokussierte, kompetenzaufbauende Praxis, um ein gewisses Maß an Fachwissen zu erreichen. Diese Fertigkeit ist selten genug, schwierig genug und wertvoll genug, um ihren Lebensunterhalt damit zu verdienen.

Sobald Sie ein detailliertes 3D-Modell haben, können Sie es bei Bedarf wieder in Photoshop importieren. Photoshop ist ein ziemlich gutes Werkzeug zum Malen von 3D-Texturen. Es gibt auch spezielle Tools wie MARI, 3D-Coat und BodyPaint 3D. High-End-3D-Pakete enthalten oft Textur-Painting-Funktionen, die Photoshop in ihrem spezielleren Anwendungsbereich konkurrieren oder übertreffen: CINEMA 4D, modo, Blender usw.

Wenn Sie die vollständige Creative Cloud abonniert haben, haben Sie bereits CINEMA 4D Lite, eine abgespeckte, aber recht funktionale Version von C4D, die jetzt BodyPaint enthält, eine Funktion, die früher nur in den Nicht-Lite-Versionen verfügbar war. Sie können sich BodyPaint als reine 3D-Alternative zu Photoshop vorstellen, mit der Sie direkt auf Modelle malen können, wie wir es oben getan haben. Die wichtigste praktische Einschränkung besteht darin, dass Sie es über After Effects verwenden müssen, was umständlich ist, wenn Sie AE nicht bereits für Ihr Projekt verwendet haben. Auf der positiven Seite können Sie direkt vom Fluchtpunktfilter zu AE gelangen:

Dies bedeutet CS3 Extended bis CS6 Extended oder eine der Creative Cloud-Versionen. Ich habe diese Technik in CS3 Extended und in CC 2014.2 getestet.

Sie sehen blaue Gitter anstelle von einfarbigen nummerierten Ebenen. Ich habe die Flugzeuge koloriert und nummeriert, um das Beispiel klarer zu machen.

Wenn Sie nach dem gelben dritten Flugzeug suchen, zeigt es von der Kamera weg. Wir mussten es nur konstruieren, um die L-Form des Sofas um die Ecke zu bekommen.

Alle 3D-fähigen Versionen von Photoshop verfügen über die Funktion Arbeitsbereiche, aber frühere Versionen haben diesen automatischen Wechsel des Arbeitsbereichsmodus nicht durchgeführt. Der 3D-Arbeitsbereich wurde Photoshop erst in CS4 hinzugefügt. Auch Versionen, die anbieten, Sie in den 3D-Arbeitsbereich zu wechseln, können angewiesen werden, sich die Auswahl zu merken, sodass sie einfach den Arbeitsbereich wechseln können, ohne zu fragen.

Genau genommen erhalten Sie damit nicht die gewünschte UV-Karte, aber in den meisten Fällen ist die direkte Modellbemalung das, was Sie wirklich wollen. Wenn Sie wirklich eine separate UV-Map-Datei benötigen, müssen Sie das 3D-Modell von Photoshop wie oben beschrieben in eine andere Anwendung exportieren.

Texturmalerei funktioniert in Photoshop CS3 Extended anders. CS4 fügte die Möglichkeit hinzu, direkt auf dem Modell zu malen, während Sie in CS3 jede Textur einzeln öffnen und bearbeiten müssen. Für diese Technik ist der Unterschied wirklich egal.

Der Mischmodus Multiplizieren kann auch für diese Art von Kombination gut funktionieren. Andere Texturen und Basisfotos erfordern möglicherweise einen anderen Mischmodus.

Dies liegt wahrscheinlich daran, dass COLLADA nicht von einem der großen 3D-Softwarehersteller unterstützt wird und daher nicht die Marktmacht hat, um zu definieren, was der Standard in der realen Welt bedeutet. Da es sich um einen offenen Standard handelt, hat jedes Unternehmen, das ihn implementiert, seine eigene inkompatible Sichtweise darauf.


LandInfra (und InfraGML) in Theorie und Praxis

LandInfra ist ein relativ junger Standard, und es ist derzeit schwierig, konkrete Beispiele für seine Anwendung in der Praxis zu finden. Die meisten wissenschaftlichen Artikel, in denen LandInfra erwähnt wird, beschreiben nur die Notwendigkeit, ihn in zukünftigen Arbeiten zu berücksichtigen.

Es gibt viele Veröffentlichungen, die die Beziehung zwischen LandInfra und dem ISO 19152 Land Administration Domain Model (LADM) diskutieren, siehe zum Beispiel [15, 33, 34, 42, 66, 67, 78]. In diesen Papieren wird InfraGML neben anderen Modellen wie CityGML und LandXML in Bezug auf das Sammeln der vorhandenen 3D-Daten zitiert, die gesammelt werden, um die Möglichkeit zu eröffnen, eine 3D-Katasterdatenbank zu erstellen.

Es gibt mehrere Papiere, die die Integration von LandInfra in spezifischen Anwendungsfällen diskutieren. Karaet al. [34] bewerteten die Verwendung mehrerer verschiedener Modelle, um ein Bewertungsinformationsmodell für Grundsteuern bereitzustellen. Pouliotet al. [68] verglichen Schema-Matching zwischen Benutzerbedürfnissen und drei raumbezogenen Standards (CityGML UtilityNetwork ADE, InfraGML und IFC) in Bezug auf die Modellierung von unterirdischen Versorgungsnetzen. Sie konnten aufgrund widersprüchlicher Ergebnisse aufgrund unterschiedlicher Schema-Matching-Techniken und der Variation zwischen den verschiedenen Ebenen und der Anzahl der Elemente beim Vergleich eines Schemas mit einem anderen nicht zu einer endgültigen Schlussfolgerung kommen. [69] bewertete LandInfra zusammen mit anderen räumlichen 3D-Informationsmodellen hinsichtlich ihrer Fähigkeit zur Modellierung rechtlicher Interessen und rechtlicher Grenzen, wie sie in der viktorianischen Gerichtsbarkeit in Australien definiert sind. Sie fanden heraus, dass der LandInfra-Ansatz zur Referenzierung von IFC-basierten physischen Elementen verwendet werden kann, um physische Objekte in das viktorianische Modell zu integrieren, aber sie müssten Elemente mehrerer räumlicher 3D-Informationsmodelle für ihr endgültiges Modell integrieren. LandInfra wird auch von der OGC Underground Infrastructure Concept Development Study (CDS) als einer der potenziellen Standards für die Darstellung von Daten über unterirdische Infrastruktur (Versorgungen und andere unterirdische Merkmale) erwähnt, um die Interoperabilität von unterirdischen Infrastrukturdaten zu verbessern [65]. LandInfra betrachtet nasse Infrastruktur und Versorgungsunternehmen in seinem Anwendungsbereich [73], seine möglichen Ausrichtungen mit den CityGML Utility Networks ADE [5] und PipelineML [56] wurden in der Studie hervorgehoben [65].

Es gibt mehrere Papiere, in denen die Integration von LandInfra und InfraGML mit anderen Geodatenstandards diskutiert wird. Wichtige Arbeit in dieser Richtung wird vom Team von geleistet Institut Geographique National (IGN) Frankreich für die Angleichung von CityGML und InfraGML [12, 17]. Ihre Forschung untersuchte den akustischen Prozess und die Eingaben, um zu bestimmen, welche verfügbaren Daten zwischen CityGML und InfraGML am besten für erste akustische Umgebungsstudien geeignet sind [12]. Die Forschung brachte auch mehrere wichtige Punkte zur Sprache, wie die mangelnde Flexibilität für Erweiterungen des konzeptionellen Modells von LandInfra und die Nichtverfügbarkeit von realen InfraGML-Datensätzen in der Praxis. Devys [17] diskutierte die Interoperabilität zwischen dem RailTopoModel [81] und LandInfra für die Eisenbahninfrastruktur und schlug eine Zuordnung zwischen den beiden Modellen vor. Labetskiet al. [39] analysierten die Verwendung von LandInfra als Rahmen für die Erweiterung der Definition der LODs für Straßen im Verkehrsmodul von CityGML, stellten jedoch fest, dass das Fehlen des Konzepts der Detailgenauigkeit in LandInfra es irrelevant machte. [49] schlagen auch vor, LandInfra im Kontext von Straßen zu analysieren, jedoch um Einschränkungen in aktuellen Datenstandards für Straßengüter zu ermitteln und Empfehlungen für einen verbesserten Standard zu erstellen, um SW-Technologien (Semantic Web) anzuwenden, um eine prototypische Lösung für Zusammenführung von Straßengüterdaten. Als sie ihre Analyse fortsetzten, [48] stellten fest, dass die Verwendung von IFC, IFC-Alignment und InfraGML in Betracht gezogen werden sollte, da diese Standards von mehreren industriellen Softwareanwendungen unterstützt werden. Sie schließen mit der Überzeugung, dass anstelle des Versuchs, einen weiteren Standard für Straßengüterinformationen zu entwickeln, eine Untersuchung von Übersetzungsansätzen erfolgen sollte, um die Kommunikation zwischen Standards zu unterstützen [48]. Malmkvist et al. [45] nutzten InfraGML und IFC Alignment für den Informationsaustausch von Straßendaten zwischen der Entwurfs- und Betriebsphase eines Straßenprojekts innerhalb verschiedener Softwaresysteme.


Archäologische Untersuchungen

Archäologische Untersuchungen bieten herausfordernde Möglichkeiten der Gesichtsanalyse, Gesichter aus der Vergangenheit darzustellen, der Öffentlichkeit das Aussehen dieser alten Menschen zu zeigen und einen Vergleich mit zeitgenössischen Gesichtern zu ermöglichen (Prag & Neave, 1997). Sie können im Vergleich zu forensischen Untersuchungen auch andere Arten von Material liefern und der Umfang der künstlerischen Interpretation kann je nach Erhaltungsgrad größer sein. In forensischen Fällen ist es vorzuziehen, nur Details des Aussehens einzubeziehen, die direkt anhand von Tatortbeweisen ermittelt wurden, und keine Unbekannten zu schätzen, da falsch geschätzte Details die Erkennung und Identifizierung verwirren und entmutigen können ( Wilkinson, 2004 ). Bei archäologischen Untersuchungen ist die Erkennung des Gesichts jedoch selten das primäre Ziel und die Herstellung der wahrscheinlichsten Darstellung kann wichtiger sein als die individuelle Identität. In diesen Fällen schlägt der Archäologe die wahrscheinlichste Frisur, Haarfarbe, Hautfarbe und Augenfarbe aus historischen Text- und Bildnachweisen vor.

Die Darstellung konservierter Leichen

Die alten Ägypter haben eine reiche Quelle für Analysen geliefert, da der Mumifizierungsprozess (mit einigen Modifikationen) die Weichteile des Gesichts sowie das Skelettmaterial erhält. Die Entwicklung der klinischen Bildgebung hat die nicht-invasive Analyse des Weich- und Hartgewebes der Gesichter der alten Ägypter ermöglicht. Durch Computertomographie (CT) erstellte Querschnittsdaten können verwendet werden, um ein dreidimensionales digitales Modell des Schädels zu erstellen ( Spoor et al. 2000 ) und Schädelkopien können aus digitalen Daten mittels Stereolithographie hergestellt werden ( Hjalgrim et al. 1995 ) oder eine andere Form der dreidimensionalen Modellherstellung ( Seitz et al. 2005 ). Digitale 3D-Modelle des Schädels können auch in computergestützte Gesichtsrekonstruktionssysteme importiert werden. Beispiele für solche Arbeiten sind die Gesichtsrekonstruktion von Tut Ankh Amun (Gatliff, 2001 Handwerk, 2005), Nesperrenub (Taylor, 2004) und Janus (Tukker & Dassen, 1999).

Oftmals werden bei der Beurteilung mumifizierter Weichteile Details der Gesichtsmorphologie sichtbar, die nicht allein aus dem Skelett bestimmt werden können (Abb. 9A), was die Zuverlässigkeit erhöht und die künstlerische Interpretation der Gesichtsrekonstruktion reduziert. Häufig bleiben die Ohren erhalten und es kann möglich sein, Ohrform, -größe und -details direkt an der Mumie zu bestimmen (Taylor, 2004). Ebenso können der Haaransatz und das Lippenmuster sichtbar sein, Details, die bei vielen Gesichtsrekonstruktionen einer künstlerischen Interpretation bedürfen. Schrumpfung, Verzerrung und die Auswirkungen des Mumifizierungsverfahrens müssen berücksichtigt werden, da diese das Erscheinungsbild der Weichteile beeinträchtigen können: Viele Gesichtszüge werden durch die Bandagen verzerrt, die Nase kann durch die Gehirnentfernung verzerrt und die Augen durch die Obduktion eingesunken sein Veränderungen (Aufderheide, 2003). Zum Beispiel scheint die große Mehrheit der ägyptischen Mumien im Profil Hakennasen aufzuweisen, aber dies ist typischerweise eher eine Bandagenverzerrung als das tatsächliche Profil der Nase, und erfahrene Praktiker werden dieses Phänomen erkennen (Cesarani et al. 2004).

Gesichtsrekonstruktion einer ägyptischen Mumie (A) und Traumadarstellung (B). 12. Dynastie Altägyptischer Priester (A) – die 3D-Nachbildung des Weichgewebes einer ägyptischen Mumie (links), hergestellt durch Stereolithographie aus den CT-Scandaten und der daraus resultierenden Gesichtsrekonstruktion (rechts) – mit freundlicher Genehmigung des National Museum of Scotland. Die Gesichtsrekonstruktion eines Soldaten aus der Sammlung Towton Battle 1996 (B) an der University of Bradford mit einer verheilten Schwertwunde am Unterkiefer (links). Rechts ist das verheilte Skeletttrauma zu sehen – mit freundlicher Genehmigung der University of Bradford.

Das Gesicht von Moorkörpern ist seit den frühesten Entdeckungen von großem Interesse, da die Weichteile durch die Säure der Torfmoorumgebung erhalten bleiben (Asingh & Lynnerup, 2007). Dies kann zu einer unglaublichen Erhaltung der Gesichter von Moorleichen führen, obwohl es aufgrund des Drucks der Bestattungsumgebung zu schweren Verzerrungen kommen kann. Bei einer Verzerrung des Weichgewebes kann es schwierig sein, Gesichtszüge und Proportionen zu visualisieren, und unter diesen Umständen wurde eine Gesichtsrekonstruktion verwendet (Prag & Neave, 1997, Kap. 8, Bergen et al. 2002). Die CT-Bildgebung ermöglicht die Visualisierung des Schädels, aber die sauren Bedingungen des Torfmoores führen zu einer Verschlechterung der Knochenoberfläche, was in Kombination mit jeglicher Verzerrung die Beurteilung des Skeletts für die Gesichtsrekonstruktion erschwert. Der Mangel an Skelettdetails wird jedoch durch die enorme Menge an erhaltener Gesichtsmorphologie mehr als ausgeglichen, und die Gesichtsrekonstruktion von Moorkörpern wird hauptsächlich aus den Informationen des Weichgewebematerials erfolgen ( Wilkinson, 2007 ). Wie bei Mumien werden die Ohren oft erhalten und es kann möglich sein, Ohrform, -größe, -vorsprung und -detail direkt zu bestimmen. Ebenso können die zinnoberroten Linien, die Haarlinien und die Gesichtsfaltenmuster sichtbar sein, Details, die bei vielen Gesichtsrekonstruktionen einer künstlerischen Interpretation bedürfen (Wilkinson, 2009). Grauballe Man und Clonycavan Man sind Beispiele für solche Arbeiten (Wilkinson, 2007, 2009). Neben den Details der Gesichtsmorphologie weisen Moorkörper oft zusätzliche Informationen zu Frisur, Haarfarbe und Gesichtsbehaarung auf ( Wilkinson, 2009 ), was die künstlerische Interpretation der Rekonstruktion weiter verringert und ihre Zuverlässigkeit erhöht.

Die Darstellung von Krankheit und Trauma

Archäologische Fälle können eine Herausforderung darstellen, da die Skelettreste bestimmte pathologische Zustände, Gesichtsdeformitäten oder Gesichtswunden aufweisen können. Wo dies offensichtlich ist, kann die Technik der Gesichtsrekonstruktion ein wertvolles Instrument sein, um das Erscheinungsbild des Gesichts in Bezug auf medizinische Behandlungen, alte Krankheitsprozesse und erbliche Erkrankungen zu bestimmen. Bei peri-mortem Gesichtstraumata ist es in der Regel unangemessen, dass die Rekonstruktion entstandene Wunden zeigt. Bei Wundheilungserscheinungen kann es sinnvoll sein, die Weichteilvernarbung im Rahmen der Rekonstruktion nachzuweisen. Der erste Fall einer Gesichtsrekonstruktion, der ein Gesichtstrauma beinhaltete, war der von Philipp II. Makedonien aus dem antiken Griechenland 250 v. Chr. (Prag & Neave, 1997), der eine gut verheilte Wunde am rechten Auge zeigte.

Ein jüngeres Beispiel ist der Fall eines Soldaten (Nummer 16) aus der Schlacht von Towton (Abb. 9B). Seine Überreste sind Teil der Towton Battle-Sammlung von 1996 mit 37 Skeletten der University of Bradford (Fiorato et al. 2000). Der Schädel wies eine gut verheilte Blattverletzung am linken Unterkieferkorpus auf. Die Klingenwunde hatte die linguale Oberfläche des Korpus durchdrungen, die Spitze des ersten Molaren entfernt und die innere Oberfläche des rechten Unterkieferkörpers getroffen. Zwischen dem linken ersten und zweiten Molaren blieb ein klaffendes Loch, wo der Knochen entfernt worden war. Alle Wundränder waren gut verheilt und zeigten keine Anzeichen einer Infektion. Die Rekonstruktion wurde angefertigt, um diese verheilte Wunde zu demonstrieren, da sie das lebendige Gesicht des Soldaten stark verändert hätte, wobei das resultierende Narbengewebe die linke Gesichtsseite erheblich verzerrte. Darüber hinaus litt er möglicherweise unter Ess- und Sprechschwierigkeiten und einigen Problemen mit dem Mundschluss auf der linken Seite, was zu Dribblings und einem Herabhängen des linken Mundwinkels führte (Wilkinson & Neave, 2003).

Rekonstruktionen, die pathologische Zustände darstellen, können nützliche Informationen für den Vergleich mit zeitgenössischen Populationen liefern, und Rekonstruktionen wurden von Personen mit Meningiom-Hyperostose und einem Hämangiom erstellt (Wilkinson, 2008). Diese Rekonstruktionen liefern mehr Details bezüglich der Oberflächendetails des Gesichts und können auf diese Weise als eine erhöhte wissenschaftliche Bewertung angesehen werden. Dennoch kann die Interpretation von Trauma und Krankheit, obwohl sie auf wissenschaftlicher Grundlage basiert, immer noch als ein Element künstlerischer Wertschätzung betrachtet werden.

Die Verwendung von Porträts für Oberflächendetails

Gelegentlich können Porträts als Referenzmaterial für die Hinzufügung von Oberflächendetails wie Fettleibigkeit, altersbedingte Veränderungen, Hautfarbe, Augenfarbe, Frisur und Farbe und Gesichtsbehaarung verwendet werden. Unter diesen Umständen können die resultierenden Gesichtsrekonstruktionen hinsichtlich der Ähnlichkeit als zuverlässiger angesehen werden. Normalerweise wird der Gesichtsrekonstruktionsprozess vom Schädel zum Gesicht blind für das Porträt durchgeführt und dann das Oberflächendetail hinzugefügt, um das Gesicht aus der Vergangenheit zuverlässiger darzustellen.

Beispiele für die Verwendung von Porträts für Oberflächendetails sind die Gesichtsrekonstruktionen altägyptischer Mumien mit verwandten Porträts. Die Porträts (Fayuum-Porträts) stammen alle aus dem 1. bis 2. Jahrhundert n. Chr. und wurden in Enkaustik-Technik hergestellt (Walker, 1997). Diese Porträts wurden von Ägyptologen analysiert, um Frisuren, Schmuck, Mode und sozialen Status zu bestimmen. Es wird geschätzt, dass es mehr als 1000 Mumienporträts gibt, aber weniger als 100 sind noch in ihre Mumien eingebunden. Mehrere Mumien mit Porträts wurden untersucht ( Wilkinson, 2003b Prag, 2002 Brier & Wilkinson, 2005 ) und in allen Fällen wurden die Porträts nach einer Ähnlichkeitsbewertung verwendet, um den Rekonstruktionen zusätzliche Oberflächendetails zu verleihen.

Eine kürzlich durchgeführte Studie über den Schädel von Johann Sebastian Bach (1685–1750), dem berühmten deutschen Komponisten und Organisten, umfasste die Bewertung eines bekannten Bach-Porträts für zusätzliche Oberflächeninformationen ( Hansen, 2008 ). Bach soll 1746, wenige Jahre vor seinem Tod, für den Maler Elias Gottlob Haussmann gesessen haben (Müller, 1935). Haussmann (1695–1774) diente als Hofmaler in Dresden und ab 1720 als offizieller Porträtist in Leipzig. Die Gesichtsrekonstruktion wurde als 3D-Computermodell mit einem Laserscan der Bronzekopie des Bachschädels vom Bachhaus Eisenach erstellt (Abb. 10). Der Schädel deutete auf einen Mann mittleren Alters mit großer Nase, kräftigem Kinn und Unterbiss hin. Für die Rekonstruktion wurden Gewebetiefendaten von zeitgenössischen deutschen Männern in den 60ern verwendet (Helmer, 1984), aber der Fettgehalt des Gesichts wurde direkt durch das Haussmann-Porträt beeinflusst. Aufzeichnungen über Bachs Leben deuten darauf hin, dass er Augenprobleme hatte, die zu geschwollenen, wunden Lidern führten, und das Porträt zeigte dieses Leiden (David & Mendel, 1945 Zegers, 2005). Aus dem Porträt wurden Augendetail, Augenfarbe, Hautfarbe und Gesichtsalterungsdetails bestimmt (Abb. 10). Die Kombination von Skelettbeurteilung und Porträtbeurteilung bietet eine Gesichtsdarstellung von Bach, die mit dem verfügbaren Material als möglichst genau angesehen werden kann ( Hansen, 2008 ).

Die Gesichtsrekonstruktion von Johann Sebastian Bach. Bei der computergestützten Gesichtsrekonstruktion (A) wurde ein 3D-Modell des Schädels aus Laserscandaten verwendet. Dem resultierenden Gesicht (B) wurde Textur hinzugefügt, wobei das Haussmann 1746-Porträt (D) als Referenzmaterial in Bezug auf den Fettgehalt, Augenzustand, Hautfarbe, Augenfarbe, Haarfarbe und Hauttextur (C) verwendet wurde. Mit freundlicher Genehmigung des Bachhauses, Eisenach, und Dr. Caroline Wilkinson & Janice Aitken, University of Dundee.


Genesis

Version 1.42 der Image Cutter Software wurde gestern veröffentlicht. Dazu gehört das Hinzufügen einer Vorlage, um die Verwendung von Googles API v3 zu ermöglichen. Diese Version der Google Maps API erfordert keinen API-Schlüssel und funktioniert besser als Version 2 auf Mobilgeräten wie iPhones, iPads und Android-Tablets.

Die neueste Version können Sie unter folgendem Link herunterladen: Image Cutter 1.42

Trackernet: Wo sind alle U-Bahnen?

Das fängt an, obsessiv zu werden, aber ich kann nicht umhin, mich zu fragen, wie viele Züge in der Londoner U-Bahn fahren und wo sie alle sind. Der von TfL veröffentlichte Trackernet-Webservice ermöglicht es Ihnen, alle Trittbretter für Bahnhöfe auf einer Linie zu sehen, sagt Ihnen jedoch nicht, wo sich alle Züge befinden. I did an earlier post about just the Victoria line trains, but I’ve now built this into a web service that works out locations for trains on the whole network.

Trains on the London Underground network for 11:30am on 30th November 2011

The map colours follow the normal line colours, so District (Green), Victoria (Light Blue), Central (Red), Northern (Black), Bakerloo (Brown), Jubilee (Grey), Piccadilly (Dark Blue), Waterloo and City (light green). Note that Circle and Hammersmith and City are all shown as yellow and there are no pink markers on the map. This is because the Trackernet API does not distinguish between Circle and Hammersmith and City trains and both lines are queried in one web request, so they’re difficult to separate out.

The idea is to build this into a web service and publish it on MapTube as a real-time Tube map. Using the locations of trains and the time to station information we can build a model of whether a line is running normally and where delays are occurring.

The basic technique behind how the positions are calculated relies on using the time to station information from the running boards at every station on the route to find the minimum time for every unique train. This is then taken as the most accurate location estimate and its position interpolated between the last and next stations based on the time. It is actually a lot harder to work out which line a train is on due to the fact that multiple lines can share platforms at the same station. For example, query the Piccadilly line and the District line and the resulting data will contain Barons Court for both, so you have to separate out the Piccadilly trains and the District trains and make sure you don’t count the same ones twice.

Now that the code can handle the Underground network, the next steps are to do the same for National Rail, London Buses and London River Services.

If you’re interested in live train data, it’s also worth looking at the following site that was created by Matthew Somerville: http://traintimes.org.uk/map/tube

FBX Exporters Part 4

In the previous three parts, I outlined the plan for getting geometry from MapTube via C Sharp into an FBX file using the C++ SDK provided by Autodesk. This final part shows data in a world map exported from MapTube and imported into 3DS Max.

The above image shows the world countries 2010 outline from MapTube. There a few countries missing as there was no data for them in the original dataset, so they show as blank on a MapTube map and their geometry is not exported. This is more visible in the perspective view where you can see the holes in Africa and the Middle East:

The exported geometry will eventually be coloured in the same way as MapTube, but for the moment all the geometry objects have a green material assigned to them.

The final export file can be downloaded from the following link: MyFBXExport

It’s worth pointing out that I’ve had a number of problems with the Quicktime FBX plugin that comes with the Autodesk FBX SDK. It seems to crash every time I close it and when displaying the above file there are some significant problems with how it renders the geometry. Most notably around the Hudson Bay area in Canada, parts of Europe and much of Russia. As it displays fine in Max, I can only assume this is a limitation of the Quicktime FBX renderer. I’ve also had to do some re-scaling of the geometry as it is exported in the Google Mercator projection, using metres. This means that the numbers are too big for Max to handle, so I’ve had to rescale them.

To recap on how this process works, here are the development steps needed to achieve it:

1. A C Sharp program which is a modification of the MapTubeD tile rendering procedure reads the geometry and data from the MapTube server and returns it as an iteration of SqlGeometry objects.

2. Each SqlGeometry object is simplified using the Reduce operation as we don’t need the full level of detail in the output FBX file.

3. The C Sharp program uses native methods in a C++ DLL, which I’ve written to control the operation of the FBX exporter in Autodesk’s SDK. A handle to the FBX document and scene that we want to create is obtained and then a native “AddGeometry” function is used on every geometry object until a final “WriteFile” function is called. The geometry is passed using the OGC well known binary format which is an efficient way of passing large blocks of complex geometry and is also independent of byte ordering.

The DLL which does the actual export is a 32 bit program with functions exported using C names rather than decorated C++ names to make it easy to link to the C Sharp function stubs. Internally, I’m using the GEOS library to parse the well known binary geometry, extract polygons and write the points to the FBX scene hierarchy.

That’s the proof of concept to demonstrate that this method works. The aim now is to see what we can do with geographic data now that we have the ability to load it into art tools like Max and Maya, game engines like Unity, or frameworks like XNA.

FBX Exporters Part 3

The first two parts of the FBX export process dealt with getting the FBX SDK working and exporting some simple geometry. Now what’s required is the ability to pass complex geometry from the MapTube side using C# over to the FBX side using C++. The obvious way to do this is to pass the geometry in the OGC well known binary format (WKB), so I’ve been looking at GEOS which is a C++ port of the Java Topology Suite (JTS). I’ve managed to use this in conjunction with the FBX exporter to create simple geometry from WKT which I’ve loaded into 3DS Max.

One of the problems I had was building a debug version of GEOS version 3.3.1 as the instructions aren’t quite right. The make command for a debug build is:

nmake /f makefile.vc BUILD_DEBUG=YES

As I’m using Visual Studio 2008, I had to run “autogen.bat” first to create the required header files, and also make sure I do a clean between the release build and the debug build. Once this library was built successfully, I could use the WKT reader to read in some test geometry and build an FBX exporter around it.

[c language=”++”]
string version = geos::geom::geosversion()
cout<<version
//geom::Geometry* geos::io::WKBReader::read ( std::istream & is )
std::string poly("POLYGON ((30 10 0, 10 20 10, 20 40 20, 40 40 30, 30 10 0))")
cout<<poly<<endl
WKTReader* reader = new WKTReader()
Geometry* geom = reader->read(poly)
delete reader
[/c]

The entire FBX exporter is too big to replicate here, but the part that extracts the geometry from the GEOS geometry object and creates the FBX control points is as follows:

[c language=”++”]
//create control points
int NumPoints = geom->getNumPoints()
lMesh->InitControlPoints(NumPoints)
KFbxVector4* lControlPoints = lMesh->GetControlPoints()
CoordinateSequence* coords = geom->getCoordinates()
for (int i=0 i<NumPoints i++)
<
lControlPoints[i]=KFbxVector4(coords->getOrdinate(i,0), coords->getOrdinate(i,1), coords->getOrdinate(i,2) )
cout<<coords->getOrdinate(i,0)<<","<<coords->getOrdinate(i,1)<<","<<coords->getOrdinate(i,2)<<endl
>
[/c]

The only other thing I’ve done is to create a material for the polygon so it shows up as red in 3DS Max.

Now I’ve demonstrated that all the component parts work, the final stage of getting geometry from MapTube into 3DS Max will be to write a C++ library on top of the FBX exporter and GEOS which can be used as a native library from C#.

FBX Exporters Part 2

In the first FBX exporter post I got to the point where the export of simple geometry from one of the Autodesk SDK examples could be loaded by the Quicktime plugin. This used the SDK as a multithreaded statically linked library which I used with one of the examples to create a plane object. The following image shows a more complicated file containing a marker (red), custom geometry in the form of a cube (grey) and a camera (looks like a camera).

The code to get to this point is rather complicated, but I copied the UI Examples CubeCreator example program supplied with the SDK which showed how to set up the cube mesh with all the correct normals and textures.

The scene graph is set up with a camera, marker and mesh as follows:

[c language=”++”]
// build a minimum scene graph
KFbxNode* lRootNode = pScene->GetRootNode()
lRootNode->AddChild(lMarker)
lRootNode->AddChild(lCamera)
// Add the mesh node to the root node in the scene.
lRootNode->AddChild(lMeshNode)
[/c]

The creation of the mesh object prior to this is a lot more complicated:

[c language=”++”]
// Define the eight corners of the cube.
// The cube spans from
// -5 to 5 along the X axis
// 0 to 10 along the Y axis
// -5 to 5 along the Z axis
KFbxVector4 lControlPoint0(-5, 0, 5)
KFbxVector4 lControlPoint1(5, 0, 5)
KFbxVector4 lControlPoint2(5, 10, 5)
KFbxVector4 lControlPoint3(-5, 10, 5)
KFbxVector4 lControlPoint4(-5, 0, -5)
KFbxVector4 lControlPoint5(5, 0, -5)
KFbxVector4 lControlPoint6(5, 10, -5)
KFbxVector4 lControlPoint7(-5, 10, -5)

KFbxVector4 lNormalXPos(1, 0, 0)
KFbxVector4 lNormalXNeg(-1, 0, 0)
KFbxVector4 lNormalYPos(0, 1, 0)
KFbxVector4 lNormalYNeg(0, -1, 0)
KFbxVector4 lNormalZPos(0, 0, 1)
KFbxVector4 lNormalZNeg(0, 0, -1)

// Initialize the control point array of the mesh.
lMesh->InitControlPoints(24)
KFbxVector4* lControlPoints = lMesh->GetControlPoints()
// Define each face of the cube.
// Face 1
lControlPoints[0] = lControlPoint0
lControlPoints[1] = lControlPoint1
lControlPoints[2] = lControlPoint2
lControlPoints[3] = lControlPoint3
// Face 2
lControlPoints[4] = lControlPoint1
lControlPoints[5] = lControlPoint5
lControlPoints[6] = lControlPoint6
lControlPoints[7] = lControlPoint2
// Face 3
lControlPoints[8] = lControlPoint5
lControlPoints[9] = lControlPoint4
lControlPoints[10] = lControlPoint7
lControlPoints[11] = lControlPoint6
// Face 4
lControlPoints[12] = lControlPoint4
lControlPoints[13] = lControlPoint0
lControlPoints[14] = lControlPoint3
lControlPoints[15] = lControlPoint7
// Face 5
lControlPoints[16] = lControlPoint3
lControlPoints[17] = lControlPoint2
lControlPoints[18] = lControlPoint6
lControlPoints[19] = lControlPoint7
// Face 6
lControlPoints[20] = lControlPoint1
lControlPoints[21] = lControlPoint0
lControlPoints[22] = lControlPoint4
lControlPoints[23] = lControlPoint5

// We want to have one normal for each vertex (or control point),
// so we set the mapping mode to eBY_CONTROL_POINT.
KFbxGeometryElementNormal* lGeometryElementNormal= lMesh->CreateElementNormal()

// Set the normal values for every control point.
lGeometryElementNormal->SetReferenceMode(KFbxGeometryElement::eDIRECT)

lGeometryElementNormal->GetDirectArray().Add(lNormalZPos)
lGeometryElementNormal->GetDirectArray().Add(lNormalZPos)
lGeometryElementNormal->GetDirectArray().Add(lNormalZPos)
lGeometryElementNormal->GetDirectArray().Add(lNormalZPos)
lGeometryElementNormal->GetDirectArray().Add(lNormalXPos)
lGeometryElementNormal->GetDirectArray().Add(lNormalXPos)
lGeometryElementNormal->GetDirectArray().Add(lNormalXPos)
lGeometryElementNormal->GetDirectArray().Add(lNormalXPos)
lGeometryElementNormal->GetDirectArray().Add(lNormalZNeg)
lGeometryElementNormal->GetDirectArray().Add(lNormalZNeg)
lGeometryElementNormal->GetDirectArray().Add(lNormalZNeg)
lGeometryElementNormal->GetDirectArray().Add(lNormalZNeg)
lGeometryElementNormal->GetDirectArray().Add(lNormalXNeg)
lGeometryElementNormal->GetDirectArray().Add(lNormalXNeg)
lGeometryElementNormal->GetDirectArray().Add(lNormalXNeg)
lGeometryElementNormal->GetDirectArray().Add(lNormalXNeg)
lGeometryElementNormal->GetDirectArray().Add(lNormalYPos)
lGeometryElementNormal->GetDirectArray().Add(lNormalYPos)
lGeometryElementNormal->GetDirectArray().Add(lNormalYPos)
lGeometryElementNormal->GetDirectArray().Add(lNormalYPos)
lGeometryElementNormal->GetDirectArray().Add(lNormalYNeg)
lGeometryElementNormal->GetDirectArray().Add(lNormalYNeg)
lGeometryElementNormal->GetDirectArray().Add(lNormalYNeg)
lGeometryElementNormal->GetDirectArray().Add(lNormalYNeg)

// Array of polygon vertices.
int lPolygonVertices[] = < 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,12, 13,
14, 15, 16, 17, 18, 19, 20, 21, 22, 23 >

// Create UV for Diffuse channel.
KFbxGeometryElementUV* lUVDiffuseElement = lMesh->CreateElementUV( "DiffuseUV")
K_ASSERT( lUVDiffuseElement != NULL)
lUVDiffuseElement->SetMappingMode(KFbxGeometryElement::eBY_POLYGON_VERTEX)
lUVDiffuseElement->SetReferenceMode(KFbxGeometryElement::eINDEX_TO_DIRECT)

KFbxVector2 lVectors0(0, 0)
KFbxVector2 lVectors1(1, 0)
KFbxVector2 lVectors2(1, 1)
KFbxVector2 lVectors3(0, 1)

lUVDiffuseElement->GetDirectArray().Add(lVectors0)
lUVDiffuseElement->GetDirectArray().Add(lVectors1)
lUVDiffuseElement->GetDirectArray().Add(lVectors2)
lUVDiffuseElement->GetDirectArray().Add(lVectors3)

//Now we have set the UVs as eINDEX_TO_DIRECT reference and in eBY_POLYGON_VERTEX mapping mode
//we must update the size of the index array.
lUVDiffuseElement->GetIndexArray().SetCount(24)

// Create polygons. Assign texture and texture UV indices.
for(int i = 0 i < 6 i++)
<
// all faces of the cube have the same texture
lMesh->BeginPolygon(-1, -1, -1, false)

for(int j = 0 j < 4 j++)
<
// Control point index
lMesh->AddPolygon(lPolygonVertices[i*4 + j])

// update the index array of the UVs that map the texture to the face
lUVDiffuseElement->GetIndexArray().SetAt(i*4+j, j)
>

So, we have to define the vertices (control points in the language of the SDK), normals and UV coordinates for the mesh to show in the Quicktime viewer. It’s also worth mentioning that I’ve had to force the output FBX file from the exporter to be in binary format as the viewer refuses to load the ASCII format FBX. In addition to this, I’m still getting application crashes when I close the Quicktime viewer.

Now I have the ability to create custom geometry, the next step is to write an interface to allow me to pass geographic data to the exporter via C#. After giving this some thought, the obvious solution is to pass well-known binary (WKB) from the C# program to the C++ library as a block of bytes. This is a relatively easy format to produce and decode into geometry, so shouldn’t take long to write.

Part three will deal with the mechanics of getting actual geometry to the exporter and generating an FBX file from real geographic data.

Exporting Geographic Data in FBX Files

I’ve been looking at how to export the geographic information contained in a MapTube map into an art tool like 3DS Max or Maya. The reason for this is firstly to make it easier to produce high quality geographic presentations, but also, by employing a recognised art tool chain, we can also get the data into 3D visualisation systems built around XNA (XBox) or Unity.

Originally, I was going to implement a 3DS exporter as this is a well-used format that would allow geometry to be imported by Google Sketchup, Blender, or a long list of professional art tools. After coming across Autodesk’s FBX SDK, I decided to create an FBX exporter instead. Although this is a format that can’t be loaded by either Sketchup or Blender, the SDK is quite flexible and can also export Collada (DAE) and Wavefront OBJ files which the free tools can import. In addition to this, it can be imported by both Unity and XNA.

Autodesk supply a viewer plugin for Quicktime, but I had some problems getting this to work with my first export attempts. The example below shows a simple screenshot:

Although a flat black plane on a grey background isn’t fantastic for a first attempt, it took a while to get this far as the examples don’t tell you that the Quicktime viewer doesn’t like ASCII format FBX files and you have to change the example format to BINARY.

[c language=”++”]
//altered export from ASCII to Binary
int lFormatIndex, lFormatCount = pSdkManager->GetIOPluginRegistry()->GetWriterFormatCount()

for (lFormatIndex=0 lFormatIndex<lFormatCount lFormatIndex++)
<
if (pSdkManager->GetIOPluginRegistry()->WriterIsFBX(lFormatIndex))
<
KString lDesc =pSdkManager->GetIOPluginRegistry()->GetWriterFormatDescription(lFormatIndex)
printf("%s ",lDesc.Buffer()) //print out format strings
//char *lASCII = "ascii"
char *lBinary = "binary"
if (lDesc.Find(/*lASCII*/lBinary)>=0)
<
pFileFormat = lFormatIndex
break
>
>
>
[/c]

This is a copy of the “ExportDocument” example that comes with the SDK, but with the type changed to binary to allow it to load.

The next problem is learning how to create my own geometry and figuring out a way of connecting the native C++ library to the managed C# code used by MapTube. My initial thought was to create a managed wrapper for the FBX SDK and use marshalling, but, on further examination of the SDK, it’s much too complicated to do in any reasonable amount of time. So, plan B is to write the code to do the export as a native C++ process, expose enough methods to allow this to be controlled through marshalling and interop via the C# code and do the FBX export through that route. This only depends on being able to marshall the large amount of geometry data, but this should be possible to work out.

After these first experiments, it’s looking like the pattern will be something like a reader/writer object with a choice of export formats as FBX, Collada or OBJ to allow the assets to be loaded into as many art packages as possible.

The next post will cover the generation of the geometry and its export to FBX.

Trackernet: The Victoria Line

I’ve been meaning to look at TfL’s Trackernet API for a while now. It works through a REST based web service which gives access to all the London Underground running boards on a line by line basis. You issue an http request of the form:

and the result is an XML file containing train information for every station on the Victoria Line. Substitute “B” instead of “V” and you get the Bakerloo line instead. I had managed to figure out a way to get approximate train locations when the Victoria Line got suspended one morning, so I couldn’t resist looking to see where all the trains had ended up:

According to my data, there are 25 trains on the line. The way the positions are calculated is quite complicated as the original information comes from the running boards for every station and the time to platform estimates. Trains are uniquely identified through a train number and a set number as a composite key. I simply iterate through all the data for every station and take the lowest time to station for every train, which gives me the train’s next station. Then I use the location code provided by the API and the time to station estimate to interpolate between the last station and the next station.

One feature worth noting is that because the time to station is given for every station along the train’s whole route, you can use the data to build up a dataset of the time required to travel between any pair of stations. Also, because the information is processed from the running boards, the program should be able to process National Rail train locations from the information on their website.

By using only the information provided in the XML response from the API means that I am able to construct a web service that doesn’t require any state information to be retained between calls. In addition to this, it doesn’t require any knowledge of the tube network and how the stations are connected together.

This is still very much a prototype, but once it’s working for all the lines, it will be released as a real-time feed on MapTube.

Twitter Maps and #ukriots

With all the media hype surrounding the use of social networking and the London riots, it left me wondering what was actually being said on Twitter in the UK. It was also a good opportunity to test out the new MapTube map creation software which can handle 35,000 clickable points on a map with ease (we tested with 500,000). So, the aim was to create a map of UK tweets which I could explore around the areas where the riots were happening to see what people were saying about them on Twitter.

In order to do this, I used the Twitter client that Steven Gray wrote to collect geocoded tweets from Twitter. This has been used for things like the real-time heatmap of London 2012 #1yeartogo tweets: http://bigdatatoolkit.org/

The resulting map can be seen below:

Tweets captured from Twitter between 15:00 and 22:00 on Tuesday 9th August 2011. See text for further details.

Once the data had been collected as a CSV file containing “UserId”, “Time”, “Tweet”, “lat” and “lon”, the processing was done using Excel. This will feature as a separate blog post in more detail, but I created columns of riot related hashtags and cleanup related hashtags. Then these were combined into a colour code based on whether the tweet is a general tweet (Blue), contained a riot tag (red), contained a cleanup tag (green) or both riot and cleanup tags (yellow).

There are full details in the “more information” link on the live map, but I collected 34,314 geocoded tweets in the period, of which 1,330 contained riot hashtags and 87 contained cleanup hashtags.

What’s interesting about this map is that I was expecting more tweeting about the riots. 13,330 is less than 4% of all geocoded tweets.

Where this map really comes into its own is the ability to click on messages around the riot areas and see what people are saying. I think what this highlights is that you need some sort of natural language processing as there is obviously a lot of discussion about the riots not using hash tags. People are tweeting that they or their children are scared as it sounds really close, or tweeting to people to tell them they have arrived home safely.

The other interesting thing for natural language processing researchers is that Twitter has a language all of its own. When you start reading some of the tweets it’s obvious that the contractions and slang that is being used will be a challenge to understand.

One thing I need to fix in MapTube is that it returns too much information on the popup when you click on a location. The point and click functionality returns all points covering the area of your click. If you are zoomed out a long way, then this can be hundreds of points on the speech bubble popup which causes the client browser a number of problems. I think limiting to around 20 returned points would be a safer option.

Making Maps From Wikipedia

I’ve been looking at web-based sources of geographic data and Wikipedia links are something I’ve wanted to try out for a while. I found the following page containing Worldwide fossil sites:

This gives a list of sites, but with no locations:

The “Site” column contains href links which can be followed to pages like the following:

The coordinates can just be made out in the top right hand corner of the page.

As all Wikipedia pages follow a common theme, the coodinates are embedded in a <span> tag with I already had a Java program for loading a web page and converting it into xhtml, so I used this to turn the original list page into a csv file by extracting the data out of the html tables. One of the columns in this file contained the links to the site-specific pages, so another program was written to follow all these links and extract the location from the site page.

While the general technique works, only about 25% of the data had links to pages with lat/lon coordinates, so the final map is somewhat incomplete, but this can be edited manually. The map itself was built using MapTube’s new map creation system which works using the CSV file of data. The final map can be viewed at the following link:

New MapTube Map Creation Feature

We released a new feature on the MapTube website today which will make it easier to create new maps from data in CSV files. The underlying technology is used on the SurveyMapper site and for other real-time visualisations like http://bigdatatoolkit.org/2011/07/26/1yeartogo/ which shows tweets using the #1yeartogo hashtag for the London 2012 Olympics.

Creating a map of abandoned vehicles from the London Datastore using MapTube

The new update to MapTube adds a graphical user interface which allows the user to upload a data file, choose a colour scale and publish the map on MapTube directly. One of the driving forces behind this was the idea that creating a map should be simple enough that you could do it using an iPad. Data on the London Datastore is in the correct format, so you can copy the CSV link directly from the site, which is exactly what has been done in the above image. I’ve created a YouTube clip showing the whole process, which can be viewed at the following link:

This feature is still experimental, but at the m0ment it handles point data in lat/lon coordinates (WGS84) or OS coordinates for the UK (OSGB36). Point data can be drawn using markers, or as a heatmap showing point density. For area data, one column in the data is selected as a key field and this is joined with the geographic data stored in MapTube’s database to draw the map. For example, using the following data:

We have four columns: Constituency, Party, PartyCode and Change. In the CSV file the first line must be the column headings, then every subsequent line contains data. The CSV file would contain the following:

The “Constituency” column is the area key in this case, but MapTube determines this automatically when the CSV file is loaded, along with the type of geography, which is Parliamentary Constituencies. In order to colour the map, numeric data is required, so in this example, a column labelled “PartyCode” has been added where “LAB”=1, “”CON”=2, LD=𔄥” etc.

The colour scale is then chosen and the finished map submitted to MapTube where it can be viewed along with any of the other maps. There are help pages accessible through the ‘i’ icon on each section which contain further information.

As mentioned before, this feature is still experimental and we will be gradually adding more geographic data to the MapTube database to allow maps to be built from additional geographies. The aim is for MapTube to be able to automatically detect the geography just by analysing the data and, at the moment, the following geographies can be used:

US States and Zip code areas will be added shortly, along with adminsitrative and Census boundaries for other parts of the World.


Browse Books

In the 1990s, a new type of learning algorithm was developed, based on results from statistical learning theory: the Support Vector Machine (SVM). This gave rise to a new class of theoretically elegant learning machines that use a central concept of SVMs -kernels--for a number of learning tasks. Kernel machines provide a modular framework that can be adapted to different tasks and domains by the choice of the kernel function and the base algorithm. They are replacing neural networks in a variety of fields, including engineering, information retrieval, and bioinformatics.

Learning with Kernels provides an introduction to SVMs and related kernel methods. Although the book begins with the basics, it also includes the latest research. It provides all of the concepts necessary to enable a reader equipped with some basic mathematical knowledge to enter the world of machine learning using theoretically well-founded yet easy-to-use kernel algorithms and to understand and apply the powerful algorithms that have been developed over the last few years.


Author Profile Pages

  1. Beschreibung: The Author Profile Page initially collects all the professional information known about authors from the publications record as known by the ACM bibliographic database, the Guide. Coverage of ACM publications is comprehensive from the 1950's. Coverage of other publishers generally starts in the mid 1980's. The Author Profile Page supplies a quick snapshot of an author's contribution to the field and some rudimentary measures of influence upon it. Over time, the contents of the Author Profile page may expand at the direction of the community.
    Please see the following 2007 Turing Award winners' profiles as examples:
  2. History: Disambiguation of author names is of course required for precise identification of all the works, and only those works, by a unique individual. Of equal importance to ACM, author name normalization is also one critical prerequisite to building accurate citation and download statistics. For the past several years, ACM has worked to normalize author names, expand reference capture, and gather detailed usage statistics, all intended to provide the community with a robust set of publication metrics. The Author Profile Pages reveal the first result of these efforts.
  3. Normalization: ACM uses normalization algorithms to weigh several types of evidence for merging and splitting names.
    Diese schließen ein:
    • co-authors: if we have two names and cannot disambiguate them based on name alone, then we see if they have a co-author in common. If so, this weighs towards the two names being the same person.
    • affiliations: names in common with same affiliation weighs toward the two names being the same person.
    • publication title: names in common whose works are published in same journal weighs toward the two names being the same person.
    • keywords: names in common whose works address the same subject matter as determined from title and keywords, weigh toward being the same person.

The more conservative the merging algorithms, the more bits of evidence are required before a merge is made, resulting in greater precision but lower recall of works for a given Author Profile. Many bibliographic records have only author initials. Many names lack affiliations. With very common family names, typical in Asia, more liberal algorithms result in mistaken merges.

Automatic normalization of author names is not exact. Hence it is clear that manual intervention based on human knowledge is required to perfect algorithmic results. ACM is meeting this challenge, continuing to work to improve the automated merges by tweaking the weighting of the evidence in light of experience.

ACM will expand this edit facility to accommodate more types of data and facilitate ease of community participation with appropriate safeguards. In particular, authors or members of the community will be able to indicate works in their profile that do not belong there and merge others that do belong but are currently missing.

A direct search interface for Author Profiles will be built.

An institutional view of works emerging from their faculty and researchers will be provided along with a relevant set of metrics.

It is possible, too, that the Author Profile page may evolve to allow interested authors to upload unpublished professional materials to an area available for search and free educational use, but distinct from the ACM Digital Library proper. It is hard to predict what shape such an area for user-generated content may take, but it carries interesting potential for input from the community.


Buildings missing texture in 3d web scene exported from ArcScene - Geographic Information Systems

Behind the Scenes: Floating Cottage

New Edge Scrolling for Node Editor

Behind the Scenes: The Gate

The Best Blender Art on Sketchfab: 2021, week 26

New Chapter of Scripting for Artists Released

Community News


Schau das Video: Blender GIS