Zum Hauptinhalt springen

Virtual Reality: Akustik. Ein Prototypsystem zur Klangsimulation

Denis TumpicCTO • Chief Ideation Officer • Grand Inquisitor
Denis Tumpic serves as CTO, Chief Ideation Officer, and Grand Inquisitor at Technica Necesse Est. He shapes the company’s technical vision and infrastructure, sparks and shepherds transformative ideas from inception to execution, and acts as the ultimate guardian of quality—relentlessly questioning, refining, and elevating every initiative to ensure only the strongest survive. Technology, under his stewardship, is not optional; it is necessary.
Klicken Sie, um das Original-Titelseite, Zusammenfassung, Vorwort usw. anzuzeigen.

Amiga ist eine eingetragene Marke von Commodore-Amiga Inc.

„dbx“ ist eine eingetragene Marke von dbx, Newton, Massachusetts, USA, einer Abteilung der BSR NA Ltd.

Dolby A, B, C, S, Sr sind eingetragene Marken von Dolby Laboratories Inc., San Francisco, Kalifornien

Dolby Surround ist eine eingetragene Marke von Dolby Laboratories Inc., San Francisco, Kalifornien

Department of Computer Science Lund University S-221 00 Lund, Schweden ©1994 von Denis Tumpic

Lund University LUP Student Papers, Virtual Reality: Akustik. Ein Prototypsystem zur Klangsimulation

LaTeX\LaTeX Version ©2008 von Denis Tumpic

Docusaurus-Version, Die deutsche Übersetzung wurde von LLM angefertigt und im Laufe der Zeit manuell überarbeitet. ©2025 von Denis Tumpic

Till mina nära och kära

Schwedische Zusammenfassung

Derzeit sind Video-Ray-Tracer für Personalcomputer weit verbreitet, doch Audio-Ray-Tracer existieren nicht in ähnlicher Vielfalt. Kommerziell sind keine solchen Systeme zu vernünftigen Preisen erhältlich. Diese Tatsache sowie das wachsende Interesse an VR-Umgebungen weisen auf ein starkes Bedürfnis nach einem Audio-Ray-Tracker hin, der sowohl schnell als auch benutzerfreundlich ist. Die Visualisierung, die in allen Video-Ray-Trackern vorhanden ist, sollte eine akustische Entsprechung in einem Audio-Ray-Tracker haben; dies wird als Audialisierung (Auralisierung) bezeichnet.

Darüber hinaus kann ein Audio-Ray-Trace-Programm ein sehr nützliches Hilfsmittel zur Verbesserung der Akustik bereits bestehender Räume sein. Für ein solches Hilfsmittel werden nicht die Anforderungen an Echtzeit-Feedback gestellt, wie sie bei der Erstellung einer guten VR-Umgebung auftreten. Dieser Bericht ist eine gründliche Übersicht des akustischen Kriteriums „3D-Audio“ in der Definition von starken VR-Umgebungen. Eine kurze Einführung in Klang, Schallwahrnehmung und Audiobearbeitung dient als Einstieg. Abschließend definiere und fasse ich VR-Umgebungen zusammen. Im Anschluss diskutiere ich die Arbeit mit 3D-Audio in Bezug auf diese Aspekte sowie auf die Effizienz der Mensch-Computer-Interaktion und die mit der Erzeugung von Klangfeldern verbundenen Algorithmen. Auch Auralisierung wird behandelt, und eine mögliche Lösung dafür wird vorgestellt.

Abstract

This report is a thorough look at the acoustic criteria - 3D-Audio - the strong definition of VR-environment. A brief introduction to sound, the human ear and audiohandling is given, and to conclude this introduction, a definition and summary of VR-environments. Finally I discuss the implementation of 3D-Audio with regard to these aspects, and to the effectiveness of human-computer- interaction and the algorithms in the sound-field-generation module. As a conclusion, the auralization stage is discussed and a possible solution is presented.

Vorwort

Dieser Bericht behandelt eine Abschlussarbeit, die im ersten Halbjahr 1994 an einem μ\mu-Computer des Typs Amiga durchgeführt wurde. Die Abschlussarbeit dient als gründliche Prolog zur akustischen VR-Umgebung. Der Schwerpunkt liegt auf Mensch-Computer-Interaktion und Algorithmen-Effizienz bei der Synthese von Klangfeldern.

Ich danke meinen Eltern für ihre Geduld mit mir und für ihre wertvolle Unterstützung in schwierigen Phasen über die Jahre hinweg.

Ich möchte Michael Dovits und Lars Malmborg dafür danken, dass sie mich über die Jahre mit interessanten Ideen und Experimentierprojekten angetrieben haben. Für den ersten hochwertigen Ausdruck stellte Lars seinen HP-550C zur Verfügung.

Ich danke Lars Holmgren für seine Präsentation des Video-Ray-Tracers Lightwave.

Ich danke Roberth Frank für seine zahlreichen konstruktiven Kritiken und seine Hilfe bei der Korrekturlesung des Haupttextes. Den Witz auf Seite 17 hat er ebenfalls beigesteuert.

Ich danke meinem akustischen Betreuer, dem Forschungsingenieur Erling Nilsson, für seine Klärungen zum Thema und dafür, dass er meine Ambitionen rechtzeitig gedämpft hat.

Schließlich danke ich meinem Betreuer am Institut für Informatik und Numerische Analyse, Sten Henriksson, für sein wertvolles Wissen und seine Einsichten.

Malmö, November 1994
Denis Tumpic

Prinzipien von Schall und Hören

Original AIFF Image Original AIFF Image

It has long been an axiom of mine that the little things are infinitely the most important.

Sir Arthur Conan Doyle

Hier folgt eine kurze Einführung in die Natur von Schall und Hören. Der Hauptgrund, warum ich dieses Kapitel verfasst habe, ist es, Personen ohne Vorkenntnisse über die Funktionsweise von Schall eine Vorstellung davon zu vermitteln. Auch „alte Füchse“ in der Akustik sollten dieses Kapitel lesen, um meine weiteren fließenden Argumentationen in den folgenden Kapiteln besser verstehen zu können.

Ich habe versucht, die weniger offensichtlichen Probleme in der Akustik aufzugreifen, um auf die tatsächlich bestehenden Herausforderungen hinzuweisen. Für eine sehr gute Übersicht über Akustik (insbesondere in Räumen) verweise ich den interessierten Leser auf „Room Acoustics“ von Heinrich Kuttruff. Für die Prinzipien des Ohres empfehle ich die „Encyclopedia Britannica“, da sie umfangreiche Informationen zu diesem Thema bietet. Darüber hinaus ist das „Audio-Engineering Handbook“, zusammengestellt von K. Blair Benson, eine sehr gute und nützliche Lektüre für alle, die auch an den technischen Aspekten interessiert sind.

Die Natur des Schalls

Der Klang ist in seiner Natur nicht völlig anders als Licht. Der Unterschied besteht darin, dass es sich um Verdichtungen und Verdünnungen eines Mediums handelt, anstatt um einen ständigen Strom von Photonen. Schall breitet sich longitudinal aus, im Gegensatz zur transversalen Ausbreitung von Licht, wie in der folgenden Abbildung gezeigt wird.

Transversale Welle oben und longitudinale Welle unten, λ ist die Wellenlänge.

Im Alltag sind wir ständig verschiedenen Arten von Schall ausgesetzt. Es können tiefe Töne sein, die Gegenstände zum Vibrieren bringen. Diese Töne werden als Infraschall bezeichnet, und unsere Ohren nehmen sie nur schlecht wahr; stattdessen vibrieren die peripheren Teile des Körpers leicht. Dieses Phänomen haben alle bemerkt, die von einem großen Lastwagen überholt wurden, während sie mit dem Fahrrad unterwegs waren – besonders dann, wenn der Lkw beschleunigt. Zu den Infraschalltönen zählen alle reinen Töne unter 20 Hz. Mit „reinen Tönen“ meine ich Töne, die aus einer einfachen Sinuswellenform bestehen.

Die Art und Weise, wie Fledermäuse (Chiroptera) Hindernisse orten, ist beeindruckend und lässt sich am besten mit einem Radar (RAdio Detection And Ranging) vergleichen. Im Gegensatz zu den Radiowellen des Radars sendet die Fledermaus einen hohen Ton in ihre Flugrichtung aus, um festzustellen, ob sich ein Hindernis oder eine Änderung auf ihrem Weg befindet [1,2]. Dieser hohe Ton wird als Ultraschall bezeichnet, und alle reinen Töne über 20 kHz fallen unter diese Kategorie. Zwischen dem Infraschall- und dem Ultraschall-Frequenzbereich liegt der normale Hörbereich des Menschen.

Daher ist es kein Zufall, dass High-Fidelity unter anderem dadurch definiert wird, dass aufgenommene Materialien mit einer geraden Frequenzgang im Bereich von 20 Hz bis 20 kHz wiedergegeben werden sollen [3, 4]. Mit „gerader Frequenzgang“ ist gemeint, dass geringe Schwankungen in benachbarten Frequenzbereichen zulässig sind und die maximale Abweichung vom Mittelwert höchstens 3 dB betragen darf. Dezibel ist eine relative Einheit und wird in diesem Fall durch 10log(PutPin)10\log(\frac{P_{ut}}{P_{in}}) definiert, wobei P für akustische Leistung steht. In der Natur kommen mehrere Schallquellen vor. Eigentlich ist fast alles irgendwie eine kleine Schallquelle. Eine sprechende Person ist natürlich eine Schallquelle, aber selbst wenn sie völlig still ist, erzeugt ihr Körper Geräusche. Diese Geräusche haben jedoch viel geringere Energie als die Sprache. Wenn ein Sinfonieorchester in Forte Fortissimo spielt – abgekürzt als fff in der Notenschrift und bedeutend, dass das Orchester unglaublich laut spielen soll – entsteht nur etwa 2,5 W akustische Leistung. Unsere eigene Sprache, die in diesem Zusammenhang vom brüllenden Orchester völlig übertönt wird, erreicht typischerweise etwa 25 µW. Es ist klar, dass wir von einer nie abebbenden Strömung von Geräuschen umgeben sind – vom spielenden Kind der Nachbarn bis zum Flüstern des Blutes in unseren Ohren.

Einige typische Schalldrücke für übliche schall erzeugende Objekte. Die Entfernungen in Klammern geben den Messabstand an.

Schall besteht normalerweise aus vielen zusammengesetzten Tönen, die seine Charakteristik bestimmen. Diese Töne haben unterschiedliche Amplituden (Intensitäten) und verschiedene Phasenlagen, um den Schall aufzubauen. Um das Konzept der Frequenz leichter handhaben zu können, unterteilen wir den Frequenzbereich in Oktaven.

Das Wort „Oktave“ stammt aus der westlichen Musikwelt und bedeutet eine Verdoppelung der Frequenz. Unsere Musik lebt grundlegend in einer Modulo-8-Welt – C1 D E F G A H C2 (okta = 8). Mathematisch wäre es wohl Modulo-7, doch Musiker verwenden Null nicht als Startreferenz. Hinzuzufügen ist, dass wir hier die „schwarzen Tasten“ außer Acht lassen, da sie später hinzugekommen sind. Akustische Messungen werden üblicherweise in Oktavintervalle unterteilt, da dies eine natürliche und einfache Darstellung ergibt, wenn wir Musikmaterial betrachten.

Die Amplitude A und die Phase φ.

Bei einer Frequenzanalyse (Fourier-Analyse) des Schalls können wir seine Charakteristik visualisieren. Um einen Ton in seine zugrundeliegenden Informationen zu zerlegen, können wir ein bandpassartiges Filter auf die von einem Mikrofon stammenden Audiodaten anwenden. Diese Bandpassfilter sollen diskrete (nicht überlappende) Grenzfrequenzbereiche aufweisen, und die Vereinigung ihrer Frequenzbereiche soll den gesamten betrachteten Frequenzbereich abdecken, um eine gute Visualisierung zu gewährleisten (Abbildung 1.3). Zur Verdeutlichung: Ein Bandpassfilter ist ein Filter, das alle Frequenzen oberhalb der oberen Grenzfrequenz und unterhalb der unteren Grenzfrequenz stark dämpft (siehe auch Resonanz). Filter sind übrigens ein umfangreiches Gebiet, auf das ich nicht im Detail eingehen werde. Wer mehr über Filter erfahren möchte, kann dies in Telekommunikationsbüchern nachlesen.

Indem wir die Energie in den zerlegten Frequenzbändern über einen bestimmten Zeitraum integrieren, der für jedes Filter nicht gleich sein muss, können wir die Informationen auf relativ einfache Weise visualisieren. Diese Visualisierung wird als Klangspektrum bezeichnet und eignet sich besonders gut, um aufzuzeigen, wie ein Ton zusammengesetzt ist, insbesondere bei der Schallerzeugung.

Eine mögliche Frequenzanalyse eines Schalls in einem gegebenen Zeitraum.

Ausbreitung von Schall

Die Ausbreitung von Schall ist nicht ganz trivial. Obwohl sie einfach erscheint, sollte betont werden, dass es sich um mechanische Schwingungen handelt. Der Leser wird gebeten, dies bei der weiteren Lektüre im Hinterkopf zu behalten. Weiterhin sollte betont werden, dass Schall sich nicht im Vakuum ausbreiten kann, da das Vakuum keine Materie enthält, die Druckänderungen für die Schallausbreitung hervorrufen könnte. Da wir von enormen Mengen an Material unterschiedlicher Aggregatzustände (bei verschiedenen Drücken und Temperaturen) umgeben sind, macht dies generelle korrekte Berechnungen und Annahmen schwierig. Es gibt jedoch einige grundlegende Prinzipien, die auch beim Licht gelten.

Wir nehmen an, dass wir eine räumlich isotrope Quelle haben, d. h., die Quelle strahlt ihre Energie gleichmäßig in alle Richtungen aus. Wir lassen sie einen kurzen Impuls aussenden und erfassen mit Mikrofonen die Energie, die in verschiedenen Entfernungen von der Schallquelle empfangen wird. Wenn wir diesen Versuch im Freien durchführen, ohne größere Objekte, die unsere Messungen stören könnten, werden wir feststellen, dass die Energie quadratisch mit dem Abstand abnimmt.

Darüber hinaus können wir ohne größere Vorbehalte sagen, dass solange die Amplitude nicht extrem ist, Verdichtungen und Verdünnungen mit konstanter Geschwindigkeit propagieren. Die Ausbreitungsgeschwindigkeit von Schall in Luft bei normaler Luftfeuchtigkeit und 20o20^o °C beträgt etwa 343 m/s. Diese Geschwindigkeit ist jedoch vergleichsweise bescheiden gegenüber der Lichtgeschwindigkeit von etwa 300.000.000 m/s im Vakuum. Dennoch ist die Schallgeschwindigkeit deutlich schneller als mein Auto, selbst bei Bergabfahrt, Rückenwind und Heimweh.

Reflexion & Absorption

Alle haben wir uns schon einmal verwirrt gefühlt, wenn wir die Schallquelle gesehen haben, aber den Klang aus einer völlig anderen Richtung gehört haben. Bei extremen Bedingungen kann dies vorkommen. Das Direktschallfeld wird so stark absorbiert, dass die Reflexionen das Schallbild dominieren. Dies führt dazu, dass die Schallquelle delokalisiert erscheint und es den Eindruck erweckt, als hätte der Klang keinen Körper. Der Naive wird wohl annehmen, dass Schall sich wie Licht bei Reflexion und Absorption verhält, doch dies ist eine sehr grobe Vereinfachung, die nur in sehr einfachen Fällen funktioniert. Bei Schallreflexion hängt die reflektierte Schallwelle von dem Einfallswinkel, der Oberflächenbeschaffenheit, der Masse des reflektierenden Objekts und der Charakteristik des Schalls ab.

Geometrische Interpretation der Wellenfrontausbreitung bei Reflexion. Richtung der Schallstrahlen.

Dass die Reflexion von der Charakteristik des Schalls abhängt, bedeutet, dass sie frequenz- und phasenabhängig ist. Außerdem haben wir das große Problem, dass ebene Schallwellen in der Natur meist nicht existieren. Eine ebene Schallwelle hängt nur von der Zeit und einer Richtung ab. Dies bedeutet, dass wir niemals parallele Schallwellen haben können. Daher ist die Annahme, die Natur des Lichts zur Berechnung der Schallausbreitung zu nutzen, irreführend.

Interferenz

Betrachten wir zwei identische Schallquellen, die kohärente Informationen abstrahlen. Diese Schallquellen sind beliebig im Raum positioniert. Gemäß dem Superpositionsprinzip, das auch für elektrische Signale gilt, addieren sich die Beiträge der Schallquellen linear an jedem Punkt im Raum. Mit „Punkt“ meinen wir hier einen kleinen, begrenzten Bereich, der die höchste Frequenz im Schallsignal enthalten kann. Beachten Sie, dass dieser Bereich auch von dem Medium abhängt, in dem der Schall existiert.

Zwei überlagerte Signale mit gleicher Amplitude und Frequenz, aber unterschiedlichen Phasenlagen. Beachten Sie die Spiegelung der Gesamtphase nach 180º.

Interferenz wird normalerweise in zwei Gruppen unterteilt: die konstruktive und die destruktive. Bei konstruktiver Interferenz arbeiten die beiden Schallquellen an dem betrachteten Punkt zusammen. Sie schwingen in Phase und verursachen eine Verstärkung des Signals. Die destruktive Interferenz tritt auf, wenn die Schallquellen nicht in Phase schwingen, und führt zu einer Abschwächung des Signals an dem betreffenden Punkt, wie in der obigen Abbildung verdeutlicht wird. In der Natur entsteht dieses Phänomen natürlicherweise durch die Interferenz von Direktschall und reflektiertem Schall. Interferenz kann praktisch genutzt werden, um als Geräuschunterdrücker zu dienen. Die einfache Idee besteht darin, Mikrofone in der Nähe der Geräuschquelle zu platzieren und in geeignetem Abstand einen Lautsprecher anzubringen, der ein phasenverschobenes Signal aussendet, um die Geräuschquelle auszulöschen. Diese Methode wird als aktive Schalldämpfung bezeichnet. Obwohl es auf den ersten Blick relativ einfach erscheint, einen Prototyp zu bauen, stoßen wir auf einige Probleme. Das erste Problem ist, dass wir dem System Schallenergie hinzufügen. Da die zugeführte Energie nicht selektiv genutzt werden kann (siehe ebene Schallwellen), wird unser Prototyp an bestimmten Punkten zu Verstärkungen führen. Geräusch ist oft von komplexer akustischer Natur und zeitabhängig, was uns ein weiteres schwieriges Problem bereitet. Es ist zwar nicht völlig unmöglich, aktive Schallunterdrücker herzustellen, aber mit heutiger Technologie sind sie im Vergleich zu passiven Schallabsorbern jedoch zu teuer.

Beugung

Dieses Phänomen ist einfach zu verstehen, aber seine Natur ist sehr komplex. Es tritt auf, wenn Schall um ein Objekt herum abgelenkt wird. Bei Beugung wird die Wellenfront gestört, und das Ergebnis ist, dass wir beispielsweise um Ecken hören können. Der Anteil des Schalls, der gebeugt wird, hängt von der Form des abschirmenden Objekts und den Schallcharakteristiken ab. Niedrigfrequente Komponenten der Schallcharakteristik werden durch kleine Objekte nicht gestört. Dagegen werden die hochfrequenten Komponenten, die eine viel kleinere Wellenlänge aufweisen, leicht durch verschiedene abschirmende Objekte im Weg beeinträchtigt. Alle haben wir bereits beobachtet, wie Wasserwellen mit langen Wellenlängen nicht von Bojen beeinflusst werden, die zufällig im Weg liegen.

Diffraction niedriger Frequenzen und Reflexion höherer Frequenzen.

Das Beugungsphänomen wird nicht bei der geometrischen Interpretation der Schallausbreitung berücksichtigt, da das Hauptpostulat der geometrischen Interpretation die geradlinige Natur von Schallwellen ist. Bei komplexen Schallcharakteristiken mit breitem Frequenzspektrum und incoherenter Schallquelle kann auch Interferenz vernachlässigt werden [5].

Refraktion

Schall, der über lange Strecken wandert, wird mit hoher Wahrscheinlichkeit unterschiedlichen Temperatur- und/oder Strömungsänderungen ausgesetzt. Wenn sich Schallwellen in Richtung des Gradienten dieser Veränderungen bewegen, werden sie abgelenkt, und das Ergebnis lässt sich am ehesten mit einer optischen Linse vergleichen. Natürlicherweise tritt Refraktion auf, wenn es eine Temperaturinversion bzw. Rückenwind und einen Temperaturlapse bzw. Gegenwind gibt. Bei Räumen unter 10.000 m³ können wir diese Effekte vernachlässigen, da die Temperaturunterschiede nicht einige ganze Grad erreichen und Wind in geschlossenen Räumen normalerweise nicht auftritt. Hinzuzufügen ist, dass die Körperwärme des Menschen, die eine Hülle um ihren Körper bildet [6], die erforderlichen Temperaturunterschiede aufweist, aber ihre Ausdehnung in der Regel so begrenzt ist, dass sie keine wesentliche Wirkung auf die Schallwahrnehmung hat.

Brechung von Schall aufgrund von Wind und Temperaturänderungen.

Resonanz

Wenn eine treibende Kraft auf ein schwingendes System wirkt, wird das System mit der Frequenz der treibenden Kraft schwingen. Sobald die Anregung abgeschaltet wird, passt sich das System an seine natürliche Frequenz an. Diese Frequenz wird als Resonanzfrequenz bezeichnet und ist ein äußerst wichtiger Faktor bei Berechnungen aller schwingenden Systeme. Theoretisch kann fast alles in der physikalischen Welt als Taylor-Reihe dargestellt werden. Wenn wir alle Terme höher als zweiter Ordnung in dieser Taylor-Reihe vernachlässigen, bleibt eine Differentialgleichung zweiter Ordnung übrig, die wir als schwingendes System erkennen. Diese grobe Näherung deutet darauf hin, dass alles in der Natur ein schwingendes System ist. Ein schwingendes System kann auf viele verschiedene Weisen beschrieben werden, aber die am häufigsten verwendete Methode ist mit der Q-Faktor.

Berechnung der Q-Faktor (3 dB entsprechen der Hälfte der maximalen Leistung).

Die Bedeutung des Q-Faktors in Anwendungen wie Radioempfängern, Lautsprechern und Musikinstrumenten ist enorm. Damit ein Radioempfänger eine gute Selektivität (Auswahlfähigkeit) aufweist, ist ein hoher Q-Wert im Selektormodul (HF-Stufe) erforderlich, das den gewünschten Sender aus den Radiowellen herausfiltert. Lautsprecherkonstrukteure sollten im Allgemeinen Konstruktionen mit niedrigem Q-Wert verwenden, um Verfärbungen des Klangbildes zu vermeiden. Bei Musikinstrumenten soll hingegen die charakteristische Eigenart des Instruments verstärkt werden, weshalb der Instrumentenbauer unendlich lange feilt und schleift, bis das Instrument die richtigen Resonanzeigenschaften aufweist.

Direktivität

Sender, die abstrahlend sind, haben keine klare Richtung ihrer Abstrahlung, da sie gleichmäßig in alle Richtungen ausgestrahlt werden. Dies gilt auch für Empfänger, jedoch mit dem Unterschied, dass Schallwellen dort entgegengesetzt gerichtet sind statt weggerichtet. Die meisten Sender sind jedoch nicht abstrahlend, sondern weisen eine gewisse Richtwirkung bei der ausgesandten Information auf. Diese Richtwirkung ist zudem frequenzabhängig, wie die untenstehenden Abbildungen zeigen. Dies macht deutlich, dass niedrige Frequenzen viel abstrahlender sind als hohe. Erschwerend kommt hinzu, dass die Richtwirkung von der Konstruktion des Senders abhängt.

Vereinfachte Darstellung der Richtwirkung einer Trompete und eines Cellos bei verschiedenen Frequenzen. Ausschnitt aus [10].

Nachhall

Das erste, was der Hörer hört, ist das Direktschall von der Schallquelle, der geradlinig zu seinen Ohren wandert. Dies ist das Gesetz der ersten Wellenfront, und L. Cremer war der Erste, der diese Tatsache erkannte und formulierte. Nach dem Direktschall folgen die frühen Reflexionen von Decke, Wänden, Boden und verschiedenen großen Objekten. Diese frühen Reflexionen legen einen längeren Weg zurück und erreichen unsere Ohren später, typischerweise innerhalb der ersten Zehntelsekunden. Wird eine sehr starke Reflexion nach den ersten Zehntelsekunden wahrgenommen, betrachten wir sie als Echo. Ein Echo ist im Gegensatz zum undeutlichen, verschwommenen Signal des Nachhalls eine klare, wahrnehmbare Schallsignatur. Lärm, der später eintrifft und keine Reflexionen im eigentlichen Sinne sind (Höherordnungsreflexionen), wird als Nachhall bezeichnet. Die Dauer des Nachhalls, die ein wesentlicher Bestandteil akustischer Berechnungen ist, kann mit der Sabine-Formel berechnet werden. Es gibt verschiedene Formeln zur Berechnung der Nachhallzeit, aber die genannte ist diejenige, die am besten ihrem Zweck in allgemeinen Modellen dient. Nachdem wir die Nachhallzeit (T60T_{60}) berechnet haben, können wir verschiedene akustische Qualitätskriterien für den Raum anwenden. Diese Qualitätskriterien nutzen das Impulsantwortverhalten des Raumes, das in visueller Form als Reflexionsdiagramm bezeichnet wird und eine Funktion des Schalldrucks in Abhängigkeit von der Zeit darstellt (siehe Abbildung 1.10).

Um die Impulsantwort des Raumes zu erhalten, erzeugen wir eine sehr kurze Energieimpulsform, die Dirac-Impuls. Eine Dirac-Impuls ist eine Impulsform, deren gesamte Energie im Startmoment konzentriert ist – siehe Anhang B für die vollständige Definition. Diese Impulsform kann mit guter Annäherung durch eine Pistole oder einen Klaps erzeugt werden. Die am häufigsten verwendeten Qualitätskriterien sind Klarheit, Deutlichkeit, Anstiegszeit und seitliche Effizienz. Diese wurden experimentell subjektiv entwickelt, sind aber bei akustischen Bauvorhaben sehr nützlich.

Mögliche Impulsantwort eines Raumes. Td ist das Direktschall, Tr ist der Eintritt der Nachhallzeit, was eine unscharfe Grenze darstellt, und T60T_{60} ist die Nachhallzeit (Reverberationszeit). Siehe Anhang B für Formeln.

Dispersion

Wenn Schall in Medien propagiert, die verschiedene Frequenzen mit unterschiedlichen Geschwindigkeiten übertragen, tritt Dispersion auf. Dieses Phänomen tritt häufig auf, wenn Schall in viskosen Flüssigkeiten und dicken Gasen wandert. In diesen Medien nimmt die Schallgeschwindigkeit mit steigender Frequenz zu; beachten Sie, dass dies im direkten Gegensatz zur optischen Dispersion in gewöhnlichem Glas steht.

Doppler-Effekt

Bisher haben wir nur ruhende Schallquellen und Schallempfänger betrachtet. Lassen wir Schallquellen und Empfänger sich im Raum bewegen, werden die Schallwellen in Bewegungsrichtung verdichtet. Diese Verdichtung führt dazu, dass die Klangcharakteristik in eine höhere Frequenz verschoben wird. In Richtung der Entfernung dehnen sich die Schallwellen aus, und eine Frequenzverschiebung nach unten ist die Folge. Dieses Phänomen tritt auch bei Licht auf, weshalb wir erkennen können, ob ein Himmelskörper auf uns zubewegt oder sich von uns entfernt.

Der Doppler-Effekt ist nach dem österreichischen Physiker Christian Doppler benannt. Er bemerkte, dass das Pfeifen des Zuges, der ihn vom Bahnhof wegfuhr, seine Klangcharakteristik veränderte. Es war jedoch nicht nur der Doppler-Effekt, den er hörte – die Brechung existierte gleichzeitig, da sich um den Zug bei Bewegung turbulente Strömungen bilden. Diese turbulenten Strömungen werde ich nicht detaillierter behandeln, da es allgemein akzeptiert ist, dass es sich um chaotische Systeme handelt und die Rechenleistung, die erforderlich ist, um solche Systeme numerisch zu lösen, enorm ist.

Klangwahrnehmung

Im alltäglichen Leben interessieren wir uns nicht für die Klangqualität, die unsere Ohren erreicht. Erst beim Hören von Musik und Sprache, wenn wir den Vortragsraum, die Oper, das Theater oder das Kino besuchen, verlangen wir eine bestimmte Klangqualität. Nachfolgend finden Sie einige ausgewählte Kriterien aus [7], die der Zuhörer zur Charakterisierung der Klangqualität verwenden kann.

Klarheit (Clarity)

Hohe Bewertungen in dieser Kategorie erfordern ein akustisches System, das ein breites Frequenzspektrum wiedergibt, eine flache Frequenzgangkurve aufweist und geringe nichtlineare Verzerrungen aufweist. Das Kriterium der nichtlinearen Verzerrung ist zu berücksichtigen, wenn wir Wiedergabesysteme wie Lautsprecher usw. betrachten.

Helligkeit, Schärfe & Fülle

Wenn das akustische System hohe Frequenzen mit leicht übertriebenem Klang wiedergibt, wird dies als Helligkeit (brightness) wahrgenommen. Bei noch stärker übertriebenem Klang entwickelt sich diese Wahrnehmung zur Schärfe (sharpness), teilweise zu Schrillheit. Das Gegenteil, wenn die niedrigen Frequenzen dominieren, wird als Fülle (fullness) bezeichnet.

Raumerlebnis & Nähe

Diese Kriterien sind nahezu selbsterklärend – das Raumerlebnis (spaciousness) nimmt zu, wenn das hochfrequente Material (typischerweise der Bereich von 500 bis 4000 Hz), das unsere Ohren erreicht, signifikante Unterschiede (geringe Korrelation) aufweist. Je geringer diese Unterschiede sind, desto näher erscheint die Klangquelle dem Zuhörer.

Lautstärke (Loudness)

Dieses Kriterium ist selbsterklärend, darf jedoch nicht mit Schärfe verwechselt oder als sehr unangenehme Wahrnehmung betrachtet werden.

Das Hörselorgan

Hier folgt eine kurze Einführung in das Ohr und seine Anatomie. Zudem werde ich kurz auf die neueren Techniken der Audiokompression eingehen.

Anatomie des Ohrs

Das menschliche Gehörorgan. Der Schall wird im Gehörgang gebündelt, dann im Mittelohr verstärkt und schließlich im Innenohr in elektrische Impulse umgewandelt. Das Innenohr enthält auch das Gleichgewichtsorgan.

Die Ohren sind unsere Antennen zur Aufnahme von Schall und lassen sich in drei Hauptteile gliedern (siehe obige Abbildung). Das äußere Ohr, dessen Form einer Trompete ähnelt, wirkt als gerichteter Empfangsverstärker. Der Leser sollte sich an die Richtwirkung der Trompete aus dem vorherigen Abschnitt erinnern. Die Verstärkung ergibt sich daraus, dass eine große Schalldruckfläche am äußeren Ohr auf eine kleine Schalldruckfläche im Innenohr übertragen wird; da die Energie gleich bleibt, aber konzentrierter ist, kommt es zu einer Verstärkung des Schalls (der Druck steigt mit abnehmender Fläche). Laut Shaw [8] werden Frequenzen über etwa 2 kHz im komplexen Aufbau des äußeren Ohrs sowohl reflektiert als auch resonant, was zu einer Färbung des empfangenen Schalls führt.

Wenn die Schallwellen die Trommelhaut erreichen, nachdem sie vom Kopf diffraktiert und vom äußeren Ohr gefärbt wurden, werden die Luftdruckänderungen in Flüssigkeitsdruckänderungen im Mittelohr umgewandelt und anschließend in elektrische Nervenimpulse im Innenohr, die die Signale zur weiteren Analyse an das Gehirn senden. Unsere Ohren sind am empfindlichsten im Bereich um 4 kHz und am wenigsten empfindlich im Bassbereich, wie in Abbildung 1.12 dargestellt. Für weiterführende Lektüre empfehle ich die „Encyclopedia Britannica“ [9].

Die Hörschnecke erhält ihre Informationen nicht nur über das äußere Ohr, sondern unser Schädel liefert einen großen Teil des Schalls, da Knochen eine gute Schallleiter sind. Ein einfaches Experiment: Beißen Sie in eine mechanische Armbanduhr – Sie können das Ticken „hören“.

Wenn wir mit Kopfhörern hören, fehlt diese zusätzliche Knochenleitungsinformation, und der Klang wirkt etwas „fahl“, aber nicht völlig ohne Charakter. Unsere eigene Stimme reist hauptsächlich über den Schädel. Deshalb empfinden wir es als unangenehm, unsere eigene Stimme nach einer Bandaufnahme zu hören: Der Klang wird stark und auf unterschiedliche Weise verfärbt. Etwas, das das Gefühl der Klangwahrnehmung weiter vertieft und bei Kopfhörernutzung nicht auftritt, ist das Empfinden von Schall im Bauch, besonders bei sehr tiefen Tönen mit hohem Schalldruck. Ein Faktor, den die meisten nicht kennen oder nicht beachten, ist, wenn wir nach einer Weile im Freien bei Kälte hineingehen und uns aufwärmen. Um vollständig zu genießen, beginnen wir, etwas Musik zu hören. Was dann wahrgenommen wird, ist, dass alles wie Müll klingt, da unsere Trommelfelle nach dem Aufenthalt im Freien steif sind. Es gibt weitere Gründe, warum es so klingt, aber der größte ist der genannte. Bei allen größeren Klimaveränderungen tritt dieses Phänomen auf, aber die Intensität der Wahrnehmung ist sehr individuell.

Der Schalldruck, der erforderlich ist, damit das Ohr verschiedene Frequenzen mit derselben Lautstärke wie ein Referenzton von 1 kHz wahrnimmt. Diese Kurven werden als Phon-Kurven bezeichnet. Freihandzeichnung der Internationalen Organisation für Normung, Empfehlung R226.

Maskierung

Der Schallpegel einer Klangquelle, die mit anderen Klangquellen interagiert, wird durch diese beeinflusst. Diese Beeinflussung heißt Maskierung, und die Grundfrequenz der interagierenden Klangquellen bestimmt, wo im Frequenzband die Maskierung am stärksten wirkt. Die Obertöne der Grundfrequenz tragen zur Maskierung in höheren Frequenzen bei, während die Unter-Töne – die seltener und gedämpfter sind – in den niedrigeren Frequenzbereichen beitragen.

Dies ist eine vereinfachte Darstellung des Ganzen, da komplexer Schall, der nicht aus der Musikwelt stammt, keine klare Grundfrequenz mit harmonischer Natur aufweist. Es kann etwas verwirrend erscheinen, dass ein Klang eine undeutliche Grundfrequenz hat; hier kommt die Erklärung: Die Grundfrequenz kann als die erste Frequenz definiert werden, die in einer Gesamt-Frequenzanalyse des Schalls auftritt. Lassen wir die Grundfrequenz zeitlich variieren (kleine Zeitintervalle, die kleiner als ca. 30 ms sind), wie dies in komplexen Kontexten meist der Fall ist, wird die Grundfrequenz undeutlich. Was die rein musikalischen Klänge betrifft, ist Letzteres etwas überflüssig, da die meisten Töne mit undeutlichen Grundtönen dissonant sind und in „echten“ musikalischen Stücken nicht verwendbar. Die harmonischen Obertöne der Grundtonfrequenz können stärker sein als die Grundton selbst, und für alle Musikinstrumente sind diese Obertöne von großer Bedeutung. Eine weitere Farbgebung der Klangcharakteristik eines Instruments ergibt sich, wenn die stärkste Oberton frequenz konstante Energie unabhängig von der Grundtonfrequenz aufweist (Formanten). Für eine umfassende Informationsaufnahme zu Musikinstrumenten verweise ich das interessierte Publikum auf [10,11].

Hörbarkeitsschwelle für verschiedene Frequenzen mit (a) isoliertem, (b) bandbegrenztem Laut (400 ± 50 Hz) bei 80 dB und (c) reinem 400-Hz-Ton bei 80 dB als Maskierungsgeräusch. Freihandzeichnung von Donald B. Hall, Musical Acoustics: An Introduction, Wadsworth, Belmont, CA 1980.

Die Maskierungswirkung ist nicht immer unerwünscht, da sie schlimmere Verzerrungen verbergen kann, die im musikalischen Kontext viel dissonanter sind. Wenn Schallquellen in derselben Zeit- und Frequenzdomäne interagieren, spricht man von simultaner Maskierung. Aus den vorherigen Überlegungen ist klar, dass Töne mit hohen Niederfrequenzkomponenten Töne mit hohen Hochfrequenzkomponenten leichter stören als umgekehrt. Meistens wirken die Schallquellen jedoch nicht in derselben Zeitdomäne; dann spricht man von zeitlicher Maskierung. Wir haben zwei Arten der zeitlichen Maskierung: Vorwärtsmaskierung und Rückwärtsmaskierung. Die Vorwärtsmaskierung entsteht durch Effekte, die nach der physischen Beeinflussung unserer Ohren verbleiben. Alle haben wir schon einmal einem sehr lauten Ton ausgesetzt, der uns für eine kurze Zeit leicht taub gemacht hat.

Das Beispiel mag vielleicht übertrieben sein, aber das Prinzip und seine Wirkungen sind ständig vorhanden – nur weniger ausgeprägt als im Extremfall. Da unser Gehirn Informationen parallel und mit unterschiedlichen Geschwindigkeiten verarbeitet, tritt auch das Umgekehrte auf. Dies kann für einige Leser etwas seltsam erscheinen; hier kommt die Erklärung: Besonders wenn das spätere Signal viel lauter ist als das vorherige, neigen die Neuronen [12] dazu, das lautere Signal „in Panik“ zu behandeln, wodurch sie das schwächere Signal „vergessen“. Maskierung hat derzeit eine tatsächliche praktische Anwendung in Audio-Produkten. Beispiele hierfür sind Philips DCC (Digital Compact Casette) und Sonys MD (Mini Disc). Um Daten effizient ohne Verluste in digitaler Form zu komprimieren, können wir unter anderem Huffman-Codierung verwenden, die Daten je nach Datenstrom um bis zu 90 % komprimiert.

Wenn es sich um Audio und Bild handelt, können wir einen gewissen Verlust an Originaldaten akzeptieren, um eine noch höhere Kompressionsrate zu erzielen. Hierfür können wir fraktale Kompression einsetzen, doch diese Technik ist sehr langsam, wenn Echtzeit-Aufnahmen auf Medien erfolgen sollen. Was bleibt, ist eine Idee, die sowohl effizient als auch sicher ist.

Was die Hersteller entwickelt haben, ist die Aufteilung des Frequenzbands und die Analyse der Teile im Vergleich zueinander, um zu berechnen, welche Frequenzbänder informationsrelevant sind. Der Trick besteht jedoch darin, überflüssige Informationen in diesen Trägern zu entfernen, die möglicherweise nicht hörbar oder sichtbar sind. Beachten Sie, dass ich „MÖGLICHERWEISE“ schreibe, da die Kriterien, nach denen dieser Entfernungsvorgang berechnet wird, sehr individuell sind. Diejenigen, die nicht besonders anspruchsvoll hinsichtlich des Klangs sind und eigentlich nie die Musik auf ihrer Stereoanlage genau gehört haben, werden sicherlich meinen, dass es gleich klingt. Es gibt jedoch eine erhebliche Anzahl von Menschen, die Musik und Klanglandschaften über vieles andere lieben, und diese sind sehr anspruchsvoll hinsichtlich der Klangqualität und können Unterschiede leicht wahrnehmen.

Akustischer Reflex

Die weniger bekannte Reflex in unserem Körper ist der akustische Reflex. Dieser tritt bei den meisten Menschen unwillkürlich auf, wenn Schalldruckwellen über 80 dBA ihre Ohren erreichen. Der Reflex dient entweder dem Schutz unserer Ohren vor lauten Geräuschen oder vor unserem Kauen und Sprechen. Welcher dieser beiden Schutzzwecke der Reflex tatsächlich erfüllt, ist unter Medizinern umstritten; meine eigene Auffassung ist jedoch, dass beide allein ausreichend sind, damit die Natur diese Lösung evolutionär entwickelt hat. Die Reaktionsgeschwindigkeit des Reflexes liegt bei der Schwelle bei etwa 150 ms und bei sehr lauten Geräuschen bei etwa 10 ms [13]. Das Problem mit diesem Reflex ist, dass das Trommelfell gespannt wird, was zu einer Verringerung der Verstärkung führt (was an sich gut ist), aber die Frequenzcharakteristik nichtlinear verändert (was schlecht ist). Sobald das laute Geräusch entfernt wird, lässt der Reflex langsam nach. Schwache Töne (die eigentlich vollständig hörbar wären, wenn der Reflex völlig entspannt wäre), die innerhalb der Entspannungszeit auftreten (die von Faktoren wie Mensch, Stimmung und Klima abhängt), werden nicht gut wahrgenommen, da der Reflex den Schalldruck um 10 bis 30 dB dämpft, abhängig von den Schallcharakteristiken.

Allerdings hat er eine interessante Funktion für Personen, die diesen Reflex freiwillig beeinflussen können: Er dämpft Hintergrundgeräusche während Prüfungen oder Vorträgen. Diese „Funktion“ kann sogar das Gespräch eines streitbaren Politikers dämpfen. Auch im häuslichen Umfeld kann der Reflex nützlich sein, wie folgender kurzer Witz zeigt:

Den bekymrade fru Svensson ringer sin husläkare: Snälla doktorn, det är något fel på min man. Jag kan tala till honom i timmar och efteråt verkar han inte ha hört ett ord!

Doktorn: Det är ingen sjukdom, det är skicklighet!

Leider funktioniert der Reflex nicht bei sehr hochfrequenten Schreien von Kleinkindern, deren Lautstärke-Ressourcen bei echtem Bedarf enorm sind. Bei transienten Impulslauten (z. B. Dirac-Impuls) kann der Reflex nicht rechtzeitig aktiviert werden, und die Fähigkeit, den Reflex in solchen Situationen selbst zu beeinflussen, ist von äußerster Wichtigkeit.

Audioverarbeitung

It is the nature of all greatness not to be exact.

Edmund Burke

In diesem Kapitel habe ich eine sehr kurze Zusammenfassung zur Entwicklung der Signalgenerierung verfasst. Dies habe ich getan, um die starke Seite des digitalen Mediums mit größtmöglicher Kraft zu unterstreichen. Abschließend behandele ich die Probleme, die auftreten, wenn wir Signale mithilfe von Computern verarbeiten. Hier zeige ich die Nachteile auf, die mit der Diskretisierung kontinuierlicher Signale verbunden sind.

Beim Diskretisieren ist eine „exakte“ Arithmetik bei Berechnungen erforderlich, im Gegensatz zur analogen Entsprechung, bei der wir Addition und Multiplikation mithilfe von Operationsverstärkern durchführen können. Beachten Sie, dass „Exaktheit“ in beiden Fällen verloren geht. Ist es digital, geschieht dies bei der Umwandlung vom analogen Signal; sind es kontinuierliche Signale, geschieht dies während der Berechnungen.

Da ich nur Dinge behandelt habe, die mein Ziel in der Abschlussarbeit unterstreichen, wirkt die Darstellung möglicherweise etwas knapp. Um alles aufzuführen, was mich in diesem Bereich beeinflusst hat, wäre ein ganzes Buch erforderlich. Daher verweise ich alle, die stark an Audio-Produktion interessiert sind, auf die umfangreichen Fakten und Referenzen im „Audio Engineering Handbook“, zusammengestellt von K. Blair Benson.

Analoges Audio

Am Ende des letzten Jahrhunderts erfand Thomas Alva Edison einen analogen Tonaufnehmer, mit dem der Benutzer bis zu 30 Sekunden Audiodaten aufzeichnen konnte. Edisons Tonaufnehmer gravierte einen Pfad auf eine mit Folie überzogene Zylinderfläche, und die Klangqualität war erstaunlich gut. Später erfand der dänische Erfinder Valdemar Poulsen den ersten magnetischen Tonaufnehmer. Die Audiodaten wurden auf einen Stahldraht aufgezeichnet und klangen besser als bei Edisons Maschine, da die elektrische Stärke aus den magnetischen Schwankungen höher war als aus Edisons Gravier-Schwankungen. Seitdem wurde diese Technik weiter verfeinert, um Ton mit sehr hoher Qualität wiederzugeben, sodass er natürlich und realistisch klingt.

Die ersten Geräte waren mono, d.h. es stand nur eine Audiospur zur Verfügung, was sich als unzureichend für eine räumliche Klangwiedergabe erwies. Dies erkannten die meisten, die an der Entwicklung analoger Audio-Wiedergabe arbeiteten, und es dauerte nicht lange, bis Stereo-Aufnahmen entwickelt wurden. Um ein räumliches Hörerlebnis des aufgezeichneten Tons zu erzielen, muss man hohe Frequenzen bei der Wiedergabe wiedergeben können – alles im Einklang mit der Wahrnehmung von Entfernung und Richtung durch das Ohr, wie im vorherigen Kapitel beschrieben. Um das bescheidene (heute gemessen) Frequenzspektrum der früheren Maschinen zu erweitern, war ein neues Denken erforderlich, da der Stahldraht etwas unpraktisch war. BASF (Badische Anilin- und Soda-Fabrik) zögerte nicht lange, diese Gelegenheit zu nutzen. Bereits 1928 hatten sie eine Prototyp-Version des heutigen Magnetbands, das damals aus Eisenkarbonyl auf Papierbasis bestand. Diese mit magnetischem Überzug versehenen Bänder werden seitdem sowohl für Audioaufnahmen als auch zur Speicherung von Daten aus Computern verwendet. Das Problem ist, dass das Medium sequentiell ist und die Suchzeit, um ein bestimmtes Audio- oder Datenelement zu finden, manchmal sehr frustrierend ist. Um die Audioverarbeitung zu erleichtern, haben Hersteller Geräte mit mehreren Kanälen entwickelt. Derzeit gibt es Bandrecorder mit 1 bis 96 Kanälen zur Aufnahme von Audiodaten oder Steuersignalen. Sicherlich existieren Produktionsstudios mit noch leistungsfähigeren Bandrecorders, aber die meisten Musikproduzenten benötigen nur 32 Kanäle oder weniger.

Um die High-Fidelity-Definition vollständig zu vervollständigen, muss die Dynamik des Schalldrucks rausch- und verzerungsfrei wiedergegeben werden. Außerdem sollte der Nachhall in möglichst hoher Genauigkeit nachgebildet werden, und bei Mehrkanalaufnahmen müssen die gegenseitigen Unterschiede vollständig erhalten bleiben [3,4].

Die Dynamik der besten Aufnahmestudios beträgt etwa 140 dB (Puk-Studio in Dänemark), was zunächst überflüssig erscheinen mag, da die meisten populären Musikformen ein sehr geringes Dynamikumfang aufweisen (typischerweise weniger als 20 dB). Allerdings ist einige seriöse Musik sehr dynamisch und erfordert hohe Dynamik, um sowohl die extrem lauten Passagen (fff = forte fortissimo) als auch die extrem leisen (ppp = piano pianissimo) vollständig erfassen zu können. Wenn wir die gesamte Klangwahrnehmung wirklich erleben möchten, sollten wir gemäß Tabelle 1.1 ein Wiedergabesystem mit einem dynamischen Umfang von etwa 130 dB verwenden. Für normale Menschen ist dies keine notwendige Voraussetzung und kaum in jeder Situation erforderlich. Für gelegentliche Klangerlebnisse, wie beispielsweise in einem Planetarium mit 1800180^0 Leinwand, kann es jedoch sehr bereichernd sein. Magnetband hat eine inhärente Grenze für das maximale dynamische Reichweite, die derzeit bei etwa 80 dB mit den besten Bandgeräten liegt. Um das dynamische Reichweite zu erhöhen, können wir den Ton durch einen Kompressor leiten, bevor er auf das Band aufgezeichnet wird. Es gibt verschiedene Kompressionssysteme, beispielsweise Dolby A, B, C, S, SR und dbx. Die Dolby-Rauschreduzierungssysteme komprimieren nichtlinear im Frequenzband, wie in Abbildung 2.1 dargestellt. Dolby SR hingegen verfügt über dynamische nichtlineare Frequenzbandsteuerung und erinnert etwas an die Unterdrückung von maskiertem Laut (siehe vorheriges Kapitel über Maskierung); das System entfernt jedoch keine Informationen, sondern verstärkt sie oberhalb der Bandrauschniveaus oder dämpft sie unterhalb der Verzerrungsgrenze.

Das letzte Beispiel, dbx, bietet eine lineare Kompression über das gesamte Frequenzband und für alle Signalpegel. Das Problem dabei, alles in einem Frequenzband zu erfassen, ist, dass die Bässe tendenziell schwanken (pumpen), ein Problem, das moderne digitale Systeme umgehen. Um das komprimierte Material abzuspielen, ist eine umgekehrte Prozedur erforderlich, die als Expansion bezeichnet wird. Beachten Sie, dass diese Kompression/Expansion keine Daten im Frequenz- oder Zeitbereich komprimiert oder erweitert, sondern nur in der Dynamik (vergleiche mit dem vorherigen Kapitel über Maskierung).

Kompression/Expansion von Signalen; die obere Grafik zeigt dbx Type I 1:2:1 Companding, die untere Dolby B. Bei dbx ist das Companding im gesamten Frequenzbereich linear, bei Dolby B hingegen frequenzabhängig. Die Dolby B-Grafik ist freihand aus dem „Audio Engineering Handbook“ von K. Blair Benson übertragen.

Digitales Audio

Obwohl digitale Medien neu erscheinen, existieren sie seit 1961, und die Theorie reicht bis 1937 zurück. Es dauerte fast 25 Jahre, bis die Forscher die Theorie in die Praxis umsetzen konnten, und heute können wir das digitale Audio „genießen“. Der Vorteil digitaler Speichermethoden besteht darin, dass der Umgang mit aufgezeichneter Information einfacher wird. Beachten Sie jedoch, dass es nicht einfacher wird, wenn wir das sequentielle Bandmedium beibehalten; daher ist ein intelligenteres Verfahren zur Datenspeicherung erforderlich. Um die Nutzbarkeit zu erhöhen, können Daten auf einer kreisförmigen Scheibe gespeichert werden. Ein weiterer Vorteil dabei ist, dass wir den Verschleiß des Mediums verringern. Mechanisch ist diese Lösung ebenso einfach wie eine Plattenspieler, aber die Toleranzen sind deutlich strenger. Die Bedeutung, möglichst wenige mechanische Komponenten in Konstruktionen zu haben, ist groß, da mechanische Zustandsübergänge viel Zeit in Anspruch nehmen und häufig unangenehme Eigengeräusche (Metall auf Metall) verursachen.

Die übliche Schallplattennadel, die versucht, ein kreuzmoduliertes graviertes Signal auf der Platte (links) zu folgen, und eine stark vereinfachte Darstellung der weniger mechanischen und digitalen Entsprechung (Laser-Nadel) rechts, die versucht, geätzte binäre Spuren zu verfolgen.

Das meiste in der Natur ist kontinuierlich, und Schallwellen sind keine Ausnahme. Beachten Sie jedoch, dass eine Diskontinuität auftritt, wenn wir die Schallwand „durchbrechen“; diese Diskontinuität wird als Explosion wahrgenommen, doch meistens sind Schallwellen deutlich sanfter. Da analoge Speichermaterialien prinzipiell eine sehr große Bandbreite haben, verfügen wir über ein breites Frequenzband. Moderne Videobandgeräte erfassen problemlos Informationen im Bereich von 0–3 MHz, und dies ist nur der Frequenzbereich. Wir können eine etwas zu hohe Auflösung des Materials vermuten, da unsere Ohren und Augen nur eine begrenzte Anzahl von Sinneszellen besitzen, die mit eingehenden Daten arbeiten können. Daher ist der Schritt zur Digitalisierung des analogen Materials nicht weit. Der Vorteil hierbei ist, dass wir die Datenmenge extrem stark komprimieren (theoretisch unendlich stark) und nicht länger umständliche und verworrene Speichermaterialien benötigen. Die heutige Technik zeigt vielleicht nicht vollständig die digitale Medienkraft, aber das folgende Rechenbeispiel sollte die meisten Zweifel zerstreuen. Nehmen wir an, dass wir mit Hilfe von Lasern (Light Amplification by Stimulated Emission of Radiation) und feinster Optik Informationen auf einige Nanometer genau aufspalten können. Ich betrachte dies als eine realistische Grenze, da bei kürzeren Wellenlängen radioaktive Strahlung erforderlich wäre, um die Aufspaltung zu bewältigen. Außerdem lassen wir eine Kugel mit einem Durchmesser von 1 cm digitale Informationen enthalten, wobei jedes Bit eine Kugel mit einigen Nanometern Durchmesser ist.

Dies gibt uns ungefähr 110181 \cdot 10^{18} Bytes zur Verfügung, und wenn wir vergleichen, wie viele heutige Compact Discs (CDs) benötigt würden, um diese Datenmenge zu speichern, ergibt sich ungefähr 3 Milliarden Stück. Mit anderen Worten: Wir können das Leben aller Menschen, in Textform sowie mit wichtigen Bildern und Tönen, in einigen solcher Kugeln speichern. Wenn wir die Informationen beispielsweise mit Huffman-Codierung komprimieren, erhalten wir Platz für weitere Daten und werden wahrscheinlich auf eine einzige Kugel reduziert; zusätzlich könnten wir alle Daten zur gesamten Weltgeschichte mit allen jemals aufgenommenen Bildern, Filmen, Schallplatten und Theaterstücken unterbringen.

Don't you think it's blinding??? You name it, you've got it!!!

Der größte Vorteil digital gespeicherter Informationen, die in nicht-sequentieller Diskform verfügbar sind, besteht darin, dass wir „Ausschneiden & Einfügen“ durchführen können, ohne die ursprünglichen Daten zu beschädigen. Früher musste der Benutzer direkt auf dem Band schneiden, um die gewünschte Reihenfolge zu erzielen. Um dies zu ermöglichen, ohne das Originalband zu beschädigen, musste eine Kopie erstellt und in dieser kopiert werden. Die Erstellung einer Kopie des Masterbands – falls wir eine hohe Qualität anstreben – nimmt unnötig viel Zeit in Anspruch, und die Qualität ist immer schlechter als beim Original. Wenn wir digitale Clips verwenden, lassen wir einen Computer die Sequenzen speichern, die wiedergegeben werden sollen, und in welcher Reihenfolge. Dies lässt sich sehr einfach durchführen, die Clips werden viel genauer und die Zeit, um die richtigen Schnittstellen in den Clippings zu finden, wird erheblich verkürzt. Dies ist die Sampling-Technik in ihrem Wesen, und das Verfahren wird als nichtlineare Bearbeitung bezeichnet.

Nichtlineare Bearbeitung wird auch für die Video-Produktion verwendet, aber die Menge an Speicher und Rechenleistung, die erforderlich ist, um dies flüssig zu ermöglichen, ist groß (einige Gigabyte Sekundärspeicher und einige zehn Megabyte Hauptspeicher sowie sehr gute Video-Prozessoren und hochwertige Software) und für gewöhnliche Menschen nicht zugänglich. Unabhängig davon, ob eine Verschlechterung der Audio- oder Bildqualität bei unserem Übergang zu digitalen Medien eintritt oder nicht, werden die erheblichen Zeitersparnisse die geringere Qualität mehr als wettmachen, und außerdem kann die Qualität bei digitalen Kopien beibehalten werden.

Wir können jedoch die Qualität von musikalischem Material verbessern, da wir wissen, wie die Charakteristika der Instrumente aufgebaut sind. Indem wir Obertöne synthetisch harmonisieren und mit deren Hilfe diskrete Signalartefakte glätten, können wir das Signal einer kontinuierlicheren Wiedergabe annähern.

Diskretisierungsstufe bei der Abtastung eines Signals mit einer 16-mal höheren Abtastrate als die Grundfrequenz des Signals.

Was natürliche Klänge betrifft, ist es nicht möglich, diese Methode direkt anzuwenden; vielmehr benötigen wir eine umfassende Umgestaltung des Algorithmus, und die Verwendung einer geeigneten Informationsaufteilung dürfte das Lösungsverfahren sein. Wenn wir die Audiodaten bereits bei der Speicherung in einen harmonischen und einen disharmonischen Anteil aufteilen, sind wir einen Schritt weiter. Den harmonischen Anteil behandeln wir wie Musik gemäß oben, während wir den disharmonischen Anteil durch kubische Splines approximieren (siehe Anhang B. Achtung! Dies ist lediglich ein Beispiel). Um diese Technik einfach anwenden zu können, benötigen wir einen leicht modifizierten AD/DA-Wandler (AD = Analog zu Digital, DA = Digital zu Analog).

Das Feine ist, dass wir Daten in Gleitkommadarstellung mit m signifikanten Bits in der Mantisse und e Bits im Exponenten speichern können, anstatt in einer einfachen diskreten Form mit m Bits in der Mantisse und ohne Exponent. Moderne, leistungsfähigere Signalprozessoren bewältigen diese Aufgaben problemlos, doch sie sind sehr teuer und natürlich nicht das Eigentum jedes Einzelnen. Das Charakteristische eines digitalen Signalprozessors (DSP = Digital Signal Processor) ist seine extrem hohe Rechenleistung bei Gleitkommadaten. In der nicht-kommerziellen Welt werden sie intensiv für Radar- und verschiedene Arten von Lenkwaffen eingesetzt.

Die ersten Bereiche, die diese DSPs für das allgemeine Publikum erschlossen haben, waren natürlich die Musikwelt. Die Schwierigkeiten, mit denen Musiker jahrzehntelang zu kämpfen hatten, waren nahezu gelöst; doch in ihrer „Technikverliebtheit“ verwenden einige Musiker die Technik falsch. Das Ergebnis ist, dass bestimmte Schöpfer sich in Effekten wie Delay, Chorus, Phasing, Flanging, Pitch-Shifting, Harmonisieren, Reverb und vielen weiteren verlieren. Dass sie die Technik falsch anwenden, bedeutet nicht notwendigerweise, dass es schlecht oder uninteressant klingt. Die Werke dieser Schöpfer haben keine reale Verbindung zu existierenden Musikinstrumenten oder Hörräumen, sondern üben eine starke mentale Wirkung auf den Zuhörer aus. Um diese Fähigkeit zur freien Kreativität nicht zu beschränken und das Material in irgendeiner Weise zu beeinflussen, ist Ausrüstung mit mindestens der gleichen Qualität wie die Instrumente der Schöpfer selbst erforderlich (wenn wir uns an ihre Spitze heranwagen wollen). Zu den letzten Anwendungsbeispielen für DSPs gehören Sprach- und Spracherkennungssysteme, Echtzeit-Bildverzerrer und Fingerabdruckerkennung. Es ist nun klar, dass die Diskretisierung eines kontinuierlichen Signals – sei es Ton oder Bild – zahlreiche gute Möglichkeiten bietet, die wir bis zum Äußersten nutzen müssen.

Rechnerischer Aspekt der Digitalen Audioverarbeitung

(Erklärungen zu den Formeln in diesem Abschnitt werden im Anhang B behandelt, um den Fluss nicht zu stören.)

Ein wichtiger Aspekt bei der Diskretisierung kontinuierlicher Signale ist die Geschwindigkeit, mit der wir eingehende Daten abtasten. Diese Abtastgeschwindigkeit wird als Abtastrate bezeichnet und weiterhin mit fSf_S bezeichnet. Unabhängig davon, ob es sich um Audio-, Bild- oder Sensordaten handelt, besitzt die Information eine bestimmte Bandbreite, die ich mit B bezeichne. Diese Bandbreite erstreckt sich von 0 Hz bis zur oberen Grenzfrequenz B Hz. Das Nyquist-Theorem sagt uns, dass wir eine fSf_S benötigen, die mindestens 2B2 \cdot B beträgt, um alle Informationen aus dem Signal rekonstruieren zu können. Bei der Betrachtung mehrerer Quellen, deren Anzahl ich mit S bezeichne, muss B die höchste Frequenz enthalten, die in einer Überlagerung aller Quellen vorkommt. Außerdem müssen alle Quellen dieselbe diskrete Informationsdatenbreite aufweisen, was ich mit der Auflösung des AD/DA-Wandlers in Bit bezeichne und als I bezeichne. Bei der Überlagerung (Addition) mehrerer Datenkanäle benötigen wir ein größeres IOUTI_{OUT} im Vergleich zu IINI_{IN}, um Informationen bei möglichen Überläufen nicht zu verlieren.

Dynamik6IDynamik \approx 6 \cdot I (dB) (0)

IOUT=IIN+Ceil(log2(S))I_{OUT}=I_{IN}+Ceil(\log_2(S)) (Bit) (1)

Im Zusammenhang mit mehreren Senderquellen haben wir in der Regel auch mehrere Empfänger (R). Auch wenn die Bandbreite des Empfängers größer ist, dürfen wir das System nicht mit unnötigen Daten überlasten. Wir ändern daher fSf_S nicht. Betrachten wir eine mögliche Simulation der Schallwellenausbreitung von ihren Quellen zu den Empfängern. Die frühen Reflexionen, die ich XEX_E (Early RefleXions, Einheit: Stück) nenne, sowie die Anzahl der Nachhallapproximationen, die ich XRX_R (Reverberation RefleXions, Einheit: Stück) nenne, sind ebenfalls rechnerisch gesehen übliche Quellen. Dies führt uns zu einer Erweiterung von (1):

IOUT=IIN+Ceil(log2(S+XE+XR))I_{OUT}=I_{IN}+Ceil(\log_2(S+X_E+X_R)) (Bit) (2) Wie viel Rechenleistung ist erforderlich, um alle diese Kanäle zu einer überlagerten Signale an den Empfängern hinzuzufügen? Ich werde die Einheit „op“ verwenden, was eine Addition plus eine Multiplikation bedeutet. Folgende Formel soll zur Berechnung der erforderlichen Rechenkapazität mit diesem NODIRAC-Algorithmus verwendet werden:

D=fS(S+XE+XR)RD=f_S \cdot (S+X_E+X_R) \cdot R (op/s) (3)

Um dies in Echtzeit durchzuführen, ergibt sich gemäß Formel (3) eine erschreckend hohe Rechenleistung, selbst für einen so einfachen Fall wie folgenden:

Problem 1:

Wir haben zwei Sender und zwei Empfänger. Die höchste Frequenz beträgt 20 kHz, und wir haben 23 Oberflächen, die frühere Reflexionen erzeugen. Außerdem approximieren wir den Nachhall mit 100 stochastisch exponentiell verteilten Zeitpunkte nach TrT_r (wenige am Anfang, viele gegen Ende), linear abnehmende Nachhallapproximationen. Wie viel Rechenleistung ist erforderlich, um dieses Problem mit dem NODIRAC-Algorithmus zu lösen?

Lösung:

Wir haben fSf_S = 40 kHz, S = 2, XEX_E = 23, XRX_R = 100 und R = 2. Die Einsetzung in (3) ergibt 10 Millionen op/s.

Wenn wir eine „echte“ Untersuchung eines Raumes durchführen möchten, können wir den Raum mit einer Dirac-Impuls von jeder Quelle zu jedem Empfänger abtasten. Wir bezeichnen diese Abtastraten der Dirac-Impulse als fDIRACf_{DIRAC}, und die Zeitdauer dieser Abtastungen, von der ersten Wellenfront bis zu einem Signalabfall um 60 dB, beträgt T60T_{60}. Lassen wir diese abgetasteten Raumsignale als Grundlage unserer Simulation dienen (anstelle der wenigen Reflexionen und Nachhallapproximationen), die wir als NOMIX-Algorithmus bezeichnen, dann sieht die Formel wie folgt aus:

D=fSSfDIRACT60RD=f_S \cdot S \cdot f_{DIRAC} \cdot T_{60} \cdot R (op/s) (4)

Gemäß Formel (4) benötigen wir dann einen Computer mit deutlich höherer Leistung, selbst für extrem einfache Fälle wie folgenden:

Problem 2: Wir haben zwei Sender und zwei Empfänger, und die höchste Frequenz beträgt 20 kHz. Mit Hilfe des Impulsantwortverlaufs einer Dirac-Impulsfunktion mit einer Dauer von 2 s und einer Abtastrate von 3125 Hz von allen Quellen zu allen Empfängern möchten wir die erforderliche Rechenleistung berechnen. Lösen Sie das Problem mit einem NOMIX-Algorithmus.

Lösung:

Wir haben fSf_S = 40 kHz, S = 2, fDIRACf_{DIRAC} = 3125 Hz, T60T_{60} = 2 s und R = 2.
Einsetzen in (4) ergibt 1 Milliarde Operationen pro Sekunde.

Es kann eine gute Idee sein, den erforderlichen Speicherbedarf bei diesen „exakten“ Simulationen zu berechnen. Für jede Quelle müssen wir MSM_S Bytes speichern, die durch folgende Formel gegeben sind:

MS=fST60IIN/8M_S=f_S \cdot T_{60} \cdot I_{IN}/8 (Bytes) (5)

Der gesamte Speicherbedarf beträgt bei Verwendung des Dirac-Impuls-Abtast-Speicherplatzes:

MTOT=S(MS+RfDIRACT60IIN/8)M_{TOT}=S \cdot (M_S+R \cdot f_{DIRAC} \cdot T_{60} \cdot I_{IN}/8) (Bytes) (6)

Problem 3:

Wie viel freier Speicherplatz ist erforderlich, wenn wir eine Informationsdatenbreite von 16 Bit haben und die restlichen Daten wie in Problem 2 sind?

Lösung:

Wir haben S = 2, fSf_S = 40 kHz, R = 2, fDIRACf_{DIRAC} = 3125 Hz, T60T_{60} = 2 s und
IINI_{IN} = 16. Einsetzen in (6) ergibt ca. 360 kB.

Wir erkennen das Absurde in diesem Zusammenhang: Wir benötigen einen Computer mit sehr hoher Rechenleistung und relativ wenig Speicher. Da Speicher normalerweise billiger ist als Rechenleistung, ist es daher eine gute Idee, die Arbeitslast neu zu verteilen. Wenn wir die Überlagerung der Quellen bereits bei der Diskretisierung durchführen und diese in R Speicherbereichen mit IOUTI_{OUT} Bit Informationsbreite verfügbar machen, erhalten wir folgende Formeln:

D=R(S+fDIRACT60)fSD=R \cdot (S+f_{DIRAC} \cdot T_{60}) \cdot f_S (Op/s) (7)
IOUT=IIN+Ceil(log2(S))I_{OUT}=I_{IN}+Ceil(\log_2(S)) (Bit) (8)
MTOT=RfST60IOUT/8M_{TOT}=R \cdot f_S \cdot T_{60} \cdot I_{OUT}/8 (Bytes) (9)

Diesen Algorithmus nenne ich MIXTHEM. Beachten Sie, dass er denselben Impulsantwortverlauf für jede Schallquelle verwendet und daher nicht dieselbe Filterantwort wie der NOMIX-Algorithmus liefert.

Problem 4: Wir haben zwei Sender und zwei Empfänger, und die höchste Frequenz beträgt 20 kHz. Mit Hilfe des Impulsantwortverfahrens, basierend auf einem Einrichtimpuls mit einer Dauer von 2 s und einer Abtastfrequenz von 3125 Hz von allen Quellen zu allen Empfängern, möchten wir die erforderliche Rechenleistung und den Speicherbedarf berechnen. Wir lösen das Problem mit dem MIXTHEM-Algorithmus.

Lösung:

Wir haben fSf_S=40 kHz, S=2, fDIRACf_{DIRAC}=3125 Hz, T60T_{60}=2 s, IINI_{IN}=16 und R=2. Die Einsetzung in (7) ergibt 500 Millionen Operationen pro Sekunde. Die Einsetzung in (8) ergibt IOUTI_{OUT}=17, was bedeutet, dass wir mindestens IOUT=32I_{OUT}=32 benötigen, um die Speicherverwaltung so einfach wie möglich zu gestalten. Weiterhin ergibt die Einsetzung in (9), dass wir 625 kB für die Lösung dieses Problems benötigen.

Die NOMIX- und MIXTHEM-Algorithmen liefern nicht dieselben Ergebnisse, da sie unterschiedliche Dirac-Faltungen verwenden. Es mag daher unklug erscheinen, diese zu vergleichen. Das Kernproblem besteht darin, Schallquellen in schallreflexionsfreien Räumen stereoskopisch abzutasten und in einer Datenbank zu speichern. Von dieser Datenbank lassen wir den Computer dann die richtigen Töne zu den richtigen Zeitpunkten abrufen, um diese anschließend durch den MIXTHEM-Algorithmus zu filtern (dies wird „fast“ korrekt). Selbst mit bereits vorausberechneten Impulsantworten von allen Quellen zu allen Empfängern erfordert die Simulation solcher Wellenausbreitungen eine enorme Rechenleistung.

Weder der NOMIX- noch der MIXTHEM-Algorithmus sind vollständig korrekt im Vergleich zur Natur; selbst wenn sie es wären, sollte doch deutlich werden, dass eine hochentwickelte Hardware erforderlich ist, die dies „automatisch“ bewältigt. Ich meine damit nicht die einfachen DSPs, die derzeit verfügbar sind, sondern etwas viel ausgefeiltere Geräte, die tatsächlich nicht auf digitale Addition und Multiplikation zur Berechnung angewiesen sind. Wenn wir das Kriterium vernachlässigen, dass die abgetasteten Dirac-Impulse in Echtzeit fehlen, können wir einen Overlap-Add-Algorithmus verwenden [14]. Mit diesem Algorithmus wird etwa ein Tausendstel der Rechenleistung der NOMIX-Algorithmus benötigt, aber die eingehenden Daten werden mit 2T602 \cdot T_{60} verzögert [15]. Die Hardware-Implementierung des Overlap-Add-Algorithmus ist kommerziell als FDP-1-Chip von Lake erhältlich [16]. Für kleine Räume kann dies nützlich sein, aber für größere Hallen können wir diese Lösung vernachlässigen, da Echtzeit-Feedback mit einer Verzögerung von mehreren Sekunden nicht möglich ist. Eine Analogie zur Realität ist das Steuersystem der JAS-Plattform, das mehrfach diesen Mangel gezeigt hat (insbesondere wenn der Pilot die Verzögerung nicht bewusst wahrnimmt).

Darüber hinaus sind neue DSP-Chips von Texas Instruments (die im Herbst 1994 kommerziell eingeführt wurden) führend in Bezug auf Rechenleistung (>1>1 Milliarden Gleitkommaoperationen pro Sekunde). Mit Hilfe einiger dieser leistungsstarken DSPs können wir das Faltungsproblem in Echtzeit lösen, aber die Kosten werden wahrscheinlich für gewöhnliche Nutzer hoch sein, und wir müssen auf Echtzeit-Faltung für die Allgemeinheit warten. Beachten Sie, dass ich nicht direkt auf den DSP-Chip abziele, sondern auf das sehr schnelle Speichersystem, das angeschlossen sein muss. Mit einer groben Abschätzung werden etwa 0,5 ns schneller Speicher benötigt (wenn die Daten in serieller Form vorliegen), um die Leistung dieser DSPs optimal auszunutzen. Es sei hinzugefügt, dass heutige μ\mu-Computer etwa 70 ns schnellen Speicher haben, was darauf hindeutet, dass wir die Daten in etwa 128 gleichmäßige Teile aufteilen und diese parallel falten sollten. Die parallele Lösungsform ist rein hypothetisch, da ich die Hardwarespezifikationen nicht vollständig berücksichtigt habe.

Virtuelle Realität

Between ingenuity and the analytic ability there exists a difference far greater, indeed, than that between the fancy and the imagination, but of a character very strictly analogous. It will be found, in fact, that the ingenious are always fanciful, and the truly imaginative never otherwise than analytic.

Edgar Allan Poe

Dieses Kapitel behandelt virtuelle Realität und richtet sich an Personen, die sich nicht in der Geschichte auskennen. Da dieser Bereich der Informatik relativ neu ist (NASA begann damit Mitte der 1980er Jahre, und VPL Research machte VR 1989 zur allgemeinen Wahrnehmung), versuche ich im ersten Teil zu definieren, was „virtuelle Realität“ ist, und im anschließenden Teil deren Anwendungsbereiche zu erläutern. Vorausgesetzt wird, dass der Leser sich der hohen Rechenanforderungen bewusst ist, die dreidimensionale Visualisierung (im Extremfall Echtzeit-Video-Ray-Tracing, ein pro Auge) und Auralisierung (im Extremfall Echtzeit-Faltungen von Impulsantworten, berechnet mittels Audio-Ray-Tracing, ein pro Ohr) mit sich bringen.

In der Definition verwende ich den Begriff „Detailreichtum“ in dem Sinne, dass die detaillierte Natur vollständig hinsichtlich Reflexion, Absorption, Interferenz, Beugung, Brechung, Diffusion, Resonanz und Dispersion nachgebildet werden soll. Ich habe nicht über die verrückten Ideen in der Cyberkultur geschrieben, sondern über die realistischeren und vollständig realisierbaren Konzepte.

Definition von VR

Um Virtuelle Realität (engl. Virtual Reality = VR) definieren zu können, muss ich die wichtigsten Merkmale der realen Welt beschreiben. Wir nehmen die Realität wahr, indem wir sehen, hören, fühlen, riechen und schmecken. Wenn wir in der Natur sind und die Schwankungen der Bäume, das Wirbeln des Wassers oder die Bewegung der Wolken bewundern, finden wir es vielleicht interessant, diese Phänomene zu beobachten. Die Grundlage unseres Interesses liegt darin, dass das, was wir sehen, eine hohe Detailfülle aufweist und/oder sich ständig bewegt. Neben der Wahrnehmung von Breite, Höhe und Tiefe können wir die Welt aus einem beliebigen Punkt betrachten.

(1) Eine gute VR-Umgebung sollte skalierte, sanft bewegte dreidimensionale Objekte mit hoher Detailfülle aufweisen. In diesem Modell müssen wir die Umwelt aus einem beliebigen Punkt in einer beliebigen Richtung betrachten können.

Gemäß den beiden vorhergehenden Abschnitten trägt die Anforderung an die akustische Wahrnehmung folgende Erweiterung bei:

(2) Eine gute VR-Umgebung sollte die Schallausbreitung von klanggenerierenden Objekten mit hoher Detailfülle in binaurale Wiedergabe (Auralisierung) überführen.

Unser Leben wäre ziemlich uninteressant, wenn wir die Form und das Gewicht von Objekten nicht fühlen könnten. Obwohl es scheinen mag, dass das Sehen die Form eines Objekts vermittelt, meine ich damit die Oberflächenbeschaffenheit und Temperatur. Dies führt uns zu folgender Erweiterung:

(3) Eine gute VR-Umgebung sollte die Textur, Temperatur und das Gewicht von Objekten mit hoher Genauigkeit vermitteln.

Der menschliche Geruchssinn ist nicht so ausgeprägt wie beispielsweise der von Hunden, aber ebenso fähig, wenn er trainiert wird. Das Wichtigste, was unser Geruchssinn beiträgt, ist die Verstärkung des Geschmacks während des Essens. Wenige wissen jedoch auch, dass wir Menschen uns durch Gerüche zu Gefahr, Sicherheit und Liebe hingezogen fühlen können. Dies wird durch Pheromone ermöglicht [17, 18, 19], und obwohl die meisten von uns „vergessen“ haben, wie wir diese „Duftstoffe“ wahrnehmen, können wir unseren Geruchssinn trainieren. Dieses Argument führt uns zu folgender Erweiterung:

(4) Eine gute VR-Umgebung sollte Pheromone und natürliche Düfte vermitteln können. Die meisten Kleinkinder kriechen herum und versuchen, alles zu probieren. Sie tun dies aus reiner Neugierde und um sich ein Bild von der Umwelt zu machen. In der erwachsenen Welt können wir leider nicht herumgehen und alles probieren, was wir sehen. Allerdings müssen die Objekte in einer VR-Umgebung keine Verbindung zur Flora oder Fauna der Erde haben.

(5) Eine gute VR-Umgebung sollte vor allem süße, saure, salzige und bittere Geschmacksempfindungen bei oraler Aufnahme vermitteln können. Alle anderen Formen der Aufnahme müssen eine chemische Zersetzung hervorrufen.

Schließlich dieses sehr wichtige Sicherheitskriterium:

(6) Alle VR-Umgebungen müssen sehr strenge Sicherheitsanforderungen erfüllen, um die Gesundheit der Benutzer nicht zu verschlechtern.

Anwendungsbereiche

Hat die Menschheit eine Nutzung für VR-Umgebungen, oder handelt es sich dabei nur um einen „Hype“ aus Amerika, der sonst nichts bringt? Hier diskutiere ich einige Bereiche, die von VR-Umgebungen profitieren können oder bereits davon profitieren.

Medizin

Wenn medizinische Studierende lernen, wie der menschliche Körper funktioniert, haben sie im besten Fall eine maßstabsgetreue Plastikmodell eines Menschen. In den fortgeschritteneren Modellen kann der Student verschiedene Organe abnehmen, um sie genauer zu betrachten. Dies erscheint als sehr effektive und einfache Methode, um Anatomie zu lernen. Das Problem ist jedoch, dass jeder eine solche Modell benötigt, um gleich schnell lernen zu können – doch diese Modelle sind viel zu teuer. Außerdem beanspruchen sie unnötig viel Platz.

Die Vorteile der Implementierung eines menschlichen oder tierischen Körpers in einer VR-Umgebung liegen darin, dass wir automatisierte Tests einfach durchführen können. Chirurgische Techniken lassen sich einfacher veranschaulichen (alle Studierenden sehen, was der Chirurg sieht), ebenso wie Krankheitsverläufe. Diese Vorteile erzielen wir auch durch strategisch platzierte Videokameras während Operationen. Das Problem besteht jedoch darin, dass wir einen Patienten (lebendig oder tot) mit genau der gleichen Erkrankung benötigen, die gerade unterrichtet wird, um eine gute „Abbildung“ zu gewährleisten.

Die Tomographie ist eine Weiterentwicklung der herkömmlichen Röntgenaufnahme. Der Patient wird in mehreren Schichten „gescannt“, wobei jede Schicht eine hohe Auflösung in allen Richtungen aufweist. Die herkömmliche Röntgenaufnahme ist relativ verschwommen, da die photographische Platte Röntgenstrahlen durch sehr dicke Gewebeschichten empfängt (schlechte Tiefenauflösung). Der Vorteil der Tomographie besteht darin, dass eine dreidimensionale Darstellung leicht erzeugt werden kann.

Wenn heutige Computertomographie-Benutzer das Innere eines Patienten betrachten, tun sie dies auf einem einfachen Monitor. Im besten Fall ist die Software so konzipiert, dass sie eine homogene dreidimensionale Darstellung der erkrankten Region des Patienten zeigt. Wenn wir die Visualisierung durch eine hochwertige VR-Umgebung verbessern, wird der Arzt noch einfacher mögliche chirurgische Probleme erkennen und somit sicherere und schnellere Eingriffe durchführen können. Medizinische VR-Umgebung muss nicht so umfassend sein wie die starke Grunddefinition, aber Sehen und Tastsinn müssen vorhanden sein. Für Pathologen kann auch der Geruchssinn ein Hilfsmittel sein, doch im Allgemeinen ist er nicht erforderlich. Ob HNO-Arzte das Hören ihres Patienten benötigen, ist mir nicht bekannt. Die Ausbildung von Medizinstudenten in einer VR-Umgebung sollte zu besseren ärztlichen Kenntnissen führen und hoffentlich gesündere Patienten ergeben.

Videogescannte und retuschierte Abbildung aus der Encyclopedia Britannica (Propaedia), die Teile der weiblichen Anatomie zeigen.

Raumfahrt

Videogescannte und retuschierte Abbildung aus der Encyclopedia Britannica, eine Raumfähre vom Typ Rockwell zeigend.

Früher oder später wird die Menschheit ihre Perspektiven erweitern müssen, da unsere Erde nicht mehr in der Lage sein wird, unsere Bedürfnisse zu befriedigen. Dies kann erreicht werden, indem wir zahlreiche Himmelskörper im Universum erforschen. Ein „kleines“ Problem ist, dass die interessantesten Himmelskörper so weit entfernt sind, dass es mit heutigen Raumfahrzeugen Jahrhunderte dauert, sie zu erreichen. Um dieses Problem zu lösen, könnten wir die Geschwindigkeit und Beschleunigung des Raumfahrzeugs erhöhen. Da der menschliche Körper jedoch hohe Beschleunigungen/Verzögerungen nicht verträgt (tödlich über 10g100m/s210g \approx 100 m/s^2), kann das Raumfahrzeug innerhalb angemessener Zeiten weder die Maximalgeschwindigkeit erreichen noch abbremsen.

Eine Lösung dieses physiologischen Problems besteht darin, überhaupt keine Menschen mitzunehmen. Das Geschwindigkeitsproblem wird dadurch deutlich geringer, da technische Ausrüstung viel höhere Beschleunigungen als 10g aushält. Unbemannte Raumfahrten haben bereits stattgefunden, etwa durch die amerikanischen Mariner- (1962–1973), Pioneer- (1972–1973), Viking- (1975) und Voyager-Sonden (1977) sowie die sowjetischen Venera- (1967–1975) und Mars-Sonden (1971) [20]. Diese haben lediglich Bilder aus großer Entfernung aufgenommen, wodurch nur sehr große Objekte auf der Oberfläche erkennbar sind. Hinzuzufügen ist, dass die Viking-Sonden Bodenproben entnommen und detaillierte Bilder der Marsoberfläche aufgenommen haben. All dies ist zwar gut, aber nicht ausreichend (selbst wenn Menschen bereits auf dem Mond gewandelt sind). Der Mensch hat seit jeher unerforschte Orte und Routen erkunden wollen. Ein typisches Beispiel ist Kolumbus, der auf „vorbildliche“ Weise das Unbekannte erforscht hat. Was Entdecker antrieb, war der Wunsch, das Unbekannte mit eigenen Augen zu sehen. Lassen wir stattdessen unsere zukünftigen Raumsonden strategisch gestaltete Bilder aufnehmen, um eine VR-Umgebung zu erstellen, werden wir einfacher in der Lage sein, eine mögliche Terraformierung (Terra = Erde –> Schw. Bodenbildung) zu erkunden. Für eine anfängliche Erforschung himmlischer Körper ist die vollständige VR-Definition nicht erforderlich (nur Sehen und Geschmack sind notwendig), aber sobald die Kartierung abgeschlossen ist, sollte die vollständige Definition verwendet werden. Beachten Sie, dass keine Kommunikation zwischen der Raumsonde und der VR-Umgebung möglich ist, da die Zeitverzögerungen zu groß sind und somit eine Echtzeit-Feedback-Möglichkeit für unsere Bewegungen nicht ermöglichen.

Unterhaltung

Videogescanntes Bild aus „Vorzeitliche Tiere“ (veröffentlicht von Bonniers), die grausamste und beeindruckendste Angstdrache – Tyrannosaurus rex – darstellend.

Um den Alltagsschweren zu entkommen und die geistige Belastung zu lindern, benötigen die meisten Menschen irgendeine Form von Unterhaltung. Die meisten wollen sich in eine Traumwelt verlieren, die entweder in Buch- oder Filmform existiert. Bereits zu Beginn der 1980er Jahre versuchten Filmemacher, computergenerierte Umgebungen in ihren Filmen einzusetzen, vor allem in Filmen wie „TRON“ und „Der letzte Starfighter“. Das Problem dieser Filme war, dass die Computermilieus sehr unwirklich waren und das Auge des Kinobesuchers nicht gut täuschten. Kürzlich produzierte Filme wie „Terminator 2“ und „Jurassic Park“ haben diesen Punkt deutlich besser gemeistert. Obwohl Filmemacher die endgültige Grenze der Anzahl „realer“ Fantasien, die mit zweidimensionalem Film erzeugt werden können, noch nicht erreicht haben, kann ich ohne Zögern schreiben, dass eine Erneuerung in der Branche erforderlich ist. Um die Illusionen zu verstärken, ist eine dreidimensionale Wiedergabe und immersive Darstellung von hochwertigem Audio erforderlich. In einem späteren Stadium sollte auch der Geruchssinn integriert werden. Diese VR-Umgebung stellt die strengsten Anforderungen, da die allgemeine Bevölkerung gegenüber Computern und deren Einfluss auf den Menschen sehr skeptisch ist. Daher ist eine hohe Qualität von äußerster Wichtigkeit, damit gewöhnliche Menschen die Illusionen akzeptieren können.

Ein Nachteil extrem guter Illusionen besteht darin, dass sie Menschen dazu verleiten können, Dinge für wahr zu halten, die nicht korrekt sind. Leider werden viele Menschen VR-Umgebungen zusammen mit Drogen nutzen, um die Illusionseffekte zu verstärken. Dies, kombiniert mit einer erheblich geringeren körperlichen Aktivität der Nutzer, kann zu schwerwiegenden sozialen Problemen führen. Wissenschaftler, die sich mit VR-Umgebungen beschäftigen, sollten vor der Veröffentlichung an die Öffentlichkeit auf mögliche soziale Risiken hinweisen, insbesondere in Filmen und Werbung.

Militär

Alle guten Dinge können zu schlechten Zwecken missbraucht werden, und VR-Umgebungen sind davon nicht ausgenommen. Da die Zeitverzögerungen auf der Erde relativ gering sind (maximal ca. 70 ms), können wir ohne größere Probleme Echtzeit-Feedback unserer Bewegungen erhalten. Dies bedeutet, dass wir mechanische Roboter in feindlichem Gebiet steuern können, ohne selbst anwesend zu sein. In neueren Kriegsformen können wir die Schlachtfelder in einer vollständigen VR-Umgebung realisieren und jene, die sich für den Niedergang der Menschheit interessieren, diese stattdessen nutzen lassen. Diese Personen könnten dann ihre Aggressionen durch verschiedene Schlachtmissionen abladen, bevor sie zu einem „normalen“ Leben zurückkehren. Wie gut diese militärische VR-Umgebung gestaltet werden sollte, um die größte präventive Wirkung zu erzielen, ist diskutierbar; sie dürfte jedoch ausgezeichnete visuelle und akustische Eindrücke erfordern.

Simulatoren

Es gibt bereits seit längerer Zeit Fahrzeug-, Flug- und Boots-Simulatoren auf dem Markt, und diese stellen prähistorische VR-Umgebungen dar. Flugsimulatoren existieren beispielsweise seit 1929 [21]. Der Grund, warum ich sie als prähistorisch bezeichne, ist, dass der Benutzer in einer funktionalen Replik der tatsächlichen Kommandobrücke sitzt. Dies ist an sich gut, da es eine perfekte Abbildung ermöglicht. Allerdings verwenden wir mechanische Schalter, die viel Platz einnehmen und teuer sind, wenn sie zuverlässig sein sollen.

Wenn wir zu einer vollständig digitalen Steuerung der Systeme übergehen (was sehr schwierig ist), können wir die Mensch-Maschine-Schnittstelle viel einfacher gestalten (sowohl in der VR-Umgebung als auch in der Realität), sodass deutlich mehr Personen das betreffende Gerät bedienen können. Hoffentlich lässt sich das Erlernen von perikulären Szenarien schneller und einfacher bewerkstelligen. Wir können die Anwendung der VR-Umgebung erweitern und diese in Kombination mit den aktuellen Kommandobrücken implementieren, um Sichtprobleme wie „tote Winkel“ zu beseitigen.

Heutige Fitnessstudios verfügen über eine Vielzahl von Geräten zur Verbesserung der Gesundheit. Diese sind langfristig langweilig zu nutzen, und ein „Pö-um-Pö“-Benutzer (wie ich selbst) zieht es vor, diese Geräte möglichst lange zu meiden. Die Lösung besteht darin, hinaus in die Natur zu gehen und seine Gesundheitskur dort zu beginnen. In der Zukunftsgesellschaft wird die Bevölkerungsdichte jedoch so groß sein, dass wir nicht mehr ausreichend Raum für Freizeitaktivitäten in natürlichem Sinne haben werden. Muss der Mensch dann in einem Raum eingeschlossen werden und seine Gesundheitskur mit starrer Betrachtung einer tristen Wand absolvieren? Lassen Sie den sporttreibenden Teil der Bevölkerung in einer VR-Umgebung trainieren, die an die persönliche körperliche Leistungsfähigkeit des Benutzers angepasst ist. In dieser Umgebung werden alle visuell gleich schnell laufen können. Wenn der Benutzer einen Vorteil als Belohnung empfindet, um das Interesse zu steigern, kann die VR-Umgebung entsprechend programmiert werden. Ich bin überzeugt, dass die meisten Menschen, die Sport nicht mögen, zu gewinnorientiert sind: Sobald sie ihre schlechte Kondition erkennen, wenn sie „gegen andere“ antreten, bricht ihr Wille zusammen und sie hören auf zu sporteln. Persönlich sehe ich VR-Umgebungen als Erlöser in diesem Problem. Diese VR-Umgebungen erfordern Sehen und Hören, um ausreichend realistische Simulationen zu ermöglichen.

Computer-Aided Design

Architekten und Maschinenbauer profitieren derzeit enorm von computergrafischen Visualisierungen. Sie können ihre Konstruktionen sehen, bevor sie gebaut werden, und – sofern das Programm es ermöglicht – prüfen, ob die Konstruktion stabil und funktionsfähig ist (z. B. IGRIP auf Silicon Graphics-Maschinen). Bei Konzerthallenneubauten kann zudem die akustische Komponente berücksichtigt werden, und eine Auralisierung kann mit geeigneter Software und Hardware erzeugt werden. Diese Hilfsmittel erleichtern enorm die Arbeit und teure Umbauten sowie Konstruktionsfehler können minimiert werden. Um die bestmögliche Konzeptualisierung zu erreichen, sollten wir eine noch perfektionistischere Realität anstreben, die durch VR-Umgebungen ermöglicht wird und dem Benutzer eine fantasievollere und selbstverwirklichendere Kreation ermöglicht.

Die Programmierumgebung der Zukunft

Bei der Suche nach der ultimativen Benutzerfreundlichkeit könnten VR-Umgebungen ein Schritt in die richtige Richtung sein. Heutige Programmierumgebungen leiden unter erheblichen Nachteilen, die wir vielleicht nicht bemerken, wenn wir sie nur kurz nutzen. Die Anforderung, dass alles visuell gleich erscheinen muss, wird den Benutzer früher oder später mit Monotonie konfrontieren. Diejenigen, die über 16 Stunden hintereinander programmiert haben, können manchmal eine gewisse Langeweile am Computer verspüren, die nicht unbedingt auf schlechte Ernährung oder seltene Toilettengänge zurückzuführen ist. Tatsächlich sind die Schnittstellen zwischen Computern und Menschen erschreckend langweilig, da der Inhalt auf dem Bildschirm statisch ist. Eine präventive Methode könnte sein, während der Entwicklungsarbeit in einer VR-Umgebung zu verweilen, wo visuelle Effekte ermutigende Signale an das Gehirn senden. Der Arbeitgeber muss keine Gelder für Möbel, Blumen oder große Arbeitsflächen ausgeben; stattdessen kann die VR-Umgebung (große, hochauflösende Flüssigkristallanzeigen an den Wänden, die mit einem VR-Computer verbunden sind) nach dem Geschmack des Benutzers angepasst werden.

Eine Weiterentwicklung der Benutzeroberfläche besteht darin, die Gehirnaktivität zur Steuerung des Aussehens der Oberfläche zu nutzen, um die Aufmerksamkeit und die Stimmung des Benutzers aufrechtzuerhalten. Die heutigen Probleme, die mit Computern gelöst werden, erfordern große Entwicklungsteams. Die Mitglieder dieser Teams sollten ähnlichen Geschmack hinsichtlich Einrichtungsgegenstände und Hintergrundmusik haben, um effektiv zusammenarbeiten zu können. Dies habe ich über die Jahre auf verschiedenen Arbeitsplätzen selbst beobachtet. Die Vorteile der Aufenthalt in einer VR-Umgebung liegen darin, dass die Mitglieder nicht am selben Ort anwesend sein müssen und sie Einrichtungsgegenstände und Musik nach eigenem Geschmack auswählen können. Dies wird zu einer Effizienzsteigerung führen, da alle genau das erhalten, was sie möchten, und dadurch sich wesentlich wohler fühlen. Warum benötigen wir VR-Umgebungen, um dies zu lösen? Dies lässt sich auch mit der heutigen Technologie in einer zweidimensionalen digitalen Welt gleichermaßen erreichen, doch der Mangel an „dreidimensionaler“ menschlicher Interaktion wird früher oder später zu einem großen Problem werden. Wir benötigen nicht die vollständige VR-Definition in dieser Umgebung, aber Sehen, Hören und Tastsinn müssen implementiert werden.

Musikstudio

Wir können die Musikstudio der Zukunft mit großem Vorteil in einer VR-Umgebung implementieren. Der erste Schritt des Tontechnikers besteht darin, verschiedene Musikinstrumente (eigentlich klanggenerierende Objekte) im selbstmodellierten virtuellen Raum zu platzieren. Nach der Platzierung bestimmt sie, welchen Klang das Objekt abspielen soll und mit welcher Intensität und Charakteristik. Um das Interesse zu steigern und die Vorhersehbarkeit des Musikstücks zu verringern, kann sie anschließend die Instrumente im Raum wandern lassen oder deren Charakter mit der Zeit verändern. Musiker aus der gesamten Welt werden in einer virtuellen Konzerthalle spielen können, während sie weiterhin in ihrem eigenen Stuhl zu Hause bleiben (der Musiker Thomas Dolby versucht, diese Idee umzusetzen).

Diese VR-Umgebung wird auch der Filmindustrie von großem Nutzen sein, da das Hinzufügen von Soundeffekten in Filmen erleichtert wird. Obwohl moderne Kinofilme mit Dolby Surround (nicht derselbe Dolby wie oben) ausgestattet sind, die an diese VR-Umgebung erinnern, leiden die meisten unter bedeutenden audiomedialen Mängeln. Um die höchstmögliche Klangqualität zu erreichen, sollte diese VR-Umgebung großen Wert auf das Hörkriterium in der Definition legen, aber auch das Sehen sollte implementiert werden, um die Handhabung zu erleichtern.

Hauptproblem

TNE logo ©Denis Tumpic

Das also war des Pudels Kern!

Johann Wolfgang Von Goethe

In diesem Kapitel beschreibe ich meine Abschlussarbeit, indem ich zunächst das Problem definiere. Danach folgt eine Analyse des Problems in seinen wichtigsten Teilaspekten. Abschließend behandele ich kurz verschiedene Programmiermethoden. Der Schwerpunkt dieser Abschlussarbeit liegt auf Audio-Ray-Tracing in VR-Umgebungen und der Implementierung eines solchen Systems. Diese Idee ist nicht ganz neu, da einige wesentliche Teile bereits 1992 auf einer stabilen Grundlage formuliert wurden [22, 23, 24, 25].

Die Audio-Ray-Tracing-Methode ist seit 1967 bekannt [26] und hat in jüngerer Zeit aufgrund des größeren Zugangs zu leistungsfähigeren Computern das Interesse vieler Forscher geweckt. Meine Einschätzung des verfügbaren Materials (im Vergleich zum Video-Ray-Tracing sehr begrenzt) hat mir das Gefühl vermittelt, dass nur wenige Personen tatsächlich Algorithmen für audiobasierte VR-Umgebungen entwickeln.

Anfangs könnte man die naive Annahme haben, dass die Lösungsmethoden für Video- und Audio-Ray-Tracing identisch sind. Die ersten Kapitel zeigen jedoch die Probleme auf, die mit der Berechnung der Schallausbreitung verbunden sind, sowie die möglichen Approximationen, die wir vornehmen können. Die tatsächliche Implementierung wurde durch die Hauptbücher des Amiga-Systems, verschiedene C-Bücher sowie einen GUI-Generator unterstützt (siehe Bücher, Software & Hardware).

Problemstellung

Derzeit ist die Verwendung von Video-Ray-Tracern auf Personalcomputern (insbesondere für die Amiga-Computerfamilie) sehr verbreitet, doch Audio-Ray-Tracer existieren nicht in ähnlicher Vielfalt. Kommerziell verfügbare Lösungen sind zu hohen Preisen nicht erhältlich. Die Programme Odeon und Computer Aided Theater Technique (CATT), die für IBM-kompatible PCs verfügbar sind, sind beide extrem teuer und weit davon entfernt, benutzerfreundlich zu sein. Dieser Umstand zusammen mit dem zunehmenden Interesse an VR-Umgebungen (siehe vorheriges Kapitel über Virtual Reality) deutet auf ein starkes Bedürfnis nach einem Audio-Ray-Tracker hin, der sowohl schnell als auch leicht zu bedienen ist.

Ein Ray-Trace-Programm sollte über einen einfachen grafischen 3D-Editor verfügen, die Möglichkeit bieten, Materialien und Typen der Objekte festzulegen sowie die Objekte an vordefinierte Bewegungsabläufe zu binden. Der grafische 3D-Editor könnte mit sehr komplexen Elementen wie „Beta-Splines“ und „Hidden Surface Removal“ implementiert werden. Das Erstellen eines perfekten 3D-Editors war jedoch nicht mein Hauptziel; seine Nutzbarkeit hat jedoch in hohem Maße das Aussehen des Programms geprägt. Für einen Audio-Ray-Tracker können die Materialien der Objekte an die Absorptionseigenschaften und Richtwirkung (Direktivität) der Oberflächen gekoppelt werden. Die verfügbaren Objekttypen könnten Möbel, Sender und Empfänger umfassen. Bewegungsabläufe sollten sowohl Morphing (Formveränderung) als auch Translation in drei Dimensionen umfassen (der Leser wird aufgefordert, sich an die starke VR-Definition zu erinnern). Das Programm sollte in der Lage sein, obige Funktionen einfach zu handhaben, sodass der Benutzer nicht in seiner kreativen Fähigkeit behindert oder wertvolle Freizeit entzogen wird. Die Visualisierung, die in allen Video-Ray-Tracern vorhanden ist, sollte auch eine gute Entsprechung in einem Audio-Ray-Tracker haben; dies bezeichnen wir als Auralisierung. Dieser Begriff wurde von der Chalmers Tekniska Högskola zur de facto-Standarddefinition erhoben. Angesichts der extremen Rechenleistung, die für die Auralisierung erforderlich ist (wie in „Berechnungsaspekte der digitalen Audioverarbeitung“ nachgewiesen wurde), in Verbindung mit der einfachen Hardware, die typische Personalcomputer bieten, ist dieses Ziel nicht das primäre, aber es bleibt für zukünftige Hardware-Implementierungen im Hinterkopf.

Ein obligatorischer Bestandteil der Auralisierung ist die Fähigkeit, vorhandene Räume mittels Dirac-Impulsen zu samplingen, um diese in den berechneten Impulsantworten zu verwenden und zu vergleichen. Dieser Teil ist zu einfach, um implementiert zu werden, und ich erwähne ihn hier nur als mögliche Erweiterung meines Programms. Tatsächlich ist er bereits implementiert, da ich auf die großen Mengen an verfügbaren Sampling-Programmen zurückgreifen und das Sampling-Programm parallel zum Audio-Ray-Trace-Programm ausführen kann.

Eine sehr ergiebige und vollständig realisierbare Idee ist es, zwei Personalcomputer miteinander kommunizieren zu lassen, während die Benutzer in einer gemeinsamen Audio/Video-Umgebung verweilen – als eine Art Vorbote zukünftiger, hochwertiger VR-Umgebungen. Diesen Aspekt habe ich ins Auge gefasst, aber da das eigentliche Fachwissen eines Datenloggers nicht im Bereich Hardware-Bau liegt, habe ich diese Idee aus dieser Darstellung ausgeklammert. Die Lösung erfordert eine schnellere Kommunikation als die übliche serielle Übertragung. Dies ist mit paralleler Übertragung möglich, doch sie wird etwa 8- bis 32-mal teurer (abhängig von der Breite), weshalb diese Lösung keine geeignete Möglichkeit darstellt. Auch die folgende Idee wurde ausgelassen, da der amerikanische Hardware-Lieferant in Konkurs gegangen ist. Durch spezielle Brillen (eigentlich zwei Ein-Pixel-Flüssigkristallanzeigen), die abwechselnd jeweils ein Bild vom Computermonitor an das entsprechende Auge weiterleiten, können wir stark realistische dreidimensionale Bilder erzeugen, um die Benutzerfreundlichkeit des 3D-Editors zu erhöhen [27, 28]. Die Hardware ist eigentlich sehr einfach selbst zu bauen, aber erneut ist das Hauptanliegen eines Informatikers die Algorithmusentwicklung.

Darüber hinaus kann ein Audio-Ray-Tracing-Programm ein sehr nützliches Hilfsmittel zur Verbesserung der Akustik in bereits bestehenden Räumen sein. Dies ist möglich, wenn die richtigen Approximationen in das Programm zur Simulation der Schallausbreitung implementiert werden und wir die harten Anforderungen an die auditive VR-Umgebung vernachlässigen, deren Hauptpostulat Echtzeit-Feedback ist.

Die Wahl des Computers ist grundlegend, und als Informatiker sollte man ein gutes Betriebssystem verlangen, das von guter Hardware unterstützt wird. Diese Kriterien dürfen die wirtschaftliche Dimension nicht in den Hintergrund drängen, sondern müssen an ihre Spitze gestellt werden. Die Rechenleistung sollte so genutzt werden, dass die Effizienz der Algorithmen mit den einfachsten Mitteln und dem geringstmöglichen Aufwand sichtbar wird. Für Entwicklungsarbeiten ist mindestens „preemptive Multitasking“ erforderlich, damit der Programmierer effizient arbeiten kann. Bei der Nutzung solcher Systeme entsteht eine Form von „Infinite Stream Of Consciousness“. Die Verwendung großer Arbeitsstationen für diese Abschlussarbeit wäre einfacher gewesen, doch ihre Rechenleistung verdeckt schlechte Algorithmen. Da ich ein leidenschaftlicher Gegner langsamer grafischer Benutzeroberflächen und ineffizient programmierte Pseudo-Betriebssysteme bin, habe ich für die Realisierung dieser Abschlussarbeit Intuition mit Amiga-OS als Grundlage gewählt – meine Lieblingsumgebung. Die Abschlussarbeit ist zudem eine natürliche Fortsetzung der führenden VR-Tradition der Amiga-Maschinen. Das Einzige, was ich möglicherweise an Amiga-OS schlecht finde, ist seine Speicherverwaltung, da es nicht für MMU (Memory Management Unit)-Hardware entwickelt wurde. Grundlage dafür ist die Amiga-Grafik-Hilfsprozessor (Agnes), der Daten im Programm-Speicher verschieben kann. Dies, zusammen mit einigen weiteren Hilfsprozessoren (Denise, Paula, Buster, Amber, Ramsey, Gary usw.), ist wiederum der Hauptgrund für die Speichereffizienz und Geschwindigkeit der Amiga-Architektur.

Diese Amiga-Architektur (eine echte Hybrid-Hardware) ist seit 1985 kommerziell verfügbar und ist trotz ihres Alters heute noch eine sehr nützliche Rechnerplattform. Langfristig verliert sie jedoch an Leistung gegenüber größeren RISC-(Reduced Instruction Set Computer)-Maschinen. Daher habe ich bestimmte Algorithmen nicht in reinem Assembler optimiert. Algorithmen, die vor 1989 erstellt wurden, sind in Assembler geschrieben, werden aber nicht in der Implementierung verwendet, da schnellere Algorithmen seitdem entwickelt wurden (HINWEIS: meine eigenen).

Neben der Wahl des Computers ist die Programmiersprache eine sehr wichtige Säule. Komplexe Sprachen neigen dazu, oft schlechtere Übersetzungen in die grundlegenden Maschineninstruktionen zu erzeugen (insbesondere bei CISC-(Complex Instruction Set Computer)-Architekturen), und es war mir sehr klar, dass Pascal (eigentlich nicht komplex, aber auf Amiga-Computern ineffizienter als kompiliertes BASIC !!!), Modula-2, Simula, Cluster und Modula-3 nicht ausreichend effizient waren. Die heutigen OOP-(Object Oriented Programming)-Sprachen C++ (Definition 2.1) und Oberon sind für die Amiga nicht vollständig ausgereift, und herkömmliches C++ (Definition 1.0) war zu ineffizient. Die verbleibenden möglichen Alternativen sind Assembler, DSPC (Denis Tumpic’s Strukturierter Assembler-Programmiercode, entwickelt 1986–1988, der jedoch nicht für diese Implementierung verwendet wurde, da RISC im Kommen war) und die Programmiersprache C. Von diesen habe ich C gewählt, da es eine relativ einfache und sehr freie Sprache zur Arbeit ist. Jeder kann in C programmieren, da sie mit einfachen Mitteln aufgebaut ist und alles erlaubt ist (wenn wir sie mit den oben genannten „echten“ Computersprachen vergleichen – abzüglich BASIC!). Dies stellt die Disziplin des Programmierers auf die Probe, und ich kann mit Sicherheit sagen, dass lesbare C-Programme eine Kunst sind. Programmiertechnisch war mein größtes Ziel, ein sehr lesbares C-Programm mit ausführlichen Erläuterungen bei komplexen Konstruktionen zu schreiben. Dies ist besonders wichtig bei größeren Programmierprojekten, insbesondere wenn es sich um ein Ein-Mann-Projekt wie dieses handelt.

Analyse und Implementierung des Problems

Der Implementierungsanteil meiner Abschlussarbeit habe ich in die grundlegenden Problemstrukturen aufgeteilt: die Gestaltung der grafischen Benutzeroberfläche, rechenintensive 3D-Grafik-Algorithmen, Schallausbreitungs-Algorithmen, Nachhall-Approximation, Auralisierung und schließlich die Computerarchitektur. Diese Strukturen beeinflussen am stärksten die Effizienz und Gestaltung des Programms.

Mensch-Computer-Interaktion

The most we can hope for is that the oftener things are found together, the more probable it becomes that they will be found together another time, and that, if they have been found together often enough, the probability will amount almost to certainity.

Bertrand Russell

In diesem Abschnitt beschreibe ich die Kriterien, die für gute Benutzeroberflächen erforderlich sind. Dabei werden auch die Probleme angesprochen, die bei der Erstellung grafischer Benutzeroberflächen auftreten. Zudem erläutere ich die Inspirationsquellen, auf die ich zurückgegriffen habe. Diese habe ich nicht detailliert erläutert, sondern lediglich originäre Elemente oder Entwicklungsphasen extrahiert. Abschließend beschreibe ich meine Implementierung der Benutzeroberfläche und versuche, mögliche Probleme anhand der in den Grundprinzipien definierten Kriterien zu analysieren.

Grundprinzipien

Moderne Computerprogramme sind stark von der grafischen Benutzeroberfläche (engl. GUI – Graphical User Interface) abhängig, um in der harten Softwarekonkurrenz überleben zu können. Nutzer, die ein Programm nicht akzeptieren, werden schnell frustriert und verlassen es mit hoher Wahrscheinlichkeit zugunsten eines anderen mit einer besseren GUI. Einfach ausgedrückt ist die GUI das Wichtigste an einem Programm, und wer das intuitivste Interface entwickelt, gewinnt letztendlich.

Programmiertechnisch ist die Entwicklung der GUI der zeitaufwändigste Teil und es entstehen zahlreiche „Mock-ups“, die wieder verworfen werden, bevor das Endprodukt erreicht ist. Eigentlich wird die GUI niemals vollständig fertig, da wir sie bis ins Absurde verbessern können.

Wie erstellt man eine gute GUI? Dies ist eine einfache Frage mit einem sehr komplexen Antwort. In der folgenden Darstellung berücksichtige ich keine kulturellen Unterschiede. Auch die subjektiven Präferenzen, die jeder Mensch besitzt, habe ich vernachlässigt, da wir leider nicht alle Benutzer zufriedenstellen können. Kennzeichnend für ein gut gestaltetes GUI sind eine klare Abbildung, schnelles Feedback und einfache Anpassbarkeit. Diese Kriterien sind nicht die einzigen gängigen, aber sie sind zweifellos diejenigen mit der größten Durchschlagskraft. Außerdem kann interaktive Formbarkeit (z. B. das Verschieben von Umwandlern während der Programmausführung) im GUI einfache subjektive Vorlieben erleichtern, was langfristig zu zufriedeneren Benutzern führt. Dies ist teilweise in MUI (Magical User Interface, implementiert von Stefan Stunz und derzeit frei als Amiga-Public-Domain verfügbar) umgesetzt, einem Bibliothekserweiterung für Intuition.

Eine klare Abbildung wird erreicht, wenn Aktion und Reaktion auf einfache Weise miteinander verknüpft sind. Das beste Beispiel ist die Abbildung der Maus auf den Cursor auf dem Bildschirm: Wir bewegen die Maus in eine beliebige Richtung (derzeit zweidimensional), und der Cursor folgt in derselben Richtung auf dem Bildschirm. Wenn wir Tasten oder andere Programmparameter in einem GUI aktivieren, sollte die Reaktion lokal in unmittelbarer Nähe visualisiert werden. Falls eine lokale Visualisierung nicht möglich ist, müssen aufmerksamkeitslenkende Effekte eingesetzt werden. Letztere Lösung ist nicht zu bevorzugen, aber leider in einigen Situationen erforderlich. Schnelle Rückmeldung ist wahrscheinlich das schwierigste Kriterium, da es in der Regel eine gute Hardware erfordert. In dieser Zeit ist das Hardwareproblem von geringer Bedeutung, aber fehlerhafte GUI-Implementierungen können selbst die spektakulärsten Systeme unbrauchbar machen. Wenn der Benutzer eine Aktion im GUI ausführt, sollte die Reaktion, sofern möglich, sofort aktiviert und visualisiert werden. Falls eine sofortige Aktivierung nicht möglich ist, muss dem Benutzer durch eine einfache und klare Visualisierung mitgeteilt werden, dass eine Berechnung im Gange ist. Eine weitere Verbesserung der Benutzerfreundlichkeit besteht darin, die verbleibende Zeit für den Berechnungsvorgang grafisch darzustellen. Ich habe über Echtzeit-Feedback im vorherigen Kapitel geschrieben; mit diesem Begriff meine ich eine sofortige Rückmeldung mit lokaler Abbildung, unabhängig von der (polynomiellen) Rechenkomplexität. Dies ist sehr schwierig zu realisieren, aber ein Ziel, das angestrebt werden sollte.

Einfache Anpassung hängt stark von der bisherigen Erfahrung des Benutzers mit Computerinterfaces ab. Wenn frühere Interfaces einheitlich und konsistent gestaltet wurden, wird die Lernzeit für die neue Anwendung minimiert, wenn wir das Interface in derselben Weise gestalten. Die Einheitlichkeit lässt sich leicht erreichen, indem man andere Anwendungen im selben Fachgebiet betrachtet und deren Erscheinungsbild „kopiert“. Diese Lösung mag etwas karg erscheinen, da sie kein neues Denken beinhaltet. Neues Denken – insbesondere das Lernen aus unseren früheren Fehlern – ist bei allen Arten von Konstruktionsarbeiten von großer Bedeutung. Daher sollte der GUI-Entwickler nur die grundlegendsten Elemente „kopieren“, um die Einheitlichkeit zu bewahren. Die spezialisierteren Einheiten sollen auf logische und visuelle Weise ähnlich den grundlegenden Einheiten implementiert werden. Der Benutzer soll nicht durch eine Vielzahl von Programmfunktionswandlern belastet werden. Diese sollen in der geringstmöglichen Anzahl, aber mit höchstmöglichem Funktionsumfang vorhanden sein. Ihre Funktion soll visuell einfach dargestellt werden, entweder durch ein Symbol (grafisches Zeichen) oder Text. Das Problem bei der Verwendung von Symbolen besteht darin, dass der Benutzer sein Gedächtnis belastet, um ihre Funktion zu merken (wenn sie schlecht gestaltet sind).

Die Größe der Symbole ist direkt proportional zur Wahrnehmungsfähigkeit des Benutzers. Dies stellt ein Problem dar, da der Bildschirm nicht unbegrenzt groß ist. Entweder können wir die Bildschirmauflösung erhöhen, um mehr Grafik und präzisere Symbole darzustellen, oder wir ersetzen die Symbole durch einfache Wörter. Auch Sätze können verwendet werden, doch diese sind oft zu lang; bei umfassender Anwendung dieser Lösungsmethode nimmt die Bedienungsgeschwindigkeit des Benutzers ab, da das Lesen von Sätzen deutlich länger dauert als das Abrufen der Funktion, die mit einem Bild verknüpft ist. „Ein Bild sagt mehr als tausend Worte“, heißt es bekanntlich. Eine modernere Formulierung dieses Themas könnte in diesem Zusammenhang lauten: „Eine gute Visualisierung sagt mehr als Millionen Bücher.“

Es ist oft notwendig, die GUI in mehrere größere, zusammenhängende Blöcke aufzuteilen. Wenn diese verschiedenen Blöcke ähnliche Funktionen haben, sollen ihre Programmfunktionswandler so platziert werden, dass logisch gleiche Funktionen an denselben Stellen in den verschiedenen Blöcken vorhanden sind. Dies ist eine Konsequenz im Nussknacker und von großer Bedeutung bei der GUI-Modellierung. Wenn eine Anwendung nicht innerhalb ihrer eigenen Grenzen konsistent ist, wird der Benutzer letztendlich gezwungen sein, diese aufzugeben. Die Konsequenz ist ein wesentlicher Faktor für die Handhabungsgeschwindigkeit und für den Alltagsbenutzer von großer Bedeutung, wenn er effizient arbeiten möchte. Gleichförmigkeit kann auch als globale Konsequenz bezeichnet werden (ein Kriterium, das meiner Ansicht nach zu stark ist), und Konsequenz kann auch als lokale Gleichförmigkeit bezeichnet werden (ein Kriterium, das meiner Ansicht nach zu schwach ist). Ob wir globale Konsequenz anstreben sollten, kann diskutiert werden; jedoch sollte zur Vermeidung von Monotonie genügend Freiraum für eigene Interpretationen besserer Metaphern bestehen als die, die in der jeweiligen Maschine verfügbar sind.

Interaktive Umformbarkeit kann in unterschiedlichem Maße implementiert werden, doch bei übermäßiger Umformbarkeit wird die Anwendung benutzerspezifisch. Dies ist ein akutes Problem, wenn die Grundmetapher verändert werden kann, und sollte darauf hinweisen, dass wir nicht bis ins Absurde implementieren sollten. Wir können dem Benutzer erlauben, selbst zu bestimmen, wo die Programm-Funktionsumformungen angeordnet werden sollen und welche Funktion sie haben sollen.

Lassen wir diese Idee weiter wirken, können wir das Programm auch von einem externen Programm oder einer Hardware steuerbar machen. Eigentlich verwendet das externe Programm/die Hardware das Slave-Programm als Bibliothek von völlig „gewöhnlichen“ Funktionen. Diese Idee kann beispielsweise mit AREXX (in der Unix-Welt bekannt als REXX) umgesetzt werden, und das Slave-Programm kann beliebig komplex werden. Wenn wir vollständige interaktive Umformbarkeit in der Anwendung verlangen, sollten wir eine sehr gute Computerarchitektur fordern; heute ist es jedoch frustrierend, diese Systeme zu verwenden, da die Handhabung nach einer Weile langsam wird (die Rechenleistung nimmt schnell ab). Auch wenn dies eine Tatsache ist, sollten wir danach streben, diese Idee in naher Zukunft mit guten Algorithmen und guter Hardware zu realisieren. Das, was vielleicht das Wichtigste sein sollte und was der Benutzer tatsächlich zuerst bemerkt, ist die Möglichkeit, eine fehlerhafte Entscheidung rückgängig zu machen. Ein Anfänger ist dazu verurteilt, in den ersten unsicheren Benutzerschritten der Anwendung zu scheitern, wenn die GUI inkonsistent ist. Gedankenfehler können von einem erfahrenen Benutzer leicht rückgängig gemacht werden, und er verliert nicht das Vertrauen in die Maschine. Vertrauen in die Bedienung ist besonders wichtig für kritische Anwendungen, wie sie beispielsweise in Kernkraftwerken und Flugzeugen vorkommen.

Die größte Frage ist, wie tief „Rückgängigmachen“ sein sollte. In den einfachsten Systemen kann der Benutzer die letzte Transformation rückgängig machen, doch in besseren und komplexeren Systemen wäre ein „unendliches“ Rückgängigmachen erforderlich. Selbstverständlich spielt der Speicheraspekt bei solchen Implementierungen eine Rolle. Dieses Problem können wir lösen, indem wir dem Benutzer erlauben, das Rückgängigmachen-Tief während der Laufzeit selbst zu bestimmen. Lassen wir das Rückgängigmachen-Tief virtuell unendlich, sollte der Benutzer in der Lage sein, den Rückgängigmachen-Stack zu allen damit verbundenen GUI-Instanzen während der Programmausführung zurückzuspulen.

Etwas, das die Bedienung von Computer-Software weiter erschwert, ist, wenn ihre GUI so gestaltet ist, dass das Programm in Module unterteilt wird. Dies kann sehr gefährlich sein und den Benutzer eingeschlossen fühlen lassen. Dies beschränkt die Kreativität und macht die Bedienung unhandlich und ineffizient. Das Problem bei der Implementierung einer GUI ohne Module besteht darin, dass die Programmkomplexität extrem ansteigt und das Fehlersuch- und Behebungsarbeit entsprechend viel schwieriger wird. Es ist nicht der eigentliche Programmcode, der wächst, sondern das Unabhängigkeitsgrad der damit verbundenen Funktionen, der vollständig sein muss. Um alle möglichen Kombinationen zu testen, mit denen wir den Programmablauf ändern können, ist exponentiell viel Arbeit erforderlich (n Umformungen ergeben n! verschiedene Umformungskombinationen). Dies und die Tatsache, dass wir einfach beweisen können, dass wir kein Programm konstruieren können, das die Gültigkeit eines anderen Programms überprüft, beweisen teilweise meine Behauptung, dass eine komplexe GUI niemals fertig werden wird. Alle Anfänger, möglicherweise auch einige erfahrene Benutzer, werden sich fragen, wofür alle Programm-Funktionsumformungen gut sind. Die meisten werden irgendeine Art von Bedienungsanleitung durchblättern, aber nach einiger Zeit der Nutzung wird diese ausgeblichen sein. Die Lösung für dieses Problem besteht darin, eine elektronische Anleitung zu erstellen, auf die der Benutzer bei Problemen während des Programmlaufs zurückgreifen kann. Dies ist in Amiga-OS in Form von Amiga-Guide vorhanden, das seit 1988 existiert und eine hypertextbasierte Hilfedokumentation darstellt. Diese ist kein physischer, sondern ein logischer Bestandteil des Programms. Wir können auch „Instant Help“-Nachrichten implementieren, die so platziert sind, dass der Benutzer sie leicht direkt in der Anwendung finden kann. Normalerweise platzieren wir diese „Instant Help“-Nachrichten im Hauptfenster der Anwendung und aktualisieren sie bei Bedarf (unmittelbares Feedback ist in dieser Lösung erforderlich). Die Sprache der Benutzeroberfläche kann manchmal eine Barriere darstellen. Da es ein englischsprachiges Land war, das zuerst eine Computersprache definierte und die erste Hardware entwickelte, wurde die Grundsprache für Computer (sowohl Hardware als auch Software) Englisch. Die Benutzer dieser Zeit waren überwiegend Wissenschaftler, die Englisch beherrschten. Heutzutage sind Benutzer jedoch nicht immer Wissenschaftler und können oft kein Englisch. Dies stellt ein großes Problem dar, da ein Benutzer, der den Text auf dem Bildschirm nicht versteht, die Anwendung im schlimmsten Fall aufgibt. Ein weiteres Argument gegen die Verwendung einer einzigen Sprache für alle Benutzeroberflächen sind die schlechten Übersetzungen (benutzereigene), die häufig auftreten. Typische Beispiele sind „save“ („sejv“, was eigentlich „speichern“ heißen sollte) und „load“ („leåd“, was eigentlich „laden“ heißen sollte). Diese Ausdrücke verbreiten sich wie ein Lauffeuer, und die Benutzergruppe der Anwendung entwickelt eine Art „Sondersprache“ neben der Originalsprache. Diese Sondersprachen können diese Gruppe dazu verleiten, manchmal als stammend aus dem äußeren Weltraum wahrgenommen zu werden. Eine Lösung für dieses Problem besteht darin, die GUI so zu gestalten, dass das Wechseln der Grundsprache einfach ist. Dies wurde im Amiga-OS mittels Locale gelöst (implementiert als Bibliothek), wo wir die verwendete Sprache und das Land angeben, in dem wir wohnen. Danach ist es Aufgabe der Anwendung (sofern der Programmierer die Locale-Instanz implementiert hat), diese Einstellung zu nutzen.

Inspirationsquellen

Da es eine solche Fülle von Video-Ray-Tracern für die Amiga gab, habe ich hauptsächlich deren Benutzeroberflächen untersucht, um Inspiration zu finden. Anfang 1987 gab es Sculpt-3D, das relativ fortgeschritten war, aber mit einem langsamen Editor, obwohl es die Modellwelt in „Wireframe“-Darstellung zeigte. Wireframe bedeutet, dass das Modell nur die Kanten der Objekte anzeigt, wodurch man durch die Objekte hindurchsehen kann. Der Benutzer konnte die Blickrichtung in jeder Ansicht (drei paarweise orthogonale Ansichten) bestimmen. Vergrößerung, Perspektive und diverse weitere praktische Funktionen waren ebenfalls verfügbar. Die Anforderung, animierte Sequenzen aus den berechneten Bildern zu erstellen, erforderte eine grundlegende Umgestaltung des Programms, beispielsweise die Implementierung von Motion-Blur (Bewegungsunschärfe). In dieser Phase änderte das Programm seinen Namen in Sculpt-4D. Der Editor blieb jedoch weiterhin ebenso langsam, was die Verwendung dieses Programms bei größeren Zeichnungen unmöglich machte.

Diese Programme gehörten zu den ersten, die auf der Amiga erschienen, und verfügten über relativ gute Benutzeroberflächen. Ein Programm, das kein Raytracer ist, aber erwähnenswert ist, ist Videoscape. In diesem Programm wurde die Modellwelt mit tatsächlichen Oberflächen visualisiert, und der Benutzer konnte auch hier einfache Animationen erstellen. Auch in diesem Programm war die Bedienung bei größeren Zeichnungen etwas umständlich. Es sei angemerkt, dass ich mit „umständlich“ im Amiga-Kontext meine. Eine Verdeutlichung hierfür: Ein 3D-Editor ist stark davon abhängig, wie schnell die Grafik auf dem Bildschirm dargestellt werden kann (eigentlich jede GUI überhaupt) und wie schnell Vektoren transformiert werden können. Die eigentliche Transformation muss vom Hauptprozessor durchgeführt werden, sofern die Grafikprocessor keine entsprechenden Routinen bereitstellt. Die Amiga-Grafikprozessor (Agnes) verfügt nicht über integrierte Vektortransformationen, aber der Bresenham-Linearalgorithmus ist hardwaremäßig implementiert. Dies bot einen erheblichen Vorteil, obwohl die ersten Amigas über einen einfachen MC68000 (das Grundbaustein der MC68K-Familie von Motorola) als Hauptprozessor verfügten. Dieses Konzept umfasst auch die fortgeschritteneren Grafikrechner, die in verschiedenen Kontexten auftauchten. Diese Systeme implementierten Echtzeit-Textur-Mapping und Z-Buffering in der Hardware sowie sehr schnelle RISC-Hauptprozessoren, beispielsweise von MIPS. Silicon Graphics-Maschinen (das Unternehmen SGI wurde 1982 gegründet) sind insbesondere durch die Filmindustrie und das Industrial Light & Magic bekannt (siehe Kapitel über Virtual Reality) sowie durch ihre Hardware-Optimierungen.

Das erste professionelle Programm (das mit sehr geringen Ressourcen begann) war Caligari und es war äußerst intuitiv. In diesem Programm hatte der Benutzer eine Ansicht, durch die er das Modell betrachten konnte, und konnte zwischen einer soliden (geschwindigkeitsmäßig sehr langsamen) oder einer Drahtgitter-Visualisierung (geschwindigkeitsmäßig akzeptabel) wählen. In Europa durchbrach diese Anwendung nicht den Markt, da der Markt zu begrenzt und arm war. Caligaris Benutzeroberfläche war besser als die zeitgenössischen Anwendungen, da die Bedienung einfacher und die Echtzeit-Feedback-Funktion hervorragend war. Wir konnten 3D-Objekte in Echtzeit wie gewöhnliche Icons verschieben. Frühzeitig wurden Amiga-Videoraytracer zur „Industriestandard“-Lösung, besonders in den USA und Kanada, doch der Markt verlangte ein besseres Programm. Die Anwendung, die nach einem umfangreichen Schönheits-Upgrade von der früheren Implementierung in Intuition v1.0 auf Intuition v2.0 umbenannt wurde, heißt Imagine.

Ich halte diese Programmserie für eine schlechte Fortsetzung der frühen Sculpt-Programme, obwohl sie nutzbarer sind. Der Grund dafür ist, dass ihre GUI bei der Definition von Materialien und Bewegungsabläufen völlig überladen und unübersichtlich geworden ist. Eine Person ohne großes Geduld verlässt diese Programmserie sehr schnell. Trotz dieser Probleme wird die Anwendung fleißig von TV-Werbeleuten in Amerika eingesetzt. Mein Lieblingsprogramm in diesen Zusammenhängen ist Real-3D (RealSoft aus Finnland). Die ursprüngliche Version war in der alten Intuition v1.0 implementiert und basierte auf derselben Metapher wie die Sculpt-Programme. Der größte Unterschied bestand darin, dass die Ansichten in nicht veränderbaren Fenstern implementiert waren und spezifische Blickwinkel aufwiesen, die nicht verändert werden konnten. Was wir sahen, waren drei Ansichten des Modells (von oben, von der Seite und orthogonal dazu) sowie eine Liste der Objekte des Modells in einem hierarchischen Baum. Neben der Liste befanden sich mehrere Symbole zur schnellen Definition von Objekten im Modell. Diese Symbole waren sehr unklar, und der Benutzer wählte meist das falsche Grundobjekt aus. Aus dieser Perspektive könnte man meinen, dass das Programm schwer zu bedienen sei – doch der Leser täuscht sich hier. Dieses Programm war sehr einfach zu verwenden, und ein Neuanwender konnte innerhalb der ersten fünf Minuten etwas Produktives erreichen.

Was bei dieser ersten Implementierung fehlte, war der Animationsbereich. Dieser war weit davon entfernt, gut abgebildet zu sein, und das Durchschnittsergebnis (Daten, die die Animationssequenz selbst enthalten und nicht die fertig berechnete Grafik) wies eine erschreckende Redundanz auf. Diese Probleme verschwanden mit der Einführung von Real-3D V2.0, das auf Intuition v2.0 basiert und einen sehr gefragten visuellen Aufschwung brachte. Leider wurde dabei die Einfachheit vernachlässigt, was dazu führte, dass nur eine sehr spezialisierte Gruppe von Menschen von diesem Programm angezogen wurde. Diese werden im Laufe der Zeit Experten, doch definitionsgemäß klingt das nicht gut mit dem Konzept eines guten GUI. Das Programm ist mit Amiga-Guide verknüpft und bietet daher auch für Gelegenheitsnutzer eine relativ große Hilfe. „Dies verdeckt zwar nicht die Probleme, aber etwas Hilfe ist besser als keine Hilfe überhaupt, und das Programm kann trotzdem verwendet werden – albeit nicht effizient!“ Dieses Zitat stammt von einer stillen Klage eines Gelegenheitsnutzers. Etwas, was in anderen Programmen nicht vorhanden ist, ist eine einfache funktionale Sprache (im Lisp-Stil), die beispielsweise die Erstellung von Bewegungsabläufen erleichtert. Mit diesem Minisprachsystem können wir unsere eigenen physikalischen Gesetze einfach auf Objekte anwenden. Dies verleiht der Benutzerfreundlichkeit sowohl eine positive als auch eine negative Richtung. Positiv, weil es einfacher wird, reale Vorgänge zu realisieren. Negativ, da die Metapher Hochsprachenprogrammierung und Mechanikkenntnisse ist, was einem wissenschaftsfeindlichen Nutzer wahrscheinlich allergische Reaktionen hervorrufen wird. Hoffentlich wird sich dies in zukünftigen Implementierungen stark ändern.

Das größte und teuerste, manchmal auch das beste Video-Ray-Trace-Programm heißt Lightwave. Dieses Programm ist eine umfangreiche Weiterentwicklung von Caligari und verfügt über ein eigenes GUI. Es verwendet nicht die Amiga-Standard-GUI, was ich persönlich als großen Nachteil empfinde. Der eigentliche 3D-Editor ist schnell und sehr praktisch zu bedienen. Das Problem bei dieser Anwendung sind die Moduswechsel. Der Benutzer wird nicht auf einen Moduswechsel hingewiesen, was äußerst frustrierend wirken kann. Auch die Definitionsteile für Objekte, Materialien und Bewegungsabläufe sind extrem umständlich und lassen selbst langjährige Computernutzer reagieren. Möglicherweise sind erfahrene Nutzer viel toleranter, doch das verringert die Probleme nicht. Lightwave wurde beispielsweise in den Fernsehserien Babylon-5 und seaQuest-DSV eingesetzt. Die anderen Video-Ray-Trace-Programme (auch auf anderen Personalcomputern), die verfügbar sind (in derselben Preisklasse zwischen 5.000 und 50.000 SEK), sind nicht einmal erwähnenswert, da sie erheblich größere Mängel aufweisen. Für Benutzer, die heute beeindruckt werden möchten, sollten die Silicon-Graphics-Maschinen mit den Programmen IGRIP und Elastic Reality diese Erfahrung bieten. Diese Anwendungen sind jedoch sehr teuer und nicht für die Allgemeinheit ausgelegt.

Meine Lösung für das Fenster

Ich habe Englisch als Grundsprache des Programms gewählt. Die Übersetzung ins Schwedische und die Implementierung der Locale-Nutzung sind einfach, aber zeitaufwendig. Der zentrale Bestandteil des Programms ist der 3D-Editor, weshalb das Fenster „3D View & Edit“ das Hauptfenster ist. Der Benutzer wird die meiste Zeit im 3D-Editor verbringen, weshalb diese Lösung sinnvoll erscheint. Der größte Teil dieses Fensters visualisiert die Zeichnung dreidimensional (derzeit nur als Drahtgitter), während der Rest der Grafikfläche spärlich mit einigen wichtigen Transformationswerkzeugen gefüllt ist. In diesem Fenster habe ich eine „Instant“-Hilfe platziert, die unten angezeigt wird und die zuletzt ausgeführte Funktion anzeigt.

Das Modell soll sich im Raum drehen können, und ich habe diese Rotation als „Gottes Hand“ implementiert. Ich verwende diesen Begriff, weil das Modell als ein Objekt aus Objekten aufgebaut ist und nicht als eine Welt, die aus Objekten besteht. Eigentlich sind diese Implementierungen gleichwertig, aber die Methoden zur Rotation des Modells unterscheiden sich stark. Stellen Sie sich vor, Sie drehen den Hörsaal statt um ihn herumzugehen. Ich persönlich finde, dass diese Lösung eine bessere Abbildung darstellt, da der Benutzer während der Modellrotation am Computer verbleibt. Bei einer zukünftigen Weiterentwicklung zu einer echten VR-Umgebung wäre diese Form nicht vorzuziehen, doch der Hauptcode ist in beiden Implementierungen identisch, weshalb die Arbeit nicht umsonst geleistet wurde. Die Umformer, die die Modellrotation steuern, habe ich in der Nähe des Modellvisualisierungsfensters platziert, was eine stärkere Abbildung ergibt als bei einer Platzierung in einem eigenen Fenster. Diese Lösung mag etwas schlecht erscheinen, da der Mauszeiger nicht dort ist, wo sich das Modell befindet (d. h. eine schlechte Abbildung). Allerdings ist der Bildschirm nur zweidimensional, und die Implementierung unsichtbarer Funktionsumformer zur Erleichterung der Rotation in der fehlenden Dimension würde viel größere Fehlabbildungen verursachen. Die Rotationsumformer sind als „Sliders“ ausgeführt und orientieren sich entlang der Welt-Hauptachsen (X-Achse nach rechts, Y-Achse nach oben).

Hauptbearbeitungsfenster von 3D-Audio, in dem der Benutzer das Modell und spezifische Objekte verschieben, drehen und skalieren kann.

Das Problem mit der Z-Achse besteht darin, dass Amigas Standardumformer (Intuition v2.0) keine kreisförmigen Sliders unterstützen, weshalb ich eine lineare Slider-Leiste für diese Achse verwenden musste. Es gibt zwei mögliche Platzierungsvarianten für den Z-Achsen-Slider: unterhalb der Y-Achse oder neben der X-Achse. Ich entschied mich dafür, ihn unterhalb der Y-Achse zu platzieren, wie oben dargestellt.

Das Problem bei der Verwendung von Slidern für die Rotation liegt in ihren Endpositionen. An den Endlagen können wir nicht weiter in Richtung der Endlage rotieren, was frustrierend ist. Ich löste dieses Problem, indem ich kleine Zurücksetztasten – visualisiert als ein „o“ für Ursprung – an allen Endlagen anbrachte. Wenn der Benutzer eine Zurücksetztaste drückt, wird die „Knob“ (Schieberegler-Knopf) des Slider-Umformers in die Mitte zwischen den Endlagen positioniert. Es mag eine gute Idee erscheinen, den Mauszeiger während dieser Zurücksetzvorgänge mitzuführen; doch ein plötzliches Springen des Mauszeigers könnte verwirrend wirken, weshalb ich diese Idee nicht umgesetzt habe. Eine weitere Detailspezifikation ist, dass sich das Modell in dieselbe Richtung drehen soll wie die Bewegung des Slider-Knopfs. Da ich nur eine einzige Ansicht sichtbar habe, sind einige Schnelltasten erforderlich, die die für das Modellieren besonders interessanten und nützlichen Ansichten der Modelle bereitstellen. Diese Tasten bezeichne ich als „Fast View“ und sie transformieren die Visualisierung in eine Draufsicht, Seitenansicht, orthogonale Ansichten davon und einen Vogelperspektive. Ohne diese Tasten wäre das Modellieren unmöglich gewesen. Die Transformationsgeschwindigkeit der Fast-View ist kritisch für das Modellieren, da sie stark von diesen Tasten abhängt (siehe 3D-Graphical Algorithmen). Der Grund, warum ich nur eine einzige Ansicht habe, ist, dass die Grafikausgabe minimiert werden soll. Bei mehreren Ansichten müssten wir jede einzelne Ansicht aktualisieren, wenn wir Objekte verschieben. Dieses Argument zeigt, dass die Berechnungszeit bei guter Rückmeldung umso länger wird, je mehr Ansichten vorhanden sind. Diese Extravaganz kann ich mir nicht leisten, und außerdem können mehrere Ansichten manchmal sehr verwirrend sein.

Normalerweise können wir das Modell in verschiedenen Größen betrachten, und dies ist auch in dieser Software möglich. Auch hier habe ich das Problem mit Schiebereglern gelöst. Wiederum gibt es zwei gleichwertige, aber völlig unterschiedlich empfundene Möglichkeiten, die Vergrößerung/Verkleinerung zuzuordnen: Entweder kann eine aufwärts gerichtete Bewegung eine Verkleinerung bedeuten (wir schieben das Objekt von uns weg) oder eine Vergrößerung (wir bringen unseren Kopf näher an das Objekt). Gemäß früheren Überlegungen hätte ich die erste Variante implementieren sollen, da der Benutzer am Computer sitzt. Ich habe dies jedoch nicht getan, weil diese Zuordnung sich falsch anfühlte (les: inkonsistent). Obwohl dies inkonsistent ist, ist diese Methode tiefgreifend logisch, und Benutzer sollten sie nicht sofort bemerken. Die Realisierung des Vergrößerungsschiebers brachte mir ein weiteres Problem mit sich, das bei voller Vergrößerung auftrat. Die erste Lösung bestand darin, den Schieber mit einer exponentiellen Funktion zu implementieren. Dies führte zu einer stark schlechten Abbildung, weshalb ich das Konzept verworfen habe. Eine weniger schlecht abgebildete Lösung war ein Zusatz am oberen Endpunkt (durch + visualisiert), der den Schieber zwischen Grob- und Feineinstellung hin- und herschaltete. Auch diese Lösung ist eigentlich schlecht, aber die Verwendung zweier funktional gleichartiger Schieber nebeneinander verursacht noch mehr Verwirrung; daher implementierte ich die zusätzliche Schaltfläche.

Um die Realitätsnähe zu erhöhen, können wir das Modell in Perspektivdarstellung visualisieren. Zwei parallele Linien, die von uns wegzeigen, treffen sich im Unendlichkeitspunkt (in diesem Fall in der Mitte des Modellvisualisierungsbereichs). Wie bei den vorherigen Umwandlern habe ich einen Schieber verwendet, der die Perspektive mit zunehmender Position erhöht. Die Grundlage dieser Abbildung ist unter anderem, dass die Schiebepotentiometer auf Mischpulten (das analoge Äquivalent zu Schiebern) bei höheren Positionen geringere Dämpfung erzeugen (höhere Signalstärke).

Im eigentlichen Modellvisualisierungsbereich zeige ich auch das Bodenplan-Netz des Modells mithilfe eines 3D-Gitters an. Dieses Gitter kann über zirkuläre Menüs in die Einheit und Unterteilung eingestellt werden, die sich für den jeweiligen Fall am besten eignen. Die eigentliche Maßeinheit ("measure") kann in Metern, Fuß oder abgeschaltet sein. Bei abgeschalteter Option wird das 3D-Gitter nicht visualisiert. Das Gitter kann verschiedene Größen ("grid size") aufweisen, wodurch es möglich wird, die Welt in Teilbereichen zu modellieren. Diese Funktion wird häufig bei der Definition von Objekten verwendet, die in vielen Zeichnungen enthalten sein sollen. Es ist meist eine gute Idee, die Eingabe von Zahlen zu minimieren, und in dieser Situation erscheint dies sinnvoll. Um die Orientierung des Modells zu verdeutlichen, habe ich die Größen der Hauptachsen übertrieben und X', Y', Z' an deren positive Endpunkte hinzugefügt. Dieses Ergänzungselement ist primär, da die Hauptachsen der Welt statisch sind und dadurch eine schlechte Abbildung mit den Bezeichnungen der Rotationsumformungen vermieden wird. Die Objekte im Modell werden durch eine Stecknadel im Rotationszentrum des Objekts visualisiert. Der Benutzer bestimmt selbst, wo dieses Zentrum beim Definieren des Objekts platziert werden soll. Wenn der Benutzer ein bestimmtes Objekt verschieben möchte, wählt er es aus, indem er den Mauszeiger auf den Stecknadelschaft platziert und die Maustaste drückt. Der Mauszeiger verschwindet, das gesamte Objekt wird zur Mauszeiger-Interaktion, und Probleme mit der Perspektive (Dinge, die näher sind, bewegen sich schneller als solche, die weit entfernt sind), werden umgangen. Ein weiteres visuelles Verständnis wird dadurch erreicht, dass die Modellfläche in den Bildschirm gedrückt wird, was anzeigt, dass das Objekt ausgewählt wurde und die übrige Modellansicht stillsteht (d. h., „das Objekt wurde aus dem Modell angehoben“). Sobald der Benutzer die Maustaste loslässt, wird das Objekt an der visualisierten Position platziert.

Die Objekte werden in der Ebene verschoben, die der Bildschirm visualisiert. Dies ist die Grundlage für die ersten drei Festansicht-Tasten. Planare Verschiebungen sind vorzuziehen, da räumliche Verschiebungen ungewöhnlich und schlecht zu mappen sind – zumindest in den von mir implementierten Versionen mit Hilfe-Schatten. Um die Unübersichtlichkeit, die typischerweise in Drahtgittermodellen auftritt, zu reduzieren, lasse ich die Stecknadeln als letztes in der Visualisierung zeichnen. Dadurch befinden sich alle Stecknadeln vorne, und keine Objekte verdecken die Stecknadeln anderer Objekte. In komplexen Zeichnungen können diese Stecknadeln sehr unübersichtlich werden (sie überlappen sich), sodass der Benutzer nicht erkennen kann, welche Stecknadel zu welchem Objekt gehört. Selbst einfache Modelle mit zwei Objekten können mehrdeutig werden, da die Stecknadeln der Objekte auf dieselbe Ebene projiziert werden können. Die Lösung dieses Problems werde ich später erneut aufgreifen, da sie Teil der Erklärung eines Unterfensters namens „Drawing-Pool“ ist. Unsere Objekte sollen einfach formbar und drehbar sein. Eine Möglichkeit wäre, Verschiebung, Drehung und Skalierung als verschiedene Modi im Programm zu implementieren oder jeweils eine Knopfnadel für jede Einheit bereitzustellen. Modi sind vollständig ausgeschlossen, und drei Knopfnadeln pro Objekt würden zu unübersichtlich werden. Eine Lösung mit nur einer Knopfnadel könnte eine Option sein. Allerdings sind die Mapping-Fehler, die dabei entstehen (wir fehlen einer Dimension), so groß, dass ich diese Lösung zwangsläufig aufgeben musste (zu meiner Verzweiflung).

Caligari und Lightwave haben dies mit Modi plus unsichtbaren Knopfnadeln implementiert, aber mir gelang es nicht, diese auf eine angemessene Weise zu nutzen. Daher habe ich für diesen Zweck skalierbare und drehbare Transformationswerkzeuge in Form von Schiebereglern implementiert. Diese sind nur verfügbar, wenn der Benutzer ein Objekt ausgewählt hat. Wenn ein Transformator nicht verfügbar ist, wird dies durch Verschattung angezeigt. Der Benutzer kann die Größe entlang der Hauptachsen des Objekts ändern, und die Drehung eines spezifischen Objekts wird analog zur gesamten Modell-Drehung abgebildet. Der größte Unterschied besteht darin, dass alle Dreh-Transformationswerkzeuge in dieselbe Richtung ausgerichtet sind. Dies deutet auf eine schlechte Abbildung hin, aber das Design wurde durch die Asymmetrie beeinträchtigt, und ich blieb bei dieser Lösung hängen. Die Skalierungs-Transformationswerkzeuge sind ebenfalls in dieselbe Richtung ausgerichtet, da die Ausrichtung der Objekte im Modell nicht unbedingt mit der physischen Lage des Objekts in der nicht-primären Welt – in diesem Fall dem Monitor – übereinstimmen muss. Um die Ausrichtung der Objekte im Modell zu verdeutlichen, visualisiere ich einen „Orientierer“, der die Hauptachsen (X", Y", Z") des Objekts anzeigt. Bei Skalierungsänderungen soll der Benutzer sicherstellen können, dass er in die richtige Richtung vergrößert. Obwohl diese Transformationswerkzeuge nicht in unmittelbarer Nähe zur eigentlichen Transformation platziert sind, können sie dennoch relativ effektiv genutzt werden. Wenn der Benutzer ein Objekt auswählt und verschiebt, wird die Position des Objekts im Modell (in der voreingestellten Maßeinheit) unten in der „Instant“-Hilfe angezeigt. Bei Skalierungsänderungen werden die Abmessungen des Objekts (Breite, Höhe und Tiefe in der voreingestellten Maßeinheit) an derselben Stelle angezeigt. Wenn der Benutzer das 3D-Gitter deaktiviert hat, werden die Objekt-Nadeln nicht dargestellt, und das Modell erhält eine klarere Visualisierung. Da die Objektnadeln nicht visualisiert werden, kann der Benutzer kein Objekt versehentlich auswählen. Dies ist eine bewusste Sicherheitsmaßnahme.

Der Benutzer muss kein spezifisches Objekt auswählen (den Mauszeiger in den Nadelbereich platzieren), sondern kann die gesamte Modellansicht (alle anderen Bereiche im Modell-Visualisierungsbereich) erfassen und im Projektionsebenen-Plan verschieben. Bei wiederholten Drehungen gefolgt von Verschiebungen entstehen leicht Schwierigkeiten mit dieser Funktion. Unser Haupt ist stationär, und alles andere bewegt sich um uns herum – was bedeutet, dass wir das Modell leicht außerhalb des Blickfelds drehen und es nie wieder sehen können. Daher setze ich das Drehzentrum des Modells bei jeder Modellrotation auf den Ursprung zurück, um Verwirrung zu vermeiden. Eine Verschiebung des Modells gefolgt von einer Objektauswahl führt jedoch nicht zu einer Rücksetzung des Drehzentrums. Dadurch wird es einfacher, periphere Objekte zu platzieren, zu drehen und zu skalieren (insbesondere bei starkem Perspektiv). Die meisten Namen der Umformungen sind abgekürzt, aber die Namen der Maß- und Gitterumformungen für das 3D-Netz sind vollständig ("Measure" für Maß und "Grid Size" für Gittergröße). Das Problem, Abkürzungen zu verwenden, ist nicht neu, und wenn sie besonders schlecht sind, wird das Verständnis unerträglich. Die Modellvergrößerungsumformung nenne ich Mg (Magnification, die normalerweise als Mag. abgekürzt wird), und die Perspektivumformung nenne ich Pr (Perspective, die normalerweise als Pers. abgekürzt wird). Dies mag anfangs kryptisch wirken, aber längere Abkürzungen hätten ästhetische Probleme in der Gestaltung verursacht, da ich nicht über eine unbegrenzte Fläche verfüge. Die Rotationsumformungen nenne ich X-, Y- und Z-Axis, und diese sollten keine größeren Verständnisprobleme verursachen.

Die Objektgrößenumformungen (object sizers) sind eigentlich sehr kryptisch (SX = Größe in X-Richtung, SY = Größe in Y-Richtung, SZ = Größe in Z-Richtung), ebenso wie die Objektrotationsumformungen (object turners, AX = Rotationswinkel um die X-Achse, AY = Rotationswinkel um die Y-Achse, AZ = Rotationswinkel um die Z-Achse). Diese Abkürzungen wirken etwas zu knapp, aber überflüssiger Text behindert die effiziente Nutzung. Der Benutzer liest den Text tendenziell jedes Mal, wenn er die Umformung verwendet, obwohl er die Funktion bereits kennt. Diese Form der Abkürzung deutet eine gewisse Inkonsistenz an, da ich in den ersten Fällen die ersten beiden Konsonanten verwendete und in den späteren Fällen willkürlich Anfangsbuchstaben aus dem Satz herausgriff. Allerdings erscheint diese Abkürzung bei näherer Überlegung angemessen, da sie ausreichend Informationen enthält.

Die Schnellansichts- ("Fast View") Umformungen sind in diesem Sinne relativ einleuchtend, da ihre Namen anzeigen, welche Ansicht angezeigt wird (X-Y-Ansicht, Z-X-Ansicht, Z-Y-Ansicht und Vogelperspektive). Diese Umformungen hätten eigentlich durch Symbole ergänzt werden sollen, um das Aussehen der Ansicht zu verdeutlichen; jedoch ist es in diesem Fall schwierig, eindeutige Symbole zu erstellen. Ein wichtiger Bestandteil der Modellbearbeitung ist die Aufteilung der verschiedenen Eigenschaften von Objekten und ihre einfache Zusammenfassung. Wir können eine computerbasierte Modellierung mittels E-R-Diagrammen durchführen und auf dieser Grundlage die Benutzeroberfläche erstellen. In diesem Fall war jedoch weder ein Diagramm noch eine Normalisierungsmethode erforderlich, da die Objekte sehr primitive Bestandteile aufweisen. Meine Lösung basiert auf diesen Komponenten: Form, Material und Bewegungsplan.

Das Modellkoordinierungsfenster von 3D-Audio, das der Benutzer bei der Definition von Objekten, Materialien und Bewegungsabläufen steuert.

Diese Primitiven vereinen sich in einem Modellkoordinierungsfenster, das ich „Drawing-Pool“ (DP) nenne. Alle Koordinierungsfenster tragen im meinem Programm „Pool“ als Nachname. Der Name „Pool“ (Pfütze) leitet sich von der „Unordnung“ ab, die typischerweise bei Koordinierungsversuchen entsteht (eigentlich das Verhalten von Tieren an Wasserlöchern in der Savanne).

Der Hauptbestandteil des DP-Fensters ist die Liste, in der die verschiedenen Objekte aufgelistet sind. In dieser Liste kann der Benutzer ein spezifisches Objekt auswählen, wobei Aktualisierungen sowohl im DP-Fenster (Erläuterung von Name, Typ, Material und Bewegungsplan) als auch im „3D View & Edit“-Fenster (Hervorhebung des Objekts in der Drahtgittermodell) erfolgen.

Zuvor habe ich über die Komplexität bei Drahtgittermodellierung geschrieben und das Selektionsproblem wie folgt gelöst: Zuerst wählt der Benutzer ein Objekt in der Objektliste des DP-Fensters aus. Anschließend drückt er eine der Umschalttasten (eigentlich eine schlechte Zuordnung, da ich nicht visualisiere, wie der Benutzer in diesen Fällen vorgehen soll), was anzeigt, dass er das Objekt mit beiden Händen hält (z. B. linke Hand auf Umschalttaste und rechte Hand am Steuergerät oder umgekehrt) und somit das spezifisch ausgewählte Objekt positionieren, verschieben, drehen oder skalieren kann. Diese Funktion wird sofort beendet, sobald die Umschalttaste losgelassen wird; wenn der Benutzer jedoch die Taste des Steuergeräts gedrückt hält, behält er das Objekt für die Verschiebung fest. Neben der Objektliste befinden sich Schaltflächen, die die Organisation der Modellobjekte erleichtern. Entsprechend den vorherigen Fenstern ist die größte visuelle Fläche oben links und die Editier-Transformationswerkzeuge rechts. Die Transformationswerkzeuge, die drei Punkte nach dem Namen haben, deuten darauf hin, dass eine fragende Fortsetzung auf die Aktion folgt.

Die Funktion der obersten Editier-Schaltfläche ("Neu...") besteht darin, ein neues Objekt in das Modell einzufügen, indem über einen Dialog abgefragt wird, welcher Objekttyp hinzugefügt werden soll. Die Metapher ist, dass wir in ein Möbelhaus fahren und Möbel kaufen. Sobald der Benutzer das spezifische "Möbel" ausgewählt hat, wird es immer im Ursprung des Modells platziert, und eine Aktualisierung der Visualisierung im Hauptfenster folgt. Die neu erstellten Objekte sind nicht an spezifische Materialien oder Bewegungspläne gebunden. Dies wird durch "KEIN TYP ÜBERHAUPT" (Möbeltyp), "KEIN MATERIAL ZUGEWIESEN" (Möbelmaterial) und "KEINE FLUGROUTE ZUGEWIESEN" (Bewegungsplan des Möbels) in den jeweiligen Informationsbereichen visualisiert.

Der Benutzer kann dann über die Schaltfläche "Auswählen..." in der Materialanzeige auswählen, aus welchem Material das Objekt besteht. Diese Schaltfläche löst einen Dialog aus, in dem der Benutzer aufgefordert wird, ein Material auszuwählen. Die Spezifizierung des Bewegungsplans ist identisch, wobei der Benutzer jedoch aufgefordert wird, eine "Flugroute" auszuwählen. Sobald der Benutzer diese Elemente ausgewählt hat, kann er das kürzlich erstellte Objekt im Modell benennen. Dies geschieht über den Namens-Transformator. Eine Namensänderung führt zu einer Aktualisierung der Objektnamensliste. Wenn das Modell mehrere Objekte mit derselben Morphologie und demselben Material enthalten soll, kann der Benutzer bereits vorhandene Objekte mit der Schaltfläche „Kopieren“ duplizieren. Objekte, die überflüssig oder anderweitig als unnötig in der Modellierung erachtet werden, können mit der Schaltfläche „Löschen“ entfernt werden. Beim Löschen wird das Objekt an die Spitze des „Rückgängig“-Stapels im DP-Fenster hinzugefügt und kann mit der größeren „Rückgängig“-Schaltfläche wiederhergestellt werden. Wenn der Benutzer das gesamte Modell löschen möchte, kann er die Schaltfläche „Löschen“ aktivieren, wobei alle Objekte auf den „Rückgängig“-Stapel gelegt werden. Diese Funktion wurde lediglich als konsequenzfördernde Maßnahme implementiert, da sie in den anderen Pools bereits vorhanden ist (mit deutlich höherer Nutzungshäufigkeit).

Wenn der Benutzer nach einer Weile der Neuanordnung des Modells zum Hauptfenster für die Objektplatzierung zurückkehren möchte, tut er dies, indem er auf die Schaltfläche „Bearbeiten...“ klickt. Dadurch wird das Hauptfenster vor alle anderen Fenster geholt und mit dem ausgewählten Objekt im „Hervorheben“-Modus aktiviert. Farbzuordnungen sollten grundsätzlich vermieden werden, da auch farbenblinde Personen das Programm nutzen sollen. Die Hauptzuordnung, bei der der Benutzer erkennen muss, welches Objekt ausgewählt ist, ist jedoch die Namensliste im DP-Fenster. Die Notwendigkeit dieser Lösung ergibt sich aus der Klarheit bei der Drahtgittervisualisierung.

Der Benutzer kann eigene Objekte definieren, indem er die Schaltfläche „Zeichnen>Objekt...“ aktiviert. Diese Funktion wandelt das gesamte Modell in ein einzelnes Objekt um, das ausschließlich aus der morphologischen Struktur besteht. Die Metapher dabei ist, dass der Schöpfer sein neues Möbelstück an die Möbelfabrik zur Klonung sendet. Die Aktivierungstasten sind alle als Texttasten gestaltet, da ihre Funktionen allgemein und stark verankert sind. Daher habe ich auf Symbole für diese verzichtet, obwohl die Platzersparnisse bedeutend gewesen wären und die Symbole möglicherweise im Hauptfenster platziert werden könnten. Auch gewisse Unübersichtlichkeiten werden vermieden, wenn wir die GUI auf diese Weise mit großen, „kindfreundlichen“ Tasten mit etwas Abstand um sie herum gestalten. Die Schwierigkeiten bei der Platzierung und Gestaltung von Tasten zur Minimierung möglicher Benutzerfehler können reduziert werden, wenn wir verwandte Funktionen näher beieinander und weniger verwandte Funktionen deutlich weiter voneinander entfernt platzieren. Eine Taste, die diesen Kriterien nicht entspricht, ist die „Rückgängig“-Taste („Undo“), die nahe der fatalsten Funktion platziert werden sollte und mindestens doppelt so groß sein sollte wie die anderen Tasten.

Möglicherweise ist die Objektdedefinitionstaste schwer verständlich, da sie das Wissen des Benutzers über den „->“-Operator im sprachlichen Kontext voraussetzt. Dieser Sprachoperator bedeutet in diesem Fall die Umwandlung von Einheit X in Einheit Y (X->Y). Logisch erscheint diese Definition korrekt, doch ob die Wahrnehmung durch allgemeine Benutzer dies intuitiv akzeptiert, kann in einigen Fällen diskutiert werden. Allerdings sind längere Sätze unnötig kompliziert und erscheinen mir im sonst klaren Aussehen störend (insbesondere in diesem Fall).

Die spezifischen Importfenster von 3D-Audio für primitive Objekte, Materialien und Bewegungsabläufe. Bei Bestätigung wird der Benutzer automatisch zum Modellkoordinierungsfenster zurückgeführt.

Die drei Objektabholstellen ("Object Pool"), Materialien ("Material Pool", MP) und Bewegungsabläufe ("Flight Pool") basieren auf einer benutzerdefinierten Fragebogen-Archetyp. Diese Archetyp ist handgefertigt und kein Bestandteil der "Amiga-GUI requester library". In gleicher Weise wie zuvor befindet sich eine Namensliste links, die Bearbeitungsschaltflächen rechts und die Namensumformungen unten. Ihre Funktionen sind identisch mit denen im DP-Fenster. Der Benutzer soll die für das Objekt geeigneten Kriterien aus diesen Abholstellen auswählen und dann entweder die "Ok!"-Schaltfläche oder, falls eine Fehlbedienung aufgetreten ist, die "Cancel"-Schaltfläche drücken. Diese Bestätigungsschaltflächen sind gemäß der echten "Amiga requester layout" angeordnet. Die Definition neuer und die Umformung älterer Einheiten ist derzeit nur im MP-Fenster möglich.

Beim Definieren und Umformen von Materialien öffnet sich ein Fragebogen-Fenster ("Characteristics"), in dem der Benutzer verschiedene Materialeigenschaften festlegt. Die Eigenschaften, die oben platziert sind, umfassen Name, Typ (Möbel, Sender, Empfänger) und Farbe (die in einer zukünftigen Implementierung mit Solidframe-Modellierung verwendet werden soll). Unter diesen Umformern befindet sich ein Diagramm, das die frequenzielle Charakteristik des Materials zeigt. Das Diagramm zeigt die Absorptionskurve, wenn es sich um ein Möbel handelt, und den Frequenzgang für die anderen Typen (Sender und Empfänger).

Hierbei greife ich auf die Vorstellung zurück, dass alle Objekte letztlich als Filter betrachtet werden können. In diesem Diagramm kann der Benutzer die frequenzielle Charakteristik freihand zeichnen, und bei der ersten Umformung wird das Diagramm in den Monitor eingeblendet, um deutlich zu machen, dass eine Änderung vorgenommen wurde. Da Absorptionskoeffizienten nicht in allen Frequenzbändern gemessen werden, werden die Bereiche, die nicht in den Berechnungen verwendet werden, abgeschattet.

Das Materialdefinitionsfenster von 3D-Audio, das der Benutzer erreicht, wenn er auf „Neu...“ oder „Bearbeiten...“ auf der Materialquelle („Materialpool“) klickt.

Unter diesem Diagramm befinden sich die Richtungsomwandler. Diese sind unter jeweiligen Frequenzoktaven platziert, um eine gute Abbildung zu gewährleisten. Hier kann der Benutzer bestimmen, welche Richtungen Reflexion, Sendung oder Empfang bei verschiedenen Frequenzen haben (Lesen Sie „Die Natur des Schalls und die Audioverarbeitung“, um die Terminologie zu verstehen). Auch dieses Formular verfügt über Bestätigungstasten unten. Im Gegensatz zu meinem früheren Argument zur Platzierung der „Rückgängig“-Taste habe ich diese zwischen die Bestätigungstasten platziert.

Es war ästhetisch falsch, sie neben dem Frequenzdiagramm (rechte Seite zur Wahrung der Konsistenz) zu platzieren. Dennoch ist sie weiterhin in Übereinstimmung mit der Nähe zu größeren, kritischen Umwandlern (auch wenn sie nicht direkt benachbart ist). Die Gestaltung des Materialdefinitionsfensters weist gewisse Ähnlichkeiten mit fortgeschrittenen Fragebögen auf. Diese Metapher kann bei richtiger Gestaltung eine sehr gute Benutzeroberfläche werden, da Formulare in der westlichen Zivilisation stark etabliert sind.

Die berechneten Strahlwege des 3D-Audios werden in diesem Fenster visualisiert, und der Benutzer kann die relative Luftfeuchtigkeit sowie das zu Grunde gelegte Ohr (Empfänger) des Modells für das Impulsantwortsignal unten auswählen.

Wenn die Strahlverfolgung berechnet wird, öffnet sich ein Datavisualisierungsfenster („Computed Data“, CD). Dieses Fenster befindet sich noch im Betastadium, da die tatsächliche Implementierung in der Auralisierungsmodul erfolgen wird. Oben links zeige ich die Parameter, auf die der Strahlverfolger eingestellt ist. Diese werden in möglichst kurzen, präzisen englischen Begriffen beschrieben, da die Grafikfläche für wichtigere Aufgaben benötigt wird. Eine sehr wichtige Grafik ist die Nachhallverteilung, die die Nachhallzeiten in verschiedenen Frequenzbändern zeigt. Diese Zeiten werden mithilfe der Sabine-Formel berechnet. Darüber hinaus kann der Benutzer eine spezifische Luftfeuchtigkeit aus einem Zyklenmenü ("R. Humidity") auswählen. Während der Computer die Strahlengangberechnung durchführt, visualisiert er bei erfolgreichen Berechnungen diese im Echogramm unten im Fenster (Amplitude abhängig vom Strahlweg). Ein Balken zeigt an, wie viele Berechnungen noch ausstehen. Obwohl diese Visualisierung nützlich ist, unterstreiche ich längere Berechnungsprozesse dadurch, dass ich das Aussehen des Mauszeigers ändere. Der Pfeil verwandelt sich in eine Uhr, wenn der Benutzer die Standard-Einstellung in „Pointer Preferences“ (Amiga-Einstellungsprogramm) verwendet. Nach Abschluss der Strahlverfolgung kann der Benutzer mit Hilfe des Zyklenmenüs „Receiver“ auswählen, welcher Empfänger im Echogramm dargestellt werden soll.

Das 3D-Audio-Voreinstellungsfenster ("Einstellungen"), in dem der Benutzer angeben kann, wo die verschiedenen Dateneinheiten in ihrem Computersystem platziert werden sollen.

Um das Leben für den Benutzer einfacher und unterhaltsamer zu gestalten, habe ich ein Fenster für grundlegende Einstellungen implementiert. Hier kann der Benutzer festlegen, wo seine Speicherbereiche für Modelle, Möbel, Materialien, Bewegungsabläufe und berechnete Strahlengänge liegen sollen.

Der Benutzer kann entweder die Namensfelder direkt ausfüllen oder auf „Set...“ klicken, wodurch eine Speicherabfrage aktiviert wird. Auch die Grundfarben der Anwendung können nach Wunsch angepasst werden. Die Farbauswahlfelder entsprechen dem standardmäßigen Amiga-GUI-Typ, wobei Farben in drei Komponenten aufgeteilt sind (R = Rot, G = Grün, B = Blau). Diese Komponenten sind tief in Intuition verankert und werden beispielsweise im „Palette Preferences“ (Amiga-Einstellungsprogramm) verwendet. Der Benutzer wählt zuerst eine Farbe aus und schiebt dann die Schieberegler auf die richtigen Positionen. Die Farben ändern sich sofort, was eine relativ gute Abbildung ermöglicht. In Intuition V3.0 steht ein Farbrad zur besseren Zuordnung zur Verfügung, doch das Problem, die notwendigen Fakten für die Nutzung dieses Features zu beschaffen, zwang mich dazu, die schlechtere Variante zu implementieren. Unten befinden sich erneut Bestätigungsschaltflächen, die in diesem Fall etwas komplexer sind als zuvor. Wenn der Benutzer einen Fehler begeht, klickt er wie üblich auf die Schaltfläche „Bearbeitungen rückgängig machen“; wenn er erkennt, dass keine Umformungen erforderlich sind, klickt er auf „Abbrechen“. Beim Start des Programms werden die Einstellungen dieses Fensters geladen und angewendet. Daher kann der Benutzer die Einstellungen speichern („Bearbeitungen speichern“), um sie zukünftig zu verwenden, solange keine neue Umformung mit „Bearbeitungen speichern“ durchgeführt wird, oder sie ohne Speicherung verwenden („Verwenden“).

Während längeren Modellierungssitzungen wird der Benutzer vergessen, welches „Möbelgeschäft“, welche „Rohstoffhandlung“ und welche „Fluggesellschaft“ er besucht hat. Daher habe ich ein Informationsfenster („Über-Fenster“) implementiert, das diese Informationen sowie den Modellnamen anzeigt. Auch die Verfügbarkeit der beiden Speicherformen (Fest- und Chip-Speicher) sowie der Name des Programmentwicklers werden angezeigt. Die drei verschiedenen Arten von Objekten, die in einer Modell existieren können, werden ausgegeben, um den Benutzer über die Komplexität der Modellierung zu informieren. Diese Zahlen sind direkt proportional zur Berechnungszeit für die Strahlverfolgung (höhere Zahlen führen zu längeren Berechnungszeiten).

Das Erste-Hilfe-Fenster von 3D-Audio, in dem der Benutzer die geladenen Primitiven und die Komplexität des Modells sehen kann. Die Verfügbarkeit der beiden verschiedenen Speichertypen wird in Bytes angezeigt.

Neben all diesen Fenstern gibt es eine Vielzahl von Informations-, Bestätigungs- und Abfragefenstern. Diese habe ich implementiert, damit der Benutzer nicht größere Fehler begehen kann – etwa die Modellierung beim Beenden des Programms zu verlieren. In Abbildung 4.8 zeige ich einen Ausschnitt der zusätzlichen Fenster, die im Programm vorhanden sind und dem Benutzer bei „unvorbereiteter“ Nutzung begegnen können. Fenster für Abfragen treten bei allen Arten von Sekundärspeicheraktivitäten auf. Diese sind Intuitions eigene „Dateiabfragen“, damit das Programm konsistent mit allen anderen Amiga-Programmen ist. Eine Form solcher Abfragefenster sind diejenigen, die lediglich eine Bestätigung erfordern (Bestätigungsfenster). Solche Fenster treten beispielsweise auf, wenn der Benutzer eine umfangreiche Änderung durchführen soll (z. B. Programm verlassen, Projekt löschen usw.). Beim Wechsel des Modells, Objekt-Pools, Material-Pools oder Bewegungsplan-Pools wird die Anwendung den Benutzer fragen, ob er die vorgenommenen Änderungen verwerfen möchte. Wenn der Benutzer ein vollständiges Verlassen oder eine vollständige Zurücksetzung des Programms vornehmen möchte, wird dies ebenfalls überprüft, falls Änderungen vorgenommen wurden. Bei mehreren Änderungen können wir die verschiedenen Einheiten in einem Fenster zusammenfassen, um eine bessere Übersicht zu bieten. Die Einheiten sollen in derselben Reihenfolge ausgegeben werden, wie sie im Programm auftreten, um die Konsistenz zu gewährleisten.

Hinweisfenster werden verwendet, wenn ein Benutzerfehler aufgetreten ist, und können eine mehr oder weniger intelligente Fehlermeldung enthalten. In den meisten grafischen Benutzeroberflächen sind Benutzerfehler von sehr geringer Schwere und daher einfach in eine Fehlermeldung zu fassen. Allerdings sind die Benutzerfehler, die beim Laden von Programmdaten von einem Sekundärspeicher auftreten, von wesentlich komplexerer Natur.

Da ich alle aus der Anwendung erzeugten Daten in einer bearbeitbaren Form speichere (der Benutzer kann die Daten in einem gewöhnlichen Texteditor lesen und bearbeiten), kann der Benutzer auch Fehler bearbeiten. Diese Fehler müssen erkannt und bei Versuchen des Ladens eine unverschlüsselte Fehlermeldung ausgegeben werden. Ich habe bisher nur die Berechnung der Zeilennummer des Fehlers implementiert, was später in „Meine Lösungsform für die Arbeitsbank“ erläutert wird. Bestätigungsbuttons sollen als Text-Buttons gestaltet sein, um Mehrdeutigkeit zu minimieren. Die in Intuition zu befolgende Norm ist, dass die „fatale“ Umwandlung durch Aktivierung der linken Taste im Bestätigungsfenster erfolgt ("OK!", "Programm beenden!", "Daten löschen!"). Um mögliche Bedienungsfehler zu vermeiden, wird die rechte Bestätigungstaste ("Abbrechen") aktiviert. Diese Taste darf niemals ihren Text ändern, um Verwirrung zu vermeiden. Die fatalen Umwandlungen (linke Taste) werden jedoch deutlicher, wenn wir bei Blockbestätigungen speziell formulierte Sätze verwenden.

Wenn nur eine Bestätigungstaste vorhanden ist, sollte diese die Natur des Problems widerspiegeln. Wenn der Benutzer einen Fehler gemacht hat, sollte die Schaltflächentext in Ich-Form formuliert sein, um die Erinnerung an den eigenen Fehler zu verstärken ("Mein Fehler!"). Dies sollte den Benutzer dazu bringen, fehlerhafte Nutzung mit der Zeit zu hassen. Das Problem könnte später darin bestehen, dass der Benutzer sich über den Computer und dessen „Besserwisser“-Art ärgert.

Probleme geringerer Natur (z. B. falsche Installation von Software), die die Anwendung nicht wesentlich beeinträchtigen, dürfen selbstverständlich keine solchen starken Aufklärungsformen hervorrufen ("Kein Problem!"). Die Grundlage meiner Wahl dieser Begriffe ist, dass Programme, die ausschließlich die Schaltfläche „OK“ verwenden, früher oder später in eine mehrdeutige Phase geraten, und die Änderung der Fehlertaste gegen die Regeln verstößt. Es soll einfacher sein, Fehler zu korrigieren, als sie zu begehen.

Ein Auszug aus den Fragen-, Bestätigungs- und Informationsfenstern von 3D-Audio.
Meine Lösung für Menüs

Weitere Details, die die Bedienung erleichtern, sind Menüs. Diese dienen unter anderem dazu, mehrfache Tastendrücke für verschiedene Funktionen zu vermeiden. Die Gestaltung von Menüs sollte auch dem übrigen Interface entsprechen und stark mit anderen Programmen übereinstimmen. Gemäß den Intuition-Standards sollten Projektumwandlungen zuerst erscheinen, gefolgt von Bearbeitungswerkzeugen. Danach kommen weitergehende programmspezifische Umwandlungen. Obwohl mehrfache Tastendrücke vermieden werden sollen, existieren sie in Form von Drücken der rechten Amiga-Taste zusammen mit einer normalen Taste. Diese Form wird automatisch im Menü von Intuition visualisiert. Diese Funktionen erhöhen die Benutzereffizienz, ohne die Anfängervriendlichkeit zu beeinträchtigen.

In jeder Applikationsinstanz kann der Benutzer die für das aktive Fenster relevanten Menüfunktionen aktivieren. Wir können lokale Menüs implementieren, die speziell für jedes Benutzerfenster gestaltet sind. Dies verursacht jedoch starke Verwirrung beim Benutzer, da große visuelle Menüänderungen innerhalb des Anwendungsfensters eine schlechte lokale Konsistenz erzeugen. Ich löste dieses Problem, indem ich das Menü als globales Menü gestaltete. Das Problem dieser Lösung besteht darin, dass der Benutzer bei falschen Instanzen falsche Funktionen aktivieren kann. Um diese Probleme zu vermeiden und den Benutzer zu den richtigen Funktionen zu führen, deaktiviere ich (grauere) alle nicht verwandten Menüfunktionen in allen spezifischen Fällen.

Die in der „Project“-Menüleiste implementierten Funktionen sind: „New“ (vollständige Zurücksetzung der gesamten Anwendung), „Open...“ (Laden von Modellen, Objektpools, Materialpools, Bewegungsplänen, Vorwärtsstrahlverfolgungsdaten und Rückwärtsstrahlverfolgungsdaten), „Merge...“ (Verschmelzung von Modellen, Objektpools, Materialpools und Bewegungsplänen), „Save“ (Speichern von Modell, Objektpool, Materialpool und Bewegungsplan ohne Änderung des bisherigen Namens), „Save As...“ (wie „Save“, jedoch mit möglicher Namensänderung), „About...“ (Öffnet das Informationsfenster „About Window“) und „Quit...“ (beendet das Programm mit Bestätigungsabfragen).

Das 3D-Audio-Projektmenü, das bei allen externen Interaktionen verwendet wird. Außerdem kann der Benutzer über dieses Menü das Erste-Hilfe-Fenster aufrufen und bei Beendigung der Modelliersitzung einen vollständigen Abbruch durchführen.

Da dieses Programm auf größere Arbeitsgruppen ausgerichtet ist, die parallel arbeiten sollen, ist die Aufteilung der Programmdaten von großer Bedeutung. Einige Mitglieder der Gruppe modellieren, während andere Materialien und Möbel erstellen. Außerdem können einige Bewegungsabläufe auf die bereits fertigen Objekte in der Modellierung anwenden. Die Zusammenführungsfunktionen ("Merge") dienen genau diesem Zweck.

Die Funktionen in „Editing Windows“ dienen ausschließlich dazu, die jeweiligen Fenster nach vorne zu bringen und Unübersichtlichkeit auf dem Bildschirm zu vermeiden. Die Aufteilung in zwei Blöcke erfolgte, da die drei unteren Fenster fragende Art haben, während die oberen Haupt-Editierfenster sind.

Wenn der Benutzer keinen großen Hochauflösungsmonitor zur Verfügung hat, wird der Bildschirm durch überlappende Fenster verunreinigt, und um die Suche zu erleichtern, existiert dieses Menü. Die Aktivierung einer bestimmten Menüzeile bringt das entsprechende Fenster nach vorne.

Die Parameter und Aktivierung des Strahlverfolgers werden im Menü „Tracer“ visualisiert. Die Genauigkeitsparameter sind alle vom gleichen Aufzählungstyp ("Hoch", "Mittel", "Niedrig", "Automatisch"), und ihre Funktionsnamen sind konsistent formuliert. Obwohl es sich um längere Texte handelt, handelt es sich bei diesen Funktionen um selten genutzte Funktionen. Der Benutzer verbringt mehr Zeit mit dem Modellieren als mit der Parametereinstellung, weshalb die Anforderungen an Effizienz in diesem Fall von geringer Bedeutung sind. Tatsächlich ist diese Art der Parametereinstellung unvorteilhaft, da der Benutzer keinen Überblick über die eingestellten Funktionen hat. Es sei erneut darauf hingewiesen, dass der Strahlverfolger-Teil sich noch im Beta-Stadium befindet. Das zweite Block in diesem Menü dient der Aktivierung des Strahlverfolgungsrechenmoduls in der Anwendung. Das dritte Block ist für die Visualisierung bereits berechneter Daten vorgesehen.

Die verschiedenen Parameter des Strahlverfolgungsalgorithmus wurden in dieses Menü aufgenommen. (Hinweis: Beta-Stadium)

Funktionen, die nicht in andere Menüs passen, sammeln wir am Ende der Menüleiste ("Verschiedenes"). Dieses Menü darf nicht als „Müllmenü“ für überflüssige Funktionen bezeichnet werden, sondern soll wichtige Funktionen enthalten. Zu den im Rahmen meines Programms wichtigen Funktionen zählen das Löschen spezifischer „Rückgängig“-Stapel ("Löschen >>", wobei >> auf Untermenüs hinweist) und das Öffnen des Grundkonfigurationsfensters der Benutzeroberfläche ("Einstellungen...").

))) )))

Wenn der Computerspeicher voll ist, kann es eine gute Idee sein, verschiedene „Geschehen-und-Ungeschehen-Haufen“ zu leeren. Der Benutzer kann über dieses Menü das Voreinstellungsfenster öffnen.
Meine Lösung für die Arbeitsbank

Die zugehörigen Dateneinheiten der Anwendung sollen auf der Arbeitsfläche ("Workbench") mit einfachen Symbolen visualisiert werden. Diese Symbole sollen anzeigen, was die Dateneinheiten enthalten (siehe Abbildung 4.13), und der Benutzer kann sie im „Icon Editor“ (Standard-Programm der Amiga-Umgebung) neu gestalten, um besser seinen Bedürfnissen zu entsprechen. Die Symbole der Dateneinheiten sowie die Voreinstellungen und primitiven Objekte, Materialien und Bewegungsabläufe befinden sich in einem speziellen Ordner ("3DA-Prefs"). Alle diese Symbole und Datendateien kann der Benutzer selbst nach eigenem Geschmack mit einem geeigneten System-Editor umgestalten. Die Eingabe von Zahlen habe ich im Hauptprogramm vermieden, da die Strahlverfolgungs-Genauigkeit gering ist.

Tatsächlich sind alle Formen der Zahlenrepräsentation für nicht-technisch orientierte Benutzer abschreckend. Bei zahlreichen Gelegenheiten habe ich Benutzer beobachtet, die eine Anwendung wegen ihrer überflüssigen Zahlenrepräsentation aufgegeben haben. Wenn wir große Zahlenblöcke entfernen, erhöhen wir die Benutzerfreundlichkeit (persönlich liebe ich Zahlen). Die Benutzer, die eine hohe Genauigkeit benötigen, können auf eine Dateneinheit „doppelklicken“. Dadurch wird der bevorzugte Textverarbeitungs-Editor gestartet und lädt die Dateneinheit. In weniger kryptischen Begriffen: Das Symbol ist an den Textverarbeitungs-Editor und nicht an mein Hauptprogramm gebunden. Dies kann jedoch einfach geändert werden, indem die „Default Tool“-Einstellung in den Ursprungssymbolen angepasst wird, die sich im Unterordner „Icons“ befinden. Die einzige Benutzerfreundlichkeit dieser bearbeitbaren Dateneinheiten besteht darin, dass Textzeilen mit $ und Zahlenzeilen mit # gekennzeichnet sind, zusätzlich zu einem Header, der den Benutzer darüber informiert, um welche Art von Datei es sich handelt. Für diejenigen, die diese Zeichen seltsam finden, möchte ich klarstellen, dass sie ein Überbleibsel aus der BASIC-Zeit sind und mir in diesem Fall gut passen. Eigentlich sollte es eine zweiseitige Compiler-Implementierung (Zwischensprache <-> Sprache) für diese Einheit geben. Ich habe dies jedoch auf die niedrigste Priorität gesetzt, da das Hauptprogramm noch nicht vollständig ist. Die Implementierung eines zweiseitigen PHIGS- (Programmer's Hierarchical Interactive Graphics Standard-) konsistenten Compilers oder Interpreters (parallele Ausführung unter ARREX) ist lediglich ein Spezialprojekt.

Ein mögliches Szenario auf der Arbeitsplatte. Die verschiedenen Dateneinheiten sind logisch und physisch getrennt, auch auf dem Speichermedium. Die Voreinstellungseinheiten befinden sich in 3DA-Prefs, wo der Benutzer eigene Primitivdateien festlegen kann, die beim Start von 3D-Audio geladen werden sollen. Außerdem befinden sich die Standard-Symbole in einem Unterordner „Icons“, wo der Benutzer die Symbole der Dateneinheiten anpassen und festlegen kann, welcher Programmtyp bei einem Doppelklick auf das Symbol ausgeführt werden soll.

Die Gestaltung dieser Icons erfolgte auf einer „naiven“ Ebene. Beispielsweise wird das Bewegungsschema-Icon als Flugzeug visualisiert. Das Material-Icon stammt aus der Signalfilter-Norm (drei übereinander liegende Wellen). Das Objekt-Icon ist als frei schwebender Würfel dargestellt, während das Modell-Icon eine kleine Modellversion mit Boden ist. Die Voreinstellungs-Ikon ist als Miniatur-Fragebogen gestaltet. Die beiden möglichen Berechnungsmethoden – Vorwärts- und Rückwärtsstrahlengang – werden durch einen Lautsprecher und ein Mikrofon mit Pfeilen in die jeweilige Richtung dargestellt. Das Icon des Hauptprogramms ist eine stilisierte Variante von A3D (Audio 3D), die einer Mikrofon-Darstellung in einem Klangfeld entsprechen soll. Benutzer, die dieses Icon nicht sofort deuten können, sollten sich keine großen Sorgen machen. Beim Start können Anwendungen unterschiedliche Startparameter erfordern ("WBArgs" für WorkBench Arguments oder "CArgs" für Command Line Interface Arguments).

Symbol des Hauptprogramms, mit der der Benutzer die Bildschirmauflösung für diese Anwendung (WBArgs) einstellen kann.

Diese Parameter können Speicheranforderungen, Bildschirmauflösung usw. beschreiben. Die Bildschirmauflösungsparameter habe ich in diesem Schritt implementiert, da die Anwendung wahrscheinlich nur einmal pro Maschine installiert wird. Die englische Amiga-Standardvorgabe verlangt, dass „HIRES“ oder „SUPERLACE“ zu den „Tool Types“ als Auflösungsangaben hinzugefügt werden, um Konsistenz zu gewährleisten.

Icon-Interaktionsfluss

Das Ikoneflussdiagramm zeigt die Kommunikation zwischen den verschiedenen Programmkomponenten.
Vollständige Pfeile bedeuten, dass Daten generiert und verwendet werden. Gestrichelte Pfeile bedeuten, dass Bearbeitung nicht empfohlen wird. Dicke durchgezogene Linien bedeuten den Hauptprogramm-Griff.

3D-Transformationsalgorithmen

...real computer scientists rarely use numbers larger than 255...

Andrew S. Tanenbaum

Im vorherigen Abschnitt habe ich über Mensch-Computer-Interaktion (MDI) und deren Anforderungen geschrieben. Der wichtigste Teil meines Programms, wenn wir MDI berücksichtigen, ist der dreidimensionale grafische Editor. Damit dieser nutzbar ist, müssen die grundlegenden Algorithmen der 3D-Modellierung auf das beste mögliche Maß optimiert werden. Wir können 3D-Modellierung in folgende Komponenten unterteilen: Skalierung (Größenänderung), Translation (Verschiebung), Rotation und Projektion. Der Grund, warum wir hier Projektion betrachten, ist, dass wir auf einem 2D-Bildschirm visualisieren. Skalierung und Translation erfordern keine große Rechenleistung, und Projektion ist nicht übermäßig komplex. Rotation hingegen ist bei weitem die zeitaufwendigste Operation. Ich vernachlässige Linien- und Flächenzeichnungen, da die Amiga diese in Hardware implementiert hat. In diesem Abschnitt wird die Algorithmusoptimierung der Rotation von 1987 (Basisalgorithmus) bis 1994 (Diskrete Optimierung Typ III = DOT³) dargestellt.

Jedes Programm weist mehrere schwache Stellen auf, die sich auf Rechengeschwindigkeit konzentrieren – genau diese müssen optimiert werden. Optimierung sollte erfolgen, sobald eine gut formulierte Algorithmus vorliegt, der die geringste Komplexität unter allen Algorithmen aufweist, die dasselbe Problem lösen. Die Grenze zwischen Optimierung und Algorithmusentwicklung ist sehr verschwommen. Die Unterschiede zwischen DOT¹- und DOT³-Algorithmen könnten vielleicht als Algorithmusentwicklung und nicht als Optimierung bezeichnet werden. Diese Algorithmen sind prinzipiell sehr einfach (wenn man die Lösungen in geschriebener Form betrachtet) und sollten keine größeren Kopfschmerzen verursachen. Um die Algorithmen vollständig zu verstehen, setze ich voraus, dass der Leser Algebra sowie Motorola-Mnemonik beherrscht. Die Optimierung ist jedoch sehr schwierig, und Softwareentwickler legen oft keine Zeit oder Geld dafür auf. Wer nicht an Optimierung und der Primärsprache des Computers interessiert ist, kann diesen Abschnitt überspringen; ich betrachte diese Seiten jedoch als nützliche Lektüre, da diese Algorithmen und ihre Vor- und Nachteile von großer Bedeutung sind, sie zu verstehen. Ich habe den DOT³-Algorithmus in Gleitkommadarstellung implementiert, um eine größere wissenschaftliche Konsistenz in der Anwendung zu erreichen. Obwohl Gleitkommaberechnungen viel langsamer sind als herkömmliche diskrete Arithmetik, ist die Leistungsfähigkeit des DOT³-Algorithmus so groß, dass der Flaschenhals in der Grafikprozessor-Einheit liegt. Achtung! Bei herkömmlichen ECS-Agnes gilt dies, jedoch nicht bei AGA-Agnes (zwei verschiedene Generationen von Grafikprozessoren für Amiga-Computer). Dies führt dazu, dass die Nutzbarkeit auf einem A-500 (MC68030-Hauptprozessor mit 50 MHz und MC68882-Mathematikprozessor mit 60 MHz – diese ICs stammen von Motorola) ebenso gut ist wie auf einem A-1200 (MC68020-Hauptprozessor mit 28 MHz, jedoch ohne Mathematikprocessor!). Weitere Erläuterung: Der MC68020 verfügt nicht über einen Daten-Cache und hat nicht so großen Instruktionscache wie der MC68030. Bei weiteren Implementierungen mit AAA-Agnes (nicht veröffentlichter Grafikprozessor) dürfte die diskrete Implementierung des DOT³-Algorithmus erforderlich sein, um den Computer vollständig auszuschöpfen.

Basalalgorithmus

Die Einheiten, die geeignet sind, die Umwelt zu beschreiben, sind Breite (X-Richtung), Höhe (Y-Richtung) und Tiefe (Z-Richtung), die ich als Hauptachsen bezeichne. Beachten Sie, dass diese orthogonal (rechtwinklig) zueinander stehen. Mit diesem Weltverständnis können wir verschiedene Operationen durchführen. Die grundlegenden Operationen, die ausgeführt werden müssen, sind Drehungen des Modells um die Hauptachsen. Für Drehungen um eine Hauptachse können wir 2D-Drehungen verwenden, da sich die Position der Punkte entlang der Drehachse nicht ändert.

Drehung eines Blocks um die Z-Achse mit 270° zeigt die Invarianz in Z-Richtung.

Wenn wir um die Z-Achse drehen, werden alle Punkte (x,y,z)(x, y, z) wie folgt in (x,y,z)(x', y', z') umgewandelt:

Formel 1: Turnz(x,y,z,az)Turn_z(x,y,z,a_z)

x=xcos(az)ysin(az)(1.x)y=xsin(az)+ycos(az)(1.y)z=z(1.z)\begin{array}{l|l} \hline x'=x \cdot \cos(a_z)-y \cdot \sin(a_z) & (1.x) \\ y'=x \cdot \sin(a_z)+y \cdot \cos(a_z) & (1.y) \\ z'=z & (1.z) \\ \hline \end{array}

Wenn wir um die X-Achse drehen, werden alle Punkte (x,y,z)(x, y, z) wie folgt in (x,y,z)(x', y', z') umgewandelt:

Formel 2: Turnx(x,y,z,ax)Turn_x(x,y,z,a_x)

x=x(2.x)y=ycos(ax)zsin(ax)(2.y)z=ysin(ax)+zcos(az)(2.z)\begin{array}{l|l} \hline x'=x & (2.x) \\ y'=y \cdot \cos(a_x)-z \cdot \sin(a_x) & (2.y) \\ z'=y \cdot \sin(a_x)+z \cdot \cos(a_z) & (2.z) \\ \hline \end{array}

Wenn wir um die Y-Achse drehen, werden alle Punkte (x,y,z)(x, y, z) wie folgt in (x,y,z)(x', y', z') umgewandelt:

Formel 3: Turny(x,y,z,ay)Turn_y(x,y,z,a_y)

x=zsin(ay)+xcos(ay)(3.x)y=y(3.y)z=zcos(ay)xsin(ay)(3.z)\begin{array}{l|l} \hline x'=z \cdot \sin(a_y)+x \cdot \cos(a_y) & (3.x) \\ y'=y & (3.y) \\ z'=z \cdot \cos(a_y)-x \cdot \sin(a_y) & (3.z) \\ \hline \end{array}

Nach verschiedenen Vereinfachungen und Umstellungen können wir die obigen drei Formeln in eine allgemeine Formel mit 12 Multiplikationen und 6 Additionen zusammenfassen:

Formel 4: Turnzyx(x,y,z,az,ay,ax)Turn_{zyx}(x,y,z,a_z,a_y,a_x)

y1=ycos(ax)zsin(ax)(4.y1)z1=ysin(ax)+zcos(ax)(4.z1)x1=xcos(ay)z1sin(ay)(4.x1)z=xsin(ay)+z1cos(ay)(4.z2)x=x1cos(az)y1sin(az)(4.x2)y=x1sin(az)+y1cos(az)(4.y2)\begin{array}{l|l} \hline y_1=y \cdot \cos(a_x)-z \cdot \sin(a_x) & (4.y_1) \\ z_1=y \cdot \sin(a_x)+z \cdot \cos(a_x) & (4.z_1) \\ x_1=x \cdot \cos(a_y)-z_1 \cdot \sin(a_y) & (4.x_1) \\ z'=x \cdot \sin(a_y)+z_1 \cdot \cos(a_y) & (4.z_2) \\ x'=x_1 \cdot \cos(a_z)-y_1 \cdot \sin(a_z) & (4.x_2) \\ y'=x_1 \cdot \sin(a_z)+y_1 \cdot \cos(a_z) & (4.y_2) \\ \hline \end{array}

Jetzt erkennen wir das Problem mit Rotationen, da wir schnelle trigonometrische Funktionsberechnungen benötigen. Am einfachsten lösen wir dies, indem wir die trigonometrischen Faktoren in pseudokonstante Werte einbetten (siehe Programmiermethodik für Begriffserklärung), die während der Initialisierungsfunktion berechnet werden. Dadurch wird die mathematische Verarbeitungseinheit nicht überlastet, und aus Geschwindigkeitsgründen ist diese Vorgehensweise klar vorteilhaft. Hier folgt eine mögliche Implementierung des Basisalgorithmus; der Leser wird darauf hingewiesen, dass keine Matriximplementierung in der Datenstruktur vorhanden ist. Der Grund dafür ist, dass wir alle Rechenleistung für den Algorithmus und nicht für die Aufrechterhaltung der Datenstruktur benötigen.

    /******************************************************************
* Denis Tumpic 1987 *
* Dimenzione 3. *
* Extract from Slave Function: Turn_Coordinates *
******************************************************************/
.
.
.
/**************************************************************
* Initiatus : Precalculation of turn angles which are placed *
* in pseudoconstants *
**************************************************************/
sax=Sin(ax): cax=Cos(ax)
say=Sin(ay): cay=Cos(ay)
saz=Sin(az): caz=Cos(az)

/**************************************************************
* Itera Computa : Operate turnmatrix over all coordinates *
**************************************************************/
Iterate next chunk thru i from 0 to Number_Of_Coordinates with
positiv discrete monotonic:
tempY=sourceY[i];
tempX=sourceX[i];
tempZ=sourceZ[i];
Y1=tempY*cax-tempZ*sax;
Z1=tempY*sax+tempZ*cax;
X1=tempX*cay-Z1*say;
destinationZ[i]=tempX*say+Z1*cay;
destinationX[i]=X1*caz-Y1*saz;
destinationY[i]=X1*saz+Y1*caz;
Diskrete Optimierung Typ I

Das Erste, was uns am Aussehen des Basisalgorithmus auffällt, ist seine Abhängigkeit von trigonometrischen Berechnungen. Kleine Computer verfügen selten über zusätzliche mathematische Prozessoren, und es ist vollkommen unmöglich, den Basisalgorithmus in Gleitkommadarstellung auf diesen Geräten zu implementieren, wenn Echtzeit-Feedback erforderlich ist. Wir können dieses Problem lösen, indem wir die Genauigkeitsanforderungen aufgeben. Die Bildschirmauflösung ist niedrig (1280x570), und daher sind Gleitkommaberechnungen eigentlich nicht erforderlich. Um diese zu vermeiden, müssen wir die richtigen Approximationen vornehmen, da eine zu geringe Auflösung (rechnerisch) eine reine wissenschaftliche Absurdität darstellt. Zunächst teilen wir den Kreis aus Gründen der Einfachheit und Effizienz in 256 Abschnitte. Anschließend können wir eine Sinus- und Kosinustabelle (verschachtelt) mit einer Größe von 640 Byte generieren, aus der die Basiskomponente vorausberechnete Werte abrufen kann. Jeder Funktionswert hat 16 Bit; die Multiplikation mit 32768 ist somit möglich, was mindestens zwei Dezimalstellen gewährleistet. Es mag sinnlos erscheinen, diese Diskretisierung durchzuführen. Ein wenig Nachdenken verdeutlicht uns jedoch, dass wir hauptsächlich Objekte rotieren werden. Dies liegt daran, dass wir Objekte innerhalb anderer Objekte drehen und alle Objekte in jeder Instanz der Modellierung durch die Umgebung fliegen. Zur Verdeutlichung verweise ich auf die präzise Definition von VR-Umgebungen im vorherigen Kapitel.

Die Geschwindigkeitsänderung ist so groß, dass wir ein fraktales Landschaftsmodell mit 100 Punkten und 300 Linien einfach erstellen können, das wir in Echtzeit (25 Mal pro Sekunde) auf einer gewöhnlichen A-1000 (MC68000 mit 7,14 MHz) drehen können. Die folgende Programmliste ist eine frühe Assembler-Implementierung für IGG (Inter Gigantica Galactica – die vollständige VR-Umgebung):

    /******************************************************************
* Denis Tumpic *
* Pre Inter Gigantica Galactica *
* 1987-1988 *
* Slave Function: Turn_Coordinates *
* a0 : Pointer to Source_Coordinates *
* a1 : Pointer to Destination_Coordinates *
* a6 : Number_Of_Coordinates *
* ax, ay, ax : Turn angle around x-axis, y-axis, z-axis *
*cc instruction remark *
******************************************************************/
TurnCoords ;Initiatus
28 lea SinTable,a2 ; ->SinTable data fetch start address
28 lea CosTable,a3 ; ->CosTable data fetch start address
16 move.b ax,d0 ;Get angle AX
12 and.w #$FF,d0 ;Clear highbyte
10 asl.w #1,d0 ; *2 givs relative table pointer
14 move.w 0(a3,d0.w),d1 ;d1=Cos(ax)
14 move.w 0(a2,d0.w),d2 ;d2=Sin(ax)
16 move.b ay,d0 ;Get Angle AY
12 and.w #$FF,d0 ;Clear highbyte
10 asl.w #1,d0 ; *2 givs relative table pointer
14 move.w 0(a3,d0.w),d3 ;d3=Cos(ay)
14 move.w 0(a2,d0.w),d4 ;d4=Sin(ay)
16 move.b az,d0 ;Get angle AZ
12 and.w #$FF,d0 ;Clear highbyte
10 asl.w #1,d0 ; *2 givs relative table pointer
14 move.w 0(a3,d0.w),d5 ;d5=Cos(az)
14 move.w 0(a2,d0.w),d6 ;d6=Sin(az)

TurnLoop ;Itera Computa
12 move.w 2(a0),d0 ;d0 = y
70 muls d1,d0 ;d0 = y*Cos(ax)
12 move.w 4(a0),d7 ;d7 = z
70 muls d2,d7 ;d7 = z*Sin(ax)
12 sub.l d7,d0 ;d0 = y*Cos(ax)-z*Sin(ax)
10 asl.l #1,d0 ;d0 = d0*2
4 swap d0 ;d0 = d0/65536 -> Normalized Y1
4 move.w d0,a3 ;Y1 = a3 = d0
12 move.w 2(a0),d0 ;d0 = y
70 muls d2,d0 ;d0 = y*Sin(ax)
12 move.w 4(a0),d7 ;d7 = z
70 muls d1,d7 ;d7 = z*Cos(ax)
12 add.l d7,d0 ;d0 = y*Sin(ax)+z*Cos(ax)
10 asl.l #1,d0 ;d0 = d0*2
4 swap d0 ;d0 = d0/65536 -> Normalized Z1
4 move.w d0,a4 ;Z1 = a4 = d0
8 move.w (a0),d0 ;d0 = x
70 muls d3,d0 ;d0 = x*Cos(ay)
4 move.w a4,d7 ;d7 = Z1
70 muls d4,d7 ;d7 = Z1*Sin(ay)
12 sub.l d7,d0 ;d0 = x*Cos(ay)-Z1*Sin(ay)
10 asl.l #1,d0 ;d0 = d0*2
4 swap d0 ;d0 = d0/65536 -> Normalized X1
4 move.w d0,a5 ;X1 = a5 = d0
8 move.w (a0),d0 ;d0 = x
70 muls d4,d0 ;d0 = x*Sin(ay)
4 move.w a4,d7 ;d7 = Z1
70 muls d3,d7 ;d7 = Z1*Cos(ay)
12 add.l d7,d0 ;d0 = x*Sin(ay)+Z1*Cos(ay)
10 asl.l #1,d0 ;d0 = d0*2
4 swap d0 ;d0 = d0/65536 -> Normalized Z'
12 move.w d0,4(a1) ;Z' = d0
4 move.w a5,d0 ;d0 = X1
70 muls d5,d0 ;d0 = X1*Cos(az)
4 move.w a3,d7 ;d7 = Y1
70 muls d6,d7 ;d7 = Y1*Sin(az)
12 sub.l d7,d0 ;d0 = X1*Cos(az)-Y1*Sin(az)
10 asl.l #1,d0 ;d0 = d0*2
4 swap d0 ;d0 = d0/65536 -> Normalized X'
8 move.w d0,0(a1) ;X' = d0
4 move.w a5,d0 ;d0 = X1
8 muls d6,d0 ;d0 = X1*Sin(az)
4 move.w a3,d7 ;d7 = Y1
70 muls d5,d7 ;d7 = Y1*Cos(az)
12 add.l d7,d0 ;d0 = X1*Sin(az)+Y1*Cos(az)
10 asl.l #1,d0 ;d0 = d0*2
4 swap d0 ;d0 = d0/65536 -> Normalized Y'
12 move.w d0,2(a1) ;Y' = d0
8 addq #6,a0 ;Increase source pointer
8 addq #6,a1 ;Increase destination pointer
8 subq #1,a6 ;Decrease coordinate counter
10 bne TurnLoop ;Transform until no more coordinates
rts

Die Zahlen am Anfang der Zeilen sind nicht Zeilennummern, sondern die Anzahl der Taktzyklen (cc), die zur Vollendung der Operation erforderlich sind. Die Summe dieser Werte ergibt, dass Initiatus 254 cc und Itera Computa 1162 cc pro Koordinate benötigt. Beachten Sie, dass sowohl Daten- als auch Adressregister als Zwischenspeicher verwendet wurden, um die Geschwindigkeit zu erhöhen. Die Datenregister d1 bis d6 sind pseudokonstant und dürfen in Itera Computa nicht zerstört werden. Daher müssen wir Adressregister für die Zwischenspeicherung verwenden. Externer Speicherzugriff verursacht nämlich mindestens 4 cc pro Zugriff zusätzliche Zeit. Obwohl Wait-States auf der Amiga nicht existieren, sollten wir immer den externen Zugriff minimieren. Dies gilt besonders, wenn wir eine Wait-State-Architektur mit mehreren Prozessoren haben, die die Busse asynchron teilen.

Diskrete Optimierung Typ II

Von der rechenintensiven Basalgorithmen (über 100.000 cck pro Koordinate (cck)) zur rechenleichten DOT¹-Algorithmen (1162 cck) finden die meisten, dass weitere Optimierungen nicht nötig sind. Allerdings ist es ein verlockendes Ziel, den Algorithmus unter 1000 cck zu implementieren. Die Rechenleistung liegt in den Multiplikationen (max. 70 cck/Mult) und umfasst 840 cck der gesamten Berechnung. Wenn wir die zwölf Multiplikationen eliminieren könnten, würden wir die Geschwindigkeit weiter erhöhen. Die Lösung, wie wir bereits erkannt haben, besteht darin, eine vorausberechnete Tabelle mit allen möglichen Multiplikationen zu generieren. Das Problem bei dieser Implementierung ist, dass die Tabelle viel Speicher benötigt. Wenn wir nicht stark eingreifen und 8-Bit-Arithmetik (256 Werte) verwenden, können wir eine Tabelle von 160 kB generieren (640 * 256 Byte). Das größte Problem mit diesem Algorithmus ist, dass wir kein hochauflösendes Modell haben können; die Erhöhung der Arithmetik auf 16 Bit erfordert 40 MB Speicher. Außerdem ist die Genauigkeit an den Kanten in dieser Implementierung noch schlechter als bei DOT¹. Um das Auflösungsproblem zu lösen, können wir in kleinen „256-Welten“ modellieren, die auf geeignete Weise verkettet werden. Diese Lösung wird auch die Genauigkeit an den Kanten verbessern. Implementierungstechnisch dachte ich früh, diese Lösung zu verwenden, da ich damit leicht unter 1000 cck bleibe. Eigentlich würde sie auf 600 cck sinken, aber da etwas mehr Datenmanipulation erforderlich ist als zuvor, liegt sie bei etwa 900 cck. Die Verkettung ist jedoch nicht ganz trivial, und der nächste Algorithmus gab mir andere Ideen.

Das Prinzip, wie die kleinen 256x256x256-Einheiten mit Überlappung concateniert werden (Concatenationsraum). Dies bestimmt direkt, wie groß das größte Objekt (Teil eines Objekts bei vollständiger hierarchischer Struktur) im Modell sein kann. Berechnungen müssen nur auf den Einheiten durchgeführt werden, die wir momentan sehen, und der Algorithmus kann leicht auf mehrere Prozessoren aufgeteilt werden, wenn wir annehmen, dass die verschiedenen Objekte unabhängig sind.
Diskrete Optimierung Typ III

Die frühen Algorithmen wurden Ende der 80er Jahre entwickelt, und die meisten halten mittlerweile fest, dass nicht mehr viel zu tun bleibt. Allerdings ist es ein sehr verlockendes Ziel, unter 500 CCK zu kommen. Es müsste intelligente Wege geben, die Rotationsalgorithmen zu implementieren; und wenn wir etwas Algebra anwenden und wirklich verstehen, was Kommutativität bedeutet (vergleiche mit dem Drehen eines Buches zuerst um 45° um die x-Achse und dann um 45° um die y-Achse usw.), wird der Algorithmus sich zu folgender Freude weiterentwickeln:

    /************************************************
* Denis Tumpic *
* IGG30++ 1994 *
* Extract from Slave Function: Turn_Coordinates *
*************************************************
x'=x; y'=y; z'=z

if (daz)
x1=Cos[daz][x']-Sin[daz][y'];
y1=Sin[daz][x']+Cos[daz][y'];
x'=x1; y'=y1;
if (dax)
y1=Cos[dax][y']-Sin[dax][z'];
z1=Sin[dax][y']+Cos[dax][z'];
y'=y1; z'=z1;

if (day)
x1=Cos[day][x']-Sin[day][z'];
y1=-Sin[day][x']+Cos[day][z'];
x'=x1; y'=y1;

Beachten Sie, dass ich Winkelunterschiede anstelle von absoluten Winkeln verwende. Beachten Sie jedoch, dass diese Winkelunterschiede beliebig groß sein können (modulo 256). Beachten Sie auch die Umformung zu einem Algorithmus, der hinsichtlich der Komplexität seine Natur von einem immer gleichlang dauernden Algorithmus (isochroner Algorithmus) zu einem Drei-Fälle-Algorithmus (nicht-isochrone Algorithmus) verändert hat. Außerdem ist Initiatus in Itera Computa integriert. Diese Erkenntnis ermöglicht es uns, die mathematische Verarbeitungseinheit vollständig zu ignorieren, und der Einsatz der Tabelle in DOT² führt dazu, dass wir nun unter 500 CCK liegen. Im schlechtesten Fall (Worst Case) werden etwas weniger als 300 CCK benötigt, im besten Fall etwa 140 CCK. Ich wage nicht zu behaupten, dass diese Implementierung die untere Grenze für Rotationen darstellt, da ich bereits zweimal zuvor bei diesem Punkt falsch gelegen habe. Diese Algorithmusimplementierung ermöglicht jedoch, mehr als 20.000 Koordinaten pro Sekunde auf einem gewöhnlichen A-1000 mit einer Hauptprozessor MC68000 bei 7,14 MHz zu drehen (der Basiscalgorithmus schaffte etwa 70). Da ich den wissenschaftlichen Ton der Anwendung beibehalten möchte, habe ich dies vollständig in Gleitkommadarstellung implementiert (AOT³). Hinsichtlich der Geschwindigkeit ist AOT³ schneller als die Gleitkommavariante von DOT¹, was die Möglichkeit eröffnet, größere Objekte in der 3D-Modellierung mit weniger ruckartigen Bewegungen zu bewegen. Da die aktuellen großen Turbulenzen rund um Hauptprozessoren eine Phase der Unsicherheit verursachen, habe ich den Algorithmus nicht in Assembler programmiert. Die einfache Struktur des Algorithmus könnte darauf hindeuten, dass ein RISC-basierter Computer eine bessere Implementierung ermöglicht. Allerdings sind die vielen externen Zugriffe das große Problem. Diese Algorithmen erfordern einen schnellen Speicher ohne Wartezyklen.

Wenn wir eine Multiplikation schneller als einen Datentransfer realisieren können, fallen diese Algorithmen wie ein Kartenhaus zusammen. Außerdem sollten wir vielleichtdenken, dass eine Hardware-Implementierung des AOT³-Algorithmus Standard in einer VR-Maschine sein sollte. Wie Hewlett-Packard die Rotationsalgorithmen in ihren CAD-Programmen implementiert hat, die HCRX-Grafikkarten verwenden (diese können 2,3 Millionen 3D-Vektoren pro Sekunde zeichnen, wenn der Hauptprozessor mit 100 MHz läuft), weiß ich nicht. Es sollte jedoch nicht völlig anders sein als meine Lösung, wenn die Geschwindigkeit zum primären Ziel gemacht wird.

Schallausbreitungs-Algorithmen

Eine Hauptursache philosophischer Krankheiten - einseitige Diät: man nährt sein Denken mit nur einer Art von Beispielen.

Ludwig Wittgenstein

Dieser Abschnitt behandelt die Entwicklung der Schallausbreitungs-Algorithmus. Im Gegensatz zu 3D-Transformationsalgorithmen, die sehr gut formuliert sind, sind Schallausbreitungs-Algorithmen nicht ebenso vollständig ausgearbeitet und daher noch nicht in eine Optimierungsphase übergegangen. Die Algorithmusentwicklung beginnt immer damit, dass wir eine hypothetische Methode zur Lösung des Problems aufstellen. Sobald wir eine gut formulierte Hypothese haben, die bei möglicher Implementierung funktioniert, sollte diese Hypothese so verbessert werden, dass die Rechenkomplexität des Algorithmus verringert wird. Auf reinem Schwedisch bedeutet das, dass wir weniger Arbeit leisten müssen und dass beide Algorithmen in Bezug auf das Ergebnis identische Antworten liefern sollen. Wir haben zwei Welten, in die wir unsere Algorithmen überführen können. Die Wahl zwischen diesen beiden beeinflusst direkt die Berechnungszeiten. In der ersten und wissenschaftlichsteren Welt besitzen wir eine vollständig analytische Lösung für das Problem. In der zweiten zerlegen wir das Problem in diskrete Teile und lösen es mit reduzierten Anforderungen an die Genauigkeit, was zu deutlich kürzeren Ausführungszeiten führt. Außerdem müssen wir immer Algorithmen vermeiden, die eine exponentielle Zunahme des Speicherbedarfs oder der Ausführungszeit in Abhängigkeit von der Zunahme der Eingabemenge verursachen.

Zuerst beschreibe ich die vollständig analytische Problemlösung, bevor ich zur vollständig diskreten übergehe. Danach folgt die wohlbekannte Spiegelquelle-Methode, die beispielsweise bei der Berechnung von Wellenleitern (Telekommunikation) und weiterhin dem relativ neuen Strahlenverfolgungsansatz (Ray-Tracing) angewendet wird. Eine gut abgewogene Mischung aus Spiegelquelle-Methode und Ray-Tracing wird angesprochen, sowie eine kleine Abwandlung, die ich als Ellipsoidapproximation bezeichne. Die oben genannten Algorithmen führten schnell zu der Überlegung, die Schallausbreitungs-Algorithmus mit einer gut formulierten Heuristik zu implementieren, um Echtzeit-Feedback zu ermöglichen. Abschließend beschreibe ich die wenig wissenschaftliche Methode „Cut & Paste Ray-Tracing“ und ihre Schwächen.

Die Bücher, die mich in diesem Abschnitt beeinflusst haben, sind „Room Acoustics“ von Heinrich Kuttruff, „Audio Engineering Handbook“ zusammengestellt von K. Blair Benson, „An Introduction To Ray Tracing“ zusammengestellt von Andrew S. Glassner und „Advanced Animation and Rendering Techniques“ von Alan und Mark Watt.

Die analytische Lösung

Das Erste, was wir immer versuchen sollten, ist die vollständig analytische Lösung. Wenn es uns gelingt, eine vollständig analytische Lösung zu implementieren, werden wir keine Approximationsfehler haben. Beachten Sie, dass ich eine computeralgebraische Lösung des Problems meine. Obwohl algebraische Lösungen mathematisch präziser sind, sind sie sehr zeitaufwendig zu berechnen. In den wenigen einfachen Fällen, in denen eine algebraische Lösung möglich ist, sollten wir sie anwenden; im Allgemeinen sind die Probleme jedoch von wesentlich schwierigerer Natur.

Vollständig diskrete Lösung

Nach dem flachen Abbruch der vollanalytischen Lösung können wir einen vollständig diskreten Ansatz versuchen. Als Grundlage diene folgendes Beispiel: Unsere Welt enthält eine Wand und ein schallgenerierendes Objekt. In diesem Fall erhalten wir ein direktes und ein reflektiertes Schallsignal, wenn wir das Hörobjekt auf derselben Seite wie das schallgenerierende Objekt platzieren. Diesen einfachen Fall können wir mit einer Wellengleichung beschreiben und relativ schnell mit einer Finite-Elemente-Methode (FEM) oder Randelementmethode (BEM) lösen.

Wenn wir die starke VR-Definition betrachten, erkennen wir, dass unsere Modellwelt viele Objekte enthält, deren Oberflächen nicht linear sind. Unabhängig davon, ob sie Schall erzeugen oder nicht, führen diese zu nichtlinearen Wellengleichungen. Nun fragen wir uns, wie viele Wellengleichungen benötigt werden, um das Schallausbreitungsproblem vollständig diskret zu lösen. Da alle Objekte (n Stück) miteinander interagieren, sind mindestens n*(n-1)/2 nichtlineare Wellengleichungen erforderlich. Jedes Objekt kann eine Diskontinuität verursachen, falls es die Schallwellen nicht beugt, und diese ist zudem frequenzabhängig. Zudem müssen wir Luftmassen (verschiedene Refraktionseffekte), die Bewegungen der Objekte (Dopplereffekt) und Temperaturschwankungen berücksichtigen, was weitere Nichtlinearitäten in den Wellengleichungen hinzufügt.

Wenn wir uns auf eingeschlossene Räume beschränken und die Wellengleichungen in Frequenzbänder aufteilen, sind etwa 1,8*10⁹ Differentialgleichungen pro betrachteter Punkt im Raum erforderlich, wenn wir das Frequenzintervall von 0–10 kHz betrachten [29] (gelöst mit einer geeigneten FEM). Aus diesem gigantischen Gleichungssystem müssen wir das Impulsantwortverhalten der Modellwelt an den Punkten konstruieren, an denen wir Empfänger haben. Sobald wir diese aufgestellt haben, sollen sie mit einer Geschwindigkeit von fS Mal pro Sekunde in Echtzeit berechnet werden. Die Grundlage für diese hohe Rechengeschwindigkeit ist, dass beispielsweise der Dopplereffekt und die Dispersion vollständig realisiert werden. Nach diesem einfachen Matching müssen wir das Modell lediglich auralisieren, und die gesamte audiomediale VR-Umgebung ist realisiert.

Obwohl wir Zugang zu den schnellsten Computern des Universums haben, erscheint es furchtbar ineffizient, das Problem auf diese Weise zu lösen. Es ist nämlich schneller und zudem günstiger, mehrere physische Vollskalentriggers aufzubauen, obwohl wir wahrscheinlich eine große Anzahl dieser Triggers abreißen werden, bevor wir zufrieden sind.

In einer Variante der FEM teilen wir das Modell in kleine, disjunkte, aber räumlich benachbarte kubische Einheiten auf, die verschiedene Eigenschaften besitzen. Diese Eigenschaften können sich von der Art und Weise, wie sie miteinander interagieren, bis hin zur Bewegung im Raum erstrecken. Gemäß der starken VR-Definition müssen wir das Modell in die kleinsten unterscheidbaren Einheiten zerlegen. Dies bedeutet, dass wir audiomedial eine Auflösung von etwa 17 mm pro Einheit benötigen, um 20 kHz erfassen zu können. Das Problem mit dieser Lösung ist das enorme Speicherbedarf (typischerweise für einen gewöhnlichen Raum 8*10⁶ * Anzahl der Eigenschaften) und die Berechnungen, die ebenfalls furchtbar aufwendig werden. Es gibt Implementierungen [30] (nicht vollständige FEM), [31] (Spezialfall) dieser Lösungsform, aber auch hier sind wir gezwungen, das Konzept aufzugeben, da Echtzeit-Feedback kaum möglich ist. Möglicherweise wird die Methode realisierbar, wenn wir jedes Objekt als Knoten in einem vollständig verbundenen Graphen betrachten. In dieser Lösung beträgt die Dimension n*(n-1)/2 anstelle von drei, wodurch die Eigenschaften in gleichem Maße zunehmen. Jedes Objekt soll Aktualisierungen der Strahlflüsse in den Eigenschaften jedes anderen Objekts verursachen. Außerdem erfordert die Bewegungsschema-Anforderung, dass alle Eigenschaften in jeder Berechnungsinstanz variabel sind. Beachten Sie die Ähnlichkeiten mit neuronalen Netzen. Wenn wir betrachten, was Beugung bewirkt, sollte der Graph gelegentlich von der Vollverknüpfung abweichen, und dies soll automatisch geschehen. Das Problem dieser Methode ist, dass schnelle Vorgänge in der Zeitdomäne verlängert werden. Diese Verlängerung (Verschmierung, Dispersion) des Schalls führt dazu, dass Klarheit und Raumwahrnehmung verloren gehen. Die Lösung ist jedoch gut, wenn das Modell statisch ist.

Spiegelquelle-Methode

Nach zwei erfolglosen Ansätzen sind andere Herangehensweisen erforderlich. In der Spiegelquelle-Methode lassen wir Schallwellen wie Lichtwellen (gerade Linien) propagieren, was einen wesentlichen Unterschied zu den vorherigen Formen darstellt. Dies führt dazu, dass wir das Schallfeld als diffus betrachten. Grob ausgedrückt ist ein diffuses Schallfeld eine homogene Schalldruckverteilung ohne Phasenunterschiede. Weiterhin sind Beugung, Dispersion und alle anderen nichtlinearen Faktoren in dieser Lösungsform nicht berücksichtigt (können jedoch nachträglich hinzugefügt werden). Die Abbildung auf der nächsten Seite zeigt, wie die Methode im 2D-Fall funktioniert.

Vereinfachte Darstellung der Spiegelmethodik. Der schwarze Punkt ist der Sender und der weiße Punkt ist der Empfänger (oder umgekehrt). Die Berechnung der Strahlwege, die nur an den äußeren Wänden reflektiert werden, ist dargestellt. Die Reflexionen an den inneren Wänden werden ähnlich berechnet, jedoch nicht mit orthogonalen Blöcken in diesen Fällen. Beachten Sie die Falzung des 3*3-Blocks in der Antwort rechts!!!

Wie wir erkennen, ist diese Methode sehr speicherintensiv, da wir verlangen, dass das Modell im Speicher so oft kopiert wird, dass alle Reflexionen bis T60T_{60} (Nachhallzeit) berechnet werden können. Ein typisches Modell benötigt normalerweise etwa 100 kB Speicherplatz. Lassen wir T60T_{60} eine halbe Sekunde betragen, so müssen Strahlen mit einer maximalen Länge von 170 Metern berechnet werden. Der Raum, der etwa 5 × 2 × 4 Meter groß ist, müsste dann 34 × 85 × 43-mal kopiert werden, um alle Strahlen zu erfassen. Der Speicherbedarf beträgt somit ganze 11 GByte !!! Dies ist jedoch nicht das einzige Problem dieser Methode. Da wir bewegliche Objekte in der gesamten Modellwelt haben, müssen wir die Modellwelt bei jeder Veränderung aktualisieren (jede Kopie drehen und verschieben). Leider machen diese Faktoren Echtzeit-Feedback nahezu unmöglich, obwohl wir eine orthogonale DOT³-Algorithmenvariante verwenden können. Der Vorteil dieser Methode ist, dass wir eine hundertprozentige Trefferquote erreichen.

Definition Trefferquote: Die Trefferquote ist das Verhältnis zwischen der Anzahl der sicher erforderlichen Strahlentreffer und der möglichen Anzahl erforderlicher Strahlen.

Strahlverfolgungsmethode (Ray-tracing)

Wenn wir das Verlangen nach einer hundertprozentigen Trefferquote aufgeben, können wir Strahlen gleichmäßig in alle Richtungen von allen Schallquellen ausstrahlen. Diese Strahlen lassen wir dann an den Oberflächen der Objekte reflektieren. Wir lassen sie weiterhin an anderen Objekten reflektieren, bis die Schallenergie minimal wird oder ein Schallempfänger getroffen wurde. Die Schallenergie gilt als minimal (Hörschwelle des menschlichen Ohrs) bei T60T_{60}, und wir müssen den Strahl nicht weiter verfolgen, wodurch er verworfen wird. Wenn wir das Modell aus Sicht der Schallquellen betrachten, spricht man von Forward Ray-Tracing (bei Betrachtung aus Sicht des Schallempfängers von Backward Ray-Tracing). Das Ergebnis der Vorwärts- und Rückwärtsstrahlverfolgung ist nicht identisch, da die Strahlen unterschiedliche Ausgangspunkte haben (kleine Winkelabweichungen am Anfang führen zu großen Abweichungen gegen Ende). Auch Ray-Tracing erfordert ein diffuses Schallfeld, da die Strahlen – eigentlich kleine strahlende Kegel – sich zunehmend ausbreiten, je weiter sie sich ausbreiten. Unabhängig davon, welche Form des Ray-Tracings wir implementieren, speichern wir die Strahlengänge und deren Filterantwort. Die Filterantwort berechnen wir am einfachsten, indem wir die Absorptionskurven der Objekte multiplizieren, die sich auf dem Weg des Strahls befinden (siehe Anhang B für weitere Erläuterungen). Außerdem können wir die Einfallswinkel der Treffer am Empfänger speichern und damit die unnötigen Treffer, die nicht in der Richtwirkung enthalten sind, einfach herausfiltern.

Die Ray-Tracing-Methode ist nicht neu und bringt in ihrer ursprünglichen Form bestimmte Probleme mit sich. Das größte Problem ist die extrem niedrige Trefferquote (< 2 %). Dies bedeutet, dass 98 % der Berechnungen verschwendet werden (eine Berechnung von 10 Stunden hätte weniger als 12 Minuten gedauert!). Dies ist der Preis, den wir zahlen, wenn wir nicht so viel Speicher wie bei der Spiegelquelle-Methode verwenden möchten.

    Primal Ray-tracer Code:

Definition Max length:
Computed reverberation time with Sabins's formula
multiplied with the soundvelocity through air.

Definition Hit object:
An object that mostly reflects rather than diffracts
soundrays.

Definition Transceiver:
Objects that transmits (loudspeaker) or receives (ear)
sound.

Definition Hit point:
Ray impact area on hitobject.

Definition Omnidirectional:
Uniformly select angles from (0..2¶, 0..2¶, 0..2¶)

Definition Clean hit:
When the ray-tracing cone hits a specific hitobject or
transceiver.

Master (Depth First Algorithm) function Trace:
Iterate over omnidirectional tracing rays.
Ray-trace until:
Transceiver hit or if raylength exceeds Max length.
When detected a Clean hit memorize:
Raylength, absorptionresponse and impact angle.

Slave (Recursive or/and Iterative) function Ray_Trace:
Compute nearest possible Hit object and reflect ray specularly through the new Hit point.
Multiply this Hit object absorptionresponse with:
Previous absorptionresponse in this recursion.
Depending on depth and grade of diffusion:
Smash ray into several directions and recurse.

Die erste Implementierung dieses Algorithmus ergab mehrere wichtige Erkenntnisse: extrem lange Ausführungszeiten und sehr niedrige Trefferquoten. Nach diversen primären und sekundären Optimierungen konnte die Ausführungszeit jedoch mehr als halbiert werden (diverse Quadratwurzel-Entfernungen und vorausberechnete Normalen sowie Ausdehnungen der Objektoberflächen). Obwohl wir auf einem guten Weg sind, ist es dennoch weiterhin unmöglich, Echtzeit-Feedback zu erreichen.

Methode der Ellipsoidapproximation

Betrachten wir die Umwelt morphologisch, zeigt sie uns, dass alles mehr oder weniger eckig ist. Wenn wir die Eckenhaftigkeit der Objekte vernachlässigen, die insbesondere den Klang bei hohen Frequenzen beeinflusst, können wir alle Objekte als Superellipsoide betrachten. Ellipsoide höherer Ordnung ähneln mehr Quader als niedrigere Ellipsoide. Außerdem ist die Rechengeschwindigkeit umgekehrt proportional zur Ellipsoid-Ordnung (höhere Ordnung führt zu langsameren Berechnungen). Mit dieser Methode haben wir weniger vorbereitete Daten zu verarbeiten und sind damit speichereffizienter. Weitere Vorteile sind einfachere Ausdrücke für die Berechnung von Strahltreffern und Reflexionswinkeln (unabhängig von der Ordnung). Trotz dieser Möglichkeiten führt die geringe Trefferquote (bedauerliche < 0,1 %) dazu, dass diese Methode nicht implementiert werden sollte.

Hybrid-Methode

Ein kluger Ansatz könnte darin bestehen, die Spiegelquelle-Methode mit der Ray-Tracing-Methode zu kombinieren. Dabei lassen wir das Modell in einer geringeren Anzahl als zuvor kopieren (typischerweise 3×3×3 Modelle). Nachdem wir die „exakten“ Reflexionen im Spiegelblock berechnet haben, können wir mit Ray-Tracing in den jeweiligen Modellräumen fortsetzen, in denen sich die Strahlen befinden.

Beachten Sie die Bedeutung der Effizienz der Transformationsalgorithmen in dieser Lösungsmethode. Obwohl wir hauptsächlich mit orthogonalen Spiegelungen zu tun haben, leidet die Echtzeit-Feedback-Leistung. Die Trefferquote steigt jedoch auf deutlich bessere Werte, und abgesehen von strengen VR-Umgebungen ist diese Methode sehr nützlich.

Ein großer Vorteil dieser Methode ist, dass wir diese Lösungsform leicht in einer parallelen Ausführungsform implementieren können. Dies ist möglich, wenn wir Interferenz und Maskierung vernachlässigen (was wir tun können). Das Problem wird nun auf die Prozessorressourcen und den orthogonalen DOT³-Algorithmus verlagert. Hier beginnt eine gewisse Erleichterung sichtbar zu werden, da wir nun eine Möglichkeit sehen, das Problem zu lösen. Diese Lösung ist jedoch immer noch sehr kostspielig, und weiterer geistiger Aufwand schadet nicht.

Eine heuristische Methode

Die bisherigen Methoden haben uns bisher keine größeren „Wow“-Erlebnisse beschert, und nun präsentieren wir die erste Universallösung. Durch eine geeignete heuristische Funktion (mathematisch als Ziel-Funktionen bezeichnet) können wir die Trefferquote so stark erhöhen, dass Echtzeit-Feedback ermöglicht wird. Das Problem besteht darin, diese Funktion zu finden, und dies dürfte zusammen mit dem GUI-Design die längste Entwicklungszeit in Anspruch nehmen.

    Denis Tumpic's Heuristic Ray-tracer Code:

Definition Max length:
Computed reverberation time with Sabins's formula
multiplied with the soundvelocity through air.

Definition Hit object:
An object that mostly reflects rather than diffracts
soundrays.

Definition Transceiver:
Objects that transmits (loudspeaker) or receives (ear)
sound.

Definition Hit point:
Ray impact area on hitobject.

Definition Clean hit:
When the ray-tracing cone hits a specific hitobject or
transceiver.

Definition Looking range:
Circular cone that spreads(¶/2) from the hitpoint with
the direction of specular reflection.

Definition Diffuse hit:
When the path from ray-trace hitpoint to transceiver
surface is in the lookingrange and free from hitob
jects.

Master (Pseudoprobabilistic Heuristic) function Trace:
Iterate over ray directions that point onto objects.
Ray-trace until:
Transceiver hit or if raylength exceeds Max length.
When detected a Clen hit memorize:
Raylength, absorptionresponse and impact angle.

Slave (Recursive and Iterative Heuristic) function Ray_Trace:
Compute nearest possible Hit object and reflect ray specu
larly through the new Hit point.

Compute nearest possible Hit object.
Multiply this Hit object absorptionresponse with:
Previous absorptionresponse in this recursion.
When Diffuse hit detected:
Damp ray then memorize:
raylength, filterresponse and hit direction.
End recursion.
Depending on depth and grade of diffusion:
smash ray into several directions and recurse.

In diesem Modell betrachte ich alle Objekte als mögliche Empfänger von Direktschall. Abhängig davon, wie das Direktschallsignal des Senders auf das Beobachtungsobjekt trifft (d. h. Einfallswinkel), dämpfen wir das Signal in angemessenem Maße. Am einfachsten ist es, die Kosinus-Funktion für diesen Teil zu verwenden. Ein Einfallswinkel von 90° führt zu keiner Dämpfung, während parallele Schallwellen (sofern vorhanden) vollständig abgeschwächt werden. Diese Approximation mag anfangs sehr grob erscheinen. Ein Vergleich mit früheren Approximationen – diffusen Schallfeldern und unendlich großen, glatten Oberflächen, was Voraussetzung für Ray-Tracing ist – zeigt jedoch, dass sie von geringerer Bedeutung ist. Weitere Vorteile dieses Ansatzes sind, dass wir Beugung einfach als normalen Schritt in der Heuristik implementieren können. Dispersion, Brechung und Richtwirkung können bereits in einem frühen Stadium in die Heuristik integriert werden, was jedoch zu einer erheblichen Reduzierung der Ausführungsgeschwindigkeit führt.

Vergleiche

Nachfolgend finden Sie einige Vergleichsdaten zu den verschiedenen Algorithmen, die ich in meinem eigenen Wohnzimmer implementiert und getestet habe. Beachten Sie, dass dieses Volumen (47 m³) eigentlich zu klein ist, damit Sabines Formel wirklich gut funktioniert. Die Reflexionstiefe wurde auf fünfzig Reflexionen gesetzt (was im Ray-Tracing-Kontext sehr viel ist).

AlgoritmnamnmaxHitrate%ExekveringstidEllipsoidapproximering0.16hPrimalRaytracing2.88hNosqarerootsRaytracing2.87hPrecalc.NormalPlanes(PNP)Raytracing2.84hDiffusePNPRaytracing9.24hHeuristicDiffusePNPRaytracing54.512min!!!\begin{array}{l|c|c} \hline Algoritmnamn & max Hitrate \% & Exekveringstid \\ \hline Ellipsoidapproximering & 0.1 & 6 h \\ Primal Ray-tracing & 2.8 & 8 h \\ Nosqareroots Ray-tracing & 2.8 & 7 h \\ Precalc. Normal Planes (PNP) Ray-tracing & 2.8 & 4 h \\ Diffuse PNP Ray-tracing & 9.2 & 4 h \\ Heuristic Diffuse PNP Ray-tracing & 54.5 & 12 min !!! \\ \hline \end{array}

Alle diese Algorithmen haben ähnliche Ergebnisse erbracht. Außerdem hat eine Sampling-Messung meines Wohnzimmers mit einem einfachen Klatschen gezeigt, dass die berechneten Impulsantworten (zumindest anfangs) übereinstimmen. Angesichts der groben Approximationen, die wir zwingend vornehmen müssen, sind die Ergebnisse relativ akzeptabel.

Cut & Paste Ray-Tracing

Abschließend diese kühne, wissenschaftlich unerwünschte Methode (wenn wir sie rein mathematisch betrachten). Beachten Sie, dass wir nicht weiter als Tr (die Zeit des Eintritts der Nachhallzeit) berechnen müssen, da der Nachhall nicht als separate Schallquelle betrachtet wird. Was wir tun können, ist, die frühen Reflexionen entlang der Strahlverfolgung zu „schneiden“ (Cut) und anschließend mithilfe dieser die späten Reflexionen synthetisch zu erzeugen (Paste). Am einfachsten geschieht dies, indem wir die „Cut“-Reflexionen auf die Zeit nach der letzten berechneten Reflexion im „Cut“-Abschnitt verschieben. Den verschobenen Reflexionen folgt eine Zeitmodulation mit einer geeigneten Funktion, die das „Paste“-Beitrag darstellt. Die Zeitmodulation kann auch vorausberechnet basierend auf bestehenden Modellen oder wohlformulierten Wahrscheinlichkeitsmaßen erfolgen. Beachten Sie, dass der Nachhall in diesem Schritt nicht berechnet werden soll, da die Genauigkeit mit zunehmender Strahlverfolgungslänge abnimmt und unnötig viele Berechnungen durchgeführt würden. Der Nachhall benötigt keine hohe Genauigkeit, da er ununterscheidbar ist.

Da wir Echtzeit-Feedback in audiovisuellen VR-Umgebungen erreichen möchten, dürfte die Cut & Paste Ray-Tracing-Methode die einzige sein, die annähernd eine Möglichkeit bietet. Gemeinsam mit heuristischem Ray-Tracing können wir mit geringem Aufwand etwas erreichen, das einem ersten Schritt hin zur starken VR-Definition ähnelt. Dies ist möglich, wenn wir die Rechenleistungsanforderungen für Echtzeit von fS Mal/s auf fDIRAC Mal/s senken. Gemäß „Spaciousness“ muss fDIRAC etwa 8000 Hz betragen, um die Richtung des eintreffenden Schalls vollständig nachzuahmen.

Vorkommende Implementierungen

Die verschiedenen verbreiteten Implementierungen sind die Spiegelquelle-Methode [32, 33], Ray-Tracing [34], Hybridmethoden [35, 36], heuristische Methoden [37] (beachten Sie, dass diese nur eine Außenmodellierung ist) und die Finite-Elemente-Methode [31]. Diese sind mehr oder weniger fortgeschrittene Varianten der kurzen Einführungen, die ich zuvor beschrieben habe. Allerdings sind alle diese Methoden stark eingeschränkt und erfordern zusätzliche Hardware als Ausrüstung.

Nachhall-Approximation

This is not the end. It is not even the beginning of the end. But it is, perhaps, the end of the beginning.

Sir Winston Leonard Spencer Churchill

In diesem Abschnitt beschreibe ich verschiedene Methoden zur Schätzung und Berechnung des Nachhalls, ohne tiefgehende Strahlverfolgung mit schlechter Trefferrate als Ergebnis zu benötigen. Es gibt zwei Approximationsmethoden – die erste ist deterministisch, die zweite stochastisch (die Grenze zwischen diesen ist verschwommen). Diese habe ich nicht vollständig implementiert, da die Ideen zu zahlreich sind, obwohl sie relativ einfach sind.

Da ich die heuristische Ray-Tracing-Algorithmus als Grundlage festgelegt habe, werden wir das Impulsantwortverhalten ab der Zeit Tr bis zur Zeit T60T_{60} approximieren (dasselbe gilt für die Spiegelquelle-Methode). Die Grundlage hierfür ist, dass wir diffusere Schallfelder benötigen, je tiefer die Reflexionen sind, die wir betrachten. Das Problem besteht darin, Tr so festzulegen, dass alle Reflexionen vor Tr klar erkennbar sind und jene danach innerhalb bestimmter zeitlicher diskreter Bereiche überlagert werden. Wenn wir das Gesetz der ersten Wellenfront aufheben, sollten wir kein diffuses Schallfeld haben (im natürlichen Sinne existiert kein vollständig diffuses Schallfeld), was bedeutet, dass wir nicht tief in die Strahlverfolgung eintauchen sollten. Typischerweise werden dritte Ordnung Reflexionen verwendet, was eine qualitative Schätzung darstellt, die nicht bewiesen ist. Beachten Sie jedoch, dass die Zeit Tr stark modellabhängig ist und heuristisch betrachtet können wir die vorherige Schätzung nicht verallgemeinern.

Deterministische Methoden

Der Nachhall selbst ist eigentlich ein zeitabhängiges Filter, das das Signal auf eine bestimmte, charakteristische Weise färbt. Betrachtet man die bereits existierenden Hörhallen und vergleicht ihre Nachhall-Eigenschaften, zeigt sich, dass sie dieselbe Struktur aufweisen. Vereinigt man diese Tatsache mit der Eigenschaft, dass der Nachhall ununterscheidbar ist, können wir auf bereits abgetasteten Nachhall zurückgreifen. Diese Idee ist nur realisierbar, wenn wir wissen, dass das Modell eine Halle darstellt. Im reinen VR-Kontext bietet diese Methode große Generalisierungsmöglichkeiten, weshalb wir den Nachhall mit geeigneten Funktionen neu gestalten müssen. Diese geeigneten Funktionen können eine Zusammenführung mehrerer bekannter Nachhallmuster in mehr oder weniger linearer Form sein. Das Problem reduziert sich darauf, die Extrema innerhalb der Nachhallstrukturen sowie eine gut abgewogene Anzahl von Zwischenvarianten zu finden, die so gemischt werden können, dass das Modell in den richtigen Rahmen passt.

Stochastische Methoden

Eine Weiterentwicklung der vorhergehenden Methoden besteht darin, den Nachhall des Modells mithilfe der abgetasteten Nachhall-Daten und der berechneten frühen Reflexionen zu erzeugen. Diese Berechnung muss nur einmal durchgeführt werden, da der Nachhall weitgehend objektortunabhängig ist. Dies stellt jedoch eine Approximation dar, da die Eintrittszeit des Nachhalls (Tr) nicht objektortunabhängig ist.

Darüber hinaus können wir eine vollständig stochastische Variante anwenden, die die Nachhallfunktion mit folgenden Parametern erstellt: Die ersten Reflexionen, die Anzahl der Objekte im Modell, die Nachhallzeit T60T_{60} und die Intensität der Bewegungsaktivität. Die Zeit T60T_{60} bestimmt die Größe des Nachhalls. Die Anzahl der Objekte und die Intensität der Bewegungsaktivität bestimmen, wie ununterscheidbar der Nachhall wahrgenommen wird. Zudem kann die Intensität der Bewegungsaktivität entweder durch eine stochastische Funktion (effizienter und einfacher, basierend auf einer geeigneten stochastischen Prozess) oder eine deterministische Funktion (langsamer und komplexer, basierend auf den Bewegungsmustern der Objekte) ergänzt werden, um die mögliche Abhängigkeit des Nachhalls von der Objektposition zu modellieren.

Zwei schematische Darstellungen der Nachhallapproximation, wobei D die deterministische Variante und S die stochastische Variante zeigt. Das Kreuz bedeutet, dass die beiden Funktionen (möglicherweise mehrere) skalar miteinander interagieren, um den Impulsantwort zu berechnen. Das Doppelkreuz bedeutet, dass die beiden Funktionen (möglicherweise mehrere) stochastisch miteinander interagieren, um den Nachhall zu synthetisieren.

Auralisierung

So gelangt man beim Philosophieren am Ende dahin, wo man nur noch einen unartikulierten Laut ausstossen möchte.

Ludwig Wittgenstein

Beim grafischen Ray-Tracing ist es sehr einfach, einzelne Bilder zu visualisieren, die zeigen, wie das Modell aussieht. Bei akustischem Ray-Tracing ist die grafische Visualisierung jedoch nicht so aussagekräftig. Es mag angenehm sein, das Impulsantwortverhalten des Raumes oder einzelne Energiepulse zu sehen, die sich im Raum ausbreiten. Doch die Darstellung der Schallausbreitung mittels Grafik ist etwa so, als würde man einem Menschen mit angeborener schwerer Hörschädigung einen Klang beschreiben (sehr schwierig). Eigentlich handelt es sich dabei um eine schlechte Abbildung, da wir das sehen, was wir hören möchten. Gemäß der strengen VR-Definition und den harten Anforderungen an die Mensch-Maschine-Interaktion bezüglich guter Abbildung, folgt daraus, dass wir auralisieren (engl. Auralization) müssen. Um sprachliche Konsistenz zu wahren, sollte „Auralisierung“ als „Audialisierung“ bezeichnet werden; doch diejenigen, die diesen Weg bereits beschritten haben, haben sich an den Begriff „Auralisierung“ gewöhnt.

Für die weitere Lektüre setze ich voraus, dass der Leser „Berechnungsaspekte digitaler Audioverarbeitung“ aus „Audiobehandlung“ gelesen hat, und werde auf diesen Abschnitt mit [BDA] verweisen.

Das große Rechenproblem, das in [BDA] nachgewiesen wurde (trotz unvollständiger Algorithmen), bedeutet, dass wir ohne gewisse Geschicklichkeit keine Auralisierung auf einem herkömmlichen µ-Rechner durchführen können. Das Problem liegt bereits in der Ray-Trace-Algorithmen. Wir können diese jedoch mit einer schnellen Heuristik implementieren, die die Richtwirkung des Ohrs, Maskierung und Nichtlinearität (Phon-Kurven) berücksichtigt. In Verbindung damit, dass wir nur bis zu Reflexionen dritter Ordnung verfolgen, ermöglicht dies uns, den ersten Teil des Impulsantwortmodells in Echtzeit (25-mal pro Sekunde) zu erzeugen.

Und jetzt? Wie sieht es mit der Auralisierung aus? Da wir mit einem Computer mit äußerst begrenzter Rechenleistung arbeiten, kommen wir bei der Auralisierung nicht weit. Amiga verfügt über 8-Bit-Audio mit vier Kanälen in Stereo (zwei für jedes Ohr), und die Lautstärke jedes Kanals (Stimme) kann mit 64 verschiedenen Stufen (logarithmisch verteilt) eingestellt werden. Die niedrigste Stufe entspricht einer Dämpfung des Signals um 36 dB, was bedeutet, dass wir ein Teilantwort-Modell des Impulsantwortverlaufs in einem gegebenen Zeitintervall mit 64 Schallreflexionen erstellen können. Dies ist gemäß Formel 1 in [BDA] berechnet. Das bedeutet, dass wir für jedes Ohr nicht mehr als 64 Reflexionen berechnen müssen. Die heuristische Strahlenverfolgungsalgorithmus wird durch diese Grenze kaum langsamer werden.

Ich verliere die Geduld! Wie steht es mit der Auralisierung?

Gemäß den Ausführungen in „Nachhall-Approximation“ und den ersten beiden Kapiteln bedeutet dies, dass wir nicht die hohe Qualität benötigen, die Dirac-Sampling-Faltungen bieten. Daher können wir den Nachhall durch einen geeigneten Reverb approximieren, der in vielfältigen Varianten in musikalischen Kontexten verfügbar ist. Die einzige Anforderung ist, dass er MIDI (Musical Instrument Digital Interface) unterstützt, damit wir die wichtigsten Parameter, T60T_{60} und Nachhall-Diffusität, extern anpassen können. Diese Lösung ermöglicht es dem Benutzer, die Qualität der Nachhall-Approximation selbst zu bestimmen. Diese Lösung ist zudem eine natürliche Fortsetzung des Amiga-Konzepts (lassen Sie Spezialprozessoren die groben Arbeiten erledigen). Unten wird der Algorithmus und ein Hardware-Flussplan dargestellt.

    Denis Tumpic's Heuristic Auralizer-Ray-tracer Code:

Definition Max length:
Computed reverberation time with Sabine's formula
multiplied with the soundvelocity through air.

Definition Max rays:
Total number of additions without cancellations.

Definition Hit object:
An object that mostly reflects rather than diffracts
soundrays.

Definition Transceiver:
Objects that transmits (loudspeaker) or receives (ear)
sound.

Definition Hit point:
Ray impact area on hit object.

Definition Clean hit:
When the ray-tracing cone hits a specific hit object or
transceiver.

Definition Looking range:
Circular cone that spreads(¶/2) from the hit point with
the direction of specular reflection.

Definition Diffuse hit:
When the path from ray-trace hitpoint to transceiver
surface is in the lookin grange and free from hit ob
jects.

Definition Trace hits:
The calculated impuls response from the Ray Trace algo
rithm.

Master (Realtime V:input sampligfrequency) function Auralizer:
First time:
Compute reverberation time with Sabins's formula.
Initialize extern reverb through MIDI system messages.
Allways (Isochrone \& Parallel):
Convolv incomming data with Trace hits.
Output convolution to audiochannels.

Master (Parallel Pseudoprobabilistic Heuristic) function Trace:
Iterate over ray directions that point onto objects.
Ray-trace until:
Transceiver hit or
Raylength exceeds Max length or
Total Rays exceeds Max rays.
When detected a clen hit memorize:
Decay time and attenuation.

Slave (Recursive and Iterative Heuristic) function Ray_Trace:
Compute nearest possible Hit object and reflect ray specu
larly through the new Hit point.
Compute nearest possible Hit object.
Multiply this Hit objects absorptionresponse with:
Previous absorptionresponse in this recursion.
When Diffuse hit detected:
Damp ray then memorize:
Decay Time and attenuation.
Increase Total Rays.
End recursion.
Depending on depth and grade of diffusion:
smash ray into several directions and recurse.

Dieses Bild zeigt das Hardware-Schema der Auralisierungsalgorithmen. Das Mikrofon kann durch eine DAT (Digital Audio Tape) ersetzt werden, mit der wir eine zuvor in einem reflexionsfreien Raum aufgezeichnete Aufnahme wiedergeben.

Datenstruktur

Vollständig dynamische Mengen sind der Schlüssel zu allem.

In diesem Abschnitt beschreibe und kommentiere ich ausgewählte Teile der offenen Datenstrukturen des Programms. Zunächst beginnen wir mit einigen Aufzählungstypen.

Die folgende Typdefinition verwende ich zur Identifizierung von Objekten bei verschiedenen Berechnungen:

    /*****************************
* What type of object is it? *
*****************************/
enum ObjectType {Furniture,Sender,Receiver};

Die primitiven Modellobjekte sind in folgende Einheiten unterteilt:

    /**************************************
* What type of primitiv object is it? *
**************************************/
enum PrimitivObject (Tetraeder, Cube, Octaeder, Prism, Room, Pyramid, Plate};

Die Direktivität hat diesen Aufzählungstyp:

    /**************************************************
* Propagation Directivity for objects in general. *
**************************************************/
enum DirectionType {Omni,Bi,Cardioid};

Da wir es mit Pfützen zu tun haben, verwende ich doppelt verkettete Listen (eigentlich überflüssig bei erster Betrachtung, obwohl die Suchzeiten einfach halbiert werden könnten). Die folgende Struktur berücksichtigt die spezifischen Eigenschaften der Materialien. Bei einer weiteren Entwicklung des Programms mit vollständiger hierarchischer Struktur sollen alle Elemente unter den Zeigern (*prev und *next) zu einer einzigen Struktur zusammengefasst werden (gilt für den Großteil dieser Strukturen). Dies ist die Grundlage der doppelten Verkettung in dieser Struktur. Zudem können wir eine Sortierfunktion in den Koordinatenfenstern implementieren und diese als Ebenen (Eng. Stock) umbenennen. Wenn wir vernünftig vorgehen, sollte die Struktur in ein geeignetes Baummodell umgewandelt werden (der Strukturname ändert sich in diesem Fall zu Material<typ>Tree).

    /******************************************************
* Master struct for Material Characteristics *
* Materiallist holding all loaded \& created materials *
******************************************************/
struct MaterialList
{
struct MaterialList *prev; /*Pointer to previous in list */
struct MaterialList *next; /*Pointer to next in list */
char Name[80]; /*Material name */
int usage; /*How many objects uses this MTR */
enum GraphType GraphMode; /* Spline or linear */
enum ObjectType OType; /*Furniture, sender or receiver */
int Color; /* Draw Color (furnitures only) */
int Volume; /* Sound Volume (senders only) */
double meanabsorption; /*Material mean absorption coeff */

/*********************************************************
* Softtypeequalizer with normal equalizing frequencies *
* and extra directioncharacteristics for each frequency. *
* Frequency Absorption/Response variables *
* 32,63,125,250,500,1k,2k,4k,8k,16k,32k Hz *
*********************************************************/
int EHZ[11];

/*****************************************************
* Frequency Direction variables Omni, Bi or Cardioid *
* 32,63,125,250,500,1k,2k,4k,8k,16k,32k Hz *
*****************************************************/
enum DirectionType DHZ[11];
};

Jedes Objekt besteht aus einer Anzahl kubischer Teilobjekte, die vom Typ Primitivobjekt sind. Diese werden in einer doppelt verketteten Liste gespeichert (nur zur Konsistenz). Da die vollständige Hierarchie noch nicht implementiert ist, habe ich das Material des Objekts stattdessen in der Modellierungsstruktur abgelegt. Dies wird jedoch in einer späteren Version in diese Struktur verlagert. Die Ebenengleichungswerte (Berechnung der Spiegelreflexion mittels Normalen) und die Flächenausdehnung (Prüfung, ob der Strahl trifft) befinden sich hier, da sie die Strahlenverfolgungsalgorithmen erheblich beschleunigt haben. Ich halte diese Beschleunigung für wichtiger als die zusätzlichen 480 Bytes, die erforderlich sind. Außerdem ist die Flächenberechnung im Einfüge-Status (siehe Berechnungsamortisierung während der Modellierung) verankert, wodurch die Berechnungen mit Sabines Formel auf akzeptable Niveaus gesenkt werden. Die zahlreichen Speicherbereiche für Vektoren beruhen auf der Effizienz des AOT³-Algorithmus und werden hier nicht weiter erläutert (siehe 3D-Transformations-Algorithmen).

    /*******************************************
* Struct holding all surfaces of an Object *
*******************************************/
struct SurfaceList
{
struct SurfaceList *prev; /* Pointer to previous in list */
struct SurfaceList *next; /* Pointer to next in list */
enum PrimitivObject PO; /* What type of prim object is it*/
double x[8],y[8],z[8]; /* x,y,z Rigid Coords */
double mx[8],my[8],mz[8]; /* x,y,z 1 transformed Coords */
double tx[8],ty[8],tz[8]; /* x,y,z 2 transformed Coords */
double AV[6],BV[6],CV[6],DV[6];/* Plane equation */
double maxx[6],maxy[6],maxz[6];/* Plane boundaries */
double minx[6],miny[6],minz[6];/* Plane boundaries */
double Area[6]; /* Area of the plane */
};

Die folgende Struktur stellt die Knoten in den Objektlisten dar (auch diese sind zur Konsistenz doppelt verkettet):

    /**************************************************
* Masterstruct for a specific Object *
* ObjectList holding all loaded \& created objects*
**************************************************/
struct ObjectList
{
struct ObjectList *prev; /* pointer to prev in list */
struct ObjectList *next; /* pointer to next in list */
char Name[80]; /* Root name of an Object */
int cubes; /* Number of sub cubes */
struct SurfaceList *surfaces; /* Pointer to a surfacelist */
};

Die eigene Modellierungsstruktur ist ebenfalls eine doppelt verkettete Liste. Beachten Sie, dass wir für diese keine vollständige Implementierung eines Suchbaums erstellen müssen, da Drehungen dazu führen, dass die Nadeln ihre Position ändern und eine neue Sortierung erforderlich ist (siehe „Ajöss“ mit Echtzeit-Feedback). Die Baumstruktur ist jedoch für die hierarchische Speicherung erforderlich. Außerdem enthält sie die Position des Objekts in der Welt und dessen Richtung (drei orthogonale Einheitsvektoren), beispielsweise für Größenänderungen. Die Einheitsvektoren basieren auf der Anforderung des Berechnungsverfahrens der AOT³-Algorithmen (z. B. invertierte Rotation bei Größenänderung). Die Strahlverfolgungs-Algorithmus speichert die Normale der getroffenen Oberfläche in diesem Knoten, falls der Strahl auf eine Fläche in seiner Objektliste trifft. Dies ist ein Zusatz aus der heuristischen Lösungsform.

    /*************************************************************
* Masterstruct for a specific object in current Drawing Pool *
* DrawingList holding all objects in current drawing *
*************************************************************/
struct DrawingList
{
struct DrawingList *prev; /* Pointer to previous in list */
struct DrawingList *next; /* Pointer to next in list */
double x,y,z; /* Center of object in space */
double dxx,dyx,dzx; /* Sizing Orientation ex */
double dxy,dyy,dzy; /* Sizing Orientation ey */
double dxz,dyz,dzz; /* Sizing Orientation ez */
long int recnumber; /* Tracer receiver number */
int ax,ay,az; /* Anglegadgets real angle */
int dax,day,daz; /* Anglegadgets deviation */
double sx,sy,sz; /* Sizergadgets real size */
double dsx,dsy,dsz; /* Sizergadgets deviation */
double W,H,D; /* Width, Hight, Depth of object */
double AV,BV,CV,DV; /* Hitplane normal */
double pinx,piny,pinz; /* Pin location */
char Name[80]; /* Userspecified extra name */
struct ObjectList *object; /* Pointer to Objectdatalist */
struct MaterialList *material; /* Pointer to a material */
struct FlightList *flight; /* Pointer to a flightpath */
};

Strahlverfolgungsdaten werden in einer doppelt verketteten Liste gespeichert, damit die Konkatenation von Berechnungsergebnissen aus einer parallelen Form der Strahlverfolgungs-Algorithmus einfach durchgeführt werden kann. Diese Zusammenführungen werden in späteren Berechnungen für verschiedene akustische Kriterien verwendet. Bei der eigentlichen Auralisierung kann jeder Prozessor seine Berechnungen durchführen und dann die Antwort an den Hauptprozess senden. Beachten Sie, dass wir die Ergebnisse nicht in einer spezifischen geordneten Reihenfolge benötigen, da die Faltung auf der gesamten Datensammlung durchgeführt wird. Auf einer Ein-Prozessor-Maschine sind dynamische Arrays eine schnellere Datenstruktur für die eigentliche Faltung. Beachten Sie auch, dass mit den NOMIX- und MIXTHEM-Algorithmen die Daten in einer geordneten Reihenfolge vorliegen, da wir Sampling-Verfahren verwenden.

    /**************************
* List/node of tracedata. *
**************************/
struct TraceList
{
struct TraceList *prev; /* Pointer to previous in list */
struct TraceList *next; /* Pointer to next in list */
double length,acoeff; /* Length and absorption of path */
double ex,ey,ez; /* Origin direction */
double time,amplitude; /* Realtime renderdata */
char Sname[80],Rname[80]; /* Name of sender \& receiver */
int recnumber; /* Asociated number to tracer */
};

Programmiermethodik

Quick and Dirty, Slow and Clean, Blade Running that's my dream.

DDT

In diesem Abschnitt beschreibe ich meine Programmiermethodik in einer lockeren Darstellung; wer sich nicht für gelegentlich hochtrabende Sprache interessiert, sollte nicht weiterlesen. Die eigene Programmiermethode halte ich für äußerst wichtig, und wenn Zeit vorhanden ist, lege ich großen Wert auf die Gestaltung des Quellcodes. Die meisten von uns haben sehr individuelle Programmierstile, und bei großen Einzelprojekten ist es von großer Bedeutung, streng und präzise zu sein.

Wir können die strenge Programmiermethode als „Slow & Clean-Programming“ (SCP) bezeichnen. Für reine Algorithmusentwicklungen ist SCP jedoch nicht zu empfehlen, da der Programmierer sich dann an Details festhält, statt die Algorithmusfunktion zur Lösung des Problems zu erreichen. Zum Testen von Ideen kann der Programmierer „Quick & Dirty-Programming“ (QDP) verwenden.

Sobald die Algorithmen die ersten Optimierungen durchlaufen haben, können sie von allgemeinen Überflüssigkeiten befreit werden (seltsame Variablennamen usw.). Es gibt mehrere Optimierungsstufen, wobei ich die erste als primäre Optimierung bezeichne. Diese ist von rein mathematischer Natur und soll unnötige Berechnungen minimieren. Weiterhin haben wir die sekundäre Optimierung, bei der wir Suchwege/Berechnungsergebnisse, die ständig wiederkehren, im Voraus berechnen (amortisieren). Es gibt weitere Optimierungen, doch diese beiden sind immer vor einer umfassenderen Algorithmusentwicklung zu berücksichtigen. Sobald wir einen gut formulierten Algorithmus mit minimaler Berechnungskomplexität haben, können wir ihn in reinem Assembler optimieren. Dieses Vorgehen ist oft sehr kostspielig, wenn man den Gewinn im Vergleich zu Implementierungen in verschiedenen echten Programmiersprachen betrachtet. Programme neigen dazu, unhandhabar zu werden, wenn wir keine gewisse Einheitlichkeit in der Beschreibung der Funktionen haben. Die üblichste Methode, größere Probleme zu bewältigen, besteht darin, das Problem in einige Teilprobleme zu zerlegen. Diese Teilprobleme unterteilen wir weiter in weitere Unterprobleme. Auf diese Weise verfahren wir, bis wir die kleinen Teilprobleme lösen können. Beachten Sie, dass dies ein „Teile-und-herrsche“-Algorithmus ist. Oft sind die Teilprobleme mehr oder weniger verwandt, und stark verwandte sollten in benachbarten Textblöcken formuliert werden (vollkommen natürlich in Simula, weniger natürlich in anderen Sprachen). Diese Textblöcke sind Module im wahrsten Sinne des Wortes, und ich bezeichne sie als <name>Handler (z. B. ViewHandler, TraceHandler, SabineHandler). Der Hauptprogrammname sollte weniger kryptisch sein und präzise beschreiben, was er ausführt, oder ein rein kommerziell-ästhetischer Name sein. Abbildung 4.21 zeigt das Gesamtbild meiner Aufteilung des Programms [^1].

3D-Audio-Interkommunikationsflüsse. Doppelpfeil bedeutet Datentransfer und
Einfachpfeil bedeutet Programmflussänderungen. Der Stern zeigt an, dass Aufrufe in
der Global-Funktions-Modul (AboutPrefsMischandler) erfolgen. Die Fertigstellung in
jeder Modul führt zu einem Rückkehr zur Ereignismodul 3DAudio_events, um passiv auf neue Benutzerumformungen zu warten.

Beim Abschluss einer Modul sollte diese vollständig bereinigt und normalisiert sein. Die Normalisierung ist die Phase, in der der Programmierer eine vollständige Einheitlichkeitsumformung des Programmcodes durchführt. Dies bedeutet, dass er die Funktionen vollständig in Funktionsköpfen beschreiben muss, während komplexere Konstruktionen knapp in benachbarten Bereichen erläutert werden. Für den Programmierer ist das Programm wie ein großes Beweisstück mit Definitionen und Sätzen. Warum sollten wir nicht verlangen, dass Programme ebenso schön sein sollen wie mathematische Beweise oder so gut geschrieben wie die besten literarischen Werke? Die nächste Seite zeigt meine Normalisierungsstruktur, und das Layout ist der Amiga-Autodocs-Standard entnommen.

    /****** <Handler name> **************************************
* *
* NAME *
* <Function name> -- <Small description> *
* *
* SYNOPSIS *
* <Function name> ( <parameters> ) *
* *
* FUNCTION *
* <Big description> *
* *
* INPUTS *
* <Parameter description> *
* *
* RESULT *
* <Computed data description> *
* *
* EXAMPLE *
* Just necessary if it is a Global or Child function. *
* *
* NOTES *
* Type of function: *
* <Global, Master, Slave or Child> *
* ( <Realtime V:<velocity> > <Isochrone> *
* <Parallel or Sequential> *
* <Iterative, Recursive <Bottom upp or Top down>, *
* Input/Output or Event> *
* <Monte Carlo, Las Vegas, Pseudoprobabilistic or *
* Deterministic> *
* <Depth first, Width first, Greedy or Heuristic>) *
* function *
* <Function name>_<Nearest Parent name> *
* *
* BUGS *
* <Known bugs or logical missconditions> *
* *
* SEE ALSO *
* <This functions Global, Slave and Child calls> *
* *
* *
*************************************************************
*
*/
<Function name> ( <parameters> )
{
<Definitions>
Konstants have big first letter.
Descrete variables are i,j,k ...
Continous variables are x,y,z ...
Array variables are A[],B2[][],C3[][][]...
Pointers have big first letter and the type of data
structure with the leading characters as a suffix.

Suffixes are: <Oneway, Double, Circular or Vien> List,
<Binary, B- or <specialls>> Tree,
<Plain, Binomial or Fibonacci> HEap,
<Open, Chaining or Universal> HAshing ...

Initiatus <pseudoconstants, script or graphics>
<Itera or Recursiva> Computa
or
Redirection of programflow.

<Function return>
}

Diese Dinge sind trivial, wenn der Code weniger als hundert Funktionen enthält. Große Probleme haben normalerweise deutlich mehr Funktionen, und glauben Sie mir, es wird nicht trivial, wenn wir diese Programme normalisieren müssen. Manchmal ist es schwierig, das Optimum des schnellsten Implementierungswegs zu finden – besonders wenn der Programmierer schon lange in der QDP-Phase verweilt hat, treten diese Probleme auf. Oft kann man diesen „Punkt“ durch vorherige Erfahrung spüren. Alle Menschen können programmieren, aber nur die besten Programmierer balancieren auf diesem Gleichgewicht. Ob dieses Projekt eine wirklich optimale Implementierung ist oder nicht, überlasse ich als offene Frage denjenigen, die keine Informatiker sind. Selbst halte ich die Implementierung für zu langsam verlaufen, und das beruht auf den etwas komplexeren Funktionsvarianten, die ich mir selbst aus wissenschaftlichen Gründen auferlegt habe (was ich nicht bereue).

Schlussfolgerungen

Als ich mit diesem Projekt begann, hoffte ich, es gebe etwas Material zu diesen Problemen, um meine Sichtweisen so weit wie möglich zu erweitern. Meine Hoffnung wurde mit Überschuss erfüllt. Obwohl die Universitätsbibliothek (UB2) viel Material besitzt und ich von meinem Betreuer einige wertvolle Namen erhalten hatte, stellte sich heraus, dass fast vier Wochen intensiver Recherche nach relevantem Material nötig waren. Normalerweise explodiert die Informationsmenge, sobald man ein paar Spuren findet – doch in diesem Fall geschah dies nicht. Es scheint, als ob eine große Anzahl von Wissenschaftlern, die sich mit Audio-Ray-Tracing beschäftigen, die Hoffnungslosigkeit der Situation erkennen und das Problem an nachfolgende Generationen mit besseren Computern weitergeben. Dies steht im Gegensatz zum Video-Ray-Tracing, bei dem es eine viel größere Anzahl von „Anhängern“ gibt.

Obwohl der Amiga nicht über die gleiche Rechenleistung wie verschiedene Workstations verfügt, möchte ich betonen, dass CPU-Leistung nicht alles ist. Die scheinbar künstlichen Funktionsimplementierungen, die ich mich manchmal zwingen musste zu schreiben, wären niemals auf anderen Systemen zum Einsatz gekommen, da die Frustration über die Ineffizienz der Algorithmen manchmal unerträglich war. Mit diesem Hintergrund wäre ein langsames grafisches Benutzerschnittstelle eine große Barriere gewesen und hätte mich davon abgehalten, mich auf das Programmieren und die spezifischen Algorithmen zu konzentrieren. Die Wahl des Computers und der Programmiersprache hat sich daher als gute Entscheidung erwiesen. Allerdings ist eine „Iris Crimson“ (eine SGI-Maschine) erforderlich, um die Berechnungen in Echtzeit realisieren zu können.

Mein Abschlussarbeit im größeren Kontext: „Inter Gigantica Galactica“ (IGG) ist die vollendete VR-Umgebung, in der der Benutzer alles tun und erleben kann, gemäß der strengen Definition von VR.

Es wird oft gesagt, dass ein Problem mindestens doppelt so lange dauert, es zu lösen, als ursprünglich angenommen. Dies liegt in großem Maße auf der Größe der Vision und Ambition, die wir mit einbeziehen. Wenn die Visionen die Ambition übersteigen, dauert es viel länger. In diesem Fall ist meine Vision weit größer als meine Ambition. Obwohl dies eine Tatsache ist, darf dies keinesfalls als Zeichen dafür interpretiert werden, dass meine Ambition bescheiden war. Diejenigen, die selbst damit beginnen möchten, das Audio-Ray-Tracing-Problem zu lösen, können sich bewerben, um „The Making Of 3D-Audio so far“ einzusehen und zu sehen, was sie möglicherweise erwartet.

3D-Audio instruction manual

What is 3D-Audio

This program is a simple but fast audio-ray-tracer, with a semiprofessional three dimensional editor as a base for human-computer interaction. It has been developed on the Amiga line of computers and thus works, at the moment, only on these machines. Recent virtual-reality hysteria and the vast amount of video-ray-tracers on these machines, gave Me the idea of making this piece of software, as a prologue to the strong definition of VR (my own). Most parts of the program are profound, but a warning to those with small sized memories when ray-tracing. I am not checking if there is enough memory when starting the ray-trace session, and thus could make the computer hang, when the vast amount of ray-tracing hits are found and stored.

What it isn't

As for the most audio-ray-tracers there are some limitations, and thus it can't be used in predicting the room model impulse response without having the following facts in mind.

(1) The emitted sound is strongly quantized in direction, due to the heuristic function.

(2) All model surfaces are plane and smooth.

(3) Specular reflections and angle-independent absorption are assumed.

(4) Energy addition is assumed.

(5) Discontinuities at the edges are discarded.

(6) Diffraction, Dispersion, Resonance and Refraction isn't implemented yet.

(7) Partially diffuse sound field is assumed.

Installing the Software on Hard-drive

(0.1) If you don't have an Amiga computer, then you have to go and purchase one, or else go to 1.1

(0.2) Follow the hardware set-up and install the system disks. Go to 1.2

(1.1) Turn the computer on.

(1.2) Find a suitable place where you want the software, and make a New Drawer there.

(1.3) Insert 3D-Audio disk in any drive and double click at the disc icon.

(1.4) Multiselect the six drawers and the main program, and drag them to the New Drawer.

(1.5) Click once at the program icon and request information about the program.

(1.6) Change screen resolution to your preference in the Tool Types list.

(1.7) Double click at the program icon and way you go.

Happy modelling!!!

Main Editing Windows

The two editing windows are the "3D View & Edit" window (VE) and the "Drawing Pool" window (DP). Moving, resizing and turning objects are done by operating gadgets in VE. Additional gadgets in VE are for model purposes that relate to the object size/position, viewpoint, perspective and the grid. Inserting new objects and changing old ones are done by operating gadgets in DP. The following two pictures shows what each gadget does, and I urge the user to open the test model and play around with it.

Dies ist das Hauptbearbeitungsfenster von 3D-Audio. Mit den Schiebereglern für die X-Achse, Y-Achse und Z-Achse können Sie das Modell in jede Ansicht drehen. Die kleinen Wiederherstellungstasten an den Endpunkten dieser Drehregler, dargestellt als kleines O, positionieren das Drehknopf in der Mitte. Mit dem „Mess“-Zyklus-Gadget können Sie das Maßsystem von Metern über Fuß auf Aus geschaltet werden. Mit dem „Gittergröße“-Zyklus-Gadget können Sie die Dimension des Bodens ändern.

Dies ist das Modellkoordinierungsfenster, in dem alle sichtbaren Objekte des Modells aufgelistet sind. Sie aktivieren die Schaltfläche „Neu...“, wenn Sie ein neues Objekt in das Modell einfügen möchten. Das Löschen eines falschen oder unnötigen Objekts erfolgt mit der Schaltfläche „Löschen“. Die Zuweisung von Materialien und Flügen erfolgt mit der entsprechenden Schaltfläche „Auswählen...“ auf gleicher Ebene. Das Definieren eines Objekts aus dem bestehenden Modell erfolgt mit der großen Schaltfläche „Zeichnen->Objekt...“. Die Auswahl eines bestimmten Objekts in diesem Pool und das Drücken einer beliebigen Umschalttaste halten das Objekt im Bearbeitungsmodus. Diese Funktion ist sehr nützlich, wenn die Pins der Objekte gruppiert sind und Sie das geeignete Objekt in „3D-Ansicht & Bearbeiten“ nicht auswählen können.

Objects, Materials, Flights & Characteristics

When pressing "New..." or "Select..." gadgets in DP one of the following requester windows will appear on the screen. The "Object Pool" window handles the object fetch table, the "Material Pool" window (MP) handles the material fetch table and the "Flight Pool" window handles the objects morphing and flight path fetch table, and this end of the program is not yet fully implemented, and thus have no effect on the traced data.

Diese Abbildung zeigt, welche Art von Anforderern erscheint, wenn Sie verschiedene Funktionen im Fenster der Modellkoordination aufrufen. Sie müssen das entsprechende Objekt, Material und Flug in den Listenansicht-Elementen dieser Anforderer auswählen und die Schaltfläche „Ok!“ drücken, sofern alles korrekt ist. Andernfalls sollten Sie die Schaltfläche „Abbrechen“ drücken, wodurch der Programmablauf zurück zum Zeitpunkt vor dem Fehler erfolgt.

When pressing "New..." or "Edit..." gadgets in MP the "Characteristics" requester window appears on the screen. This window handles the entities of a specific material, and it's properties are visualized in the following picture.

Die Materialdefinition erfolgt im Fenster „Eigenschaften“, das ein Unterfenster des Materialkoordinationsfensters ist – nach Aufruf der Schaltflächen „Neu...“ oder „Bearbeiten...“. Die Benennung erfolgt einfach mit dem Zeichenfeld „Name“, und der Objekttyp wird mit dem Zyklenfeld „Typ“ ausgewählt. Die Frequenzantwort oder Dämpfungskurve können Sie mit gedrückter linker Maustaste freihand im Diagrammfeld bearbeiten. Die Richtwirkungseigenschaften werden über die Radiobuttons unter jeder Frequenzoktave umgeschaltet.

Computed Data

When you reach the stage of tracing the model, the "Computed Data" window gets active. If it's active the mouse pointer shows a clock. This indicates that the computer is calculating the reverberation times with Sabine's formula, and afterwards, that the ray-tracing has begun. While the computation commences, the echogram, at the bottom of the window, shows the computed ray hits. The reverberation distribution is visualized at the upper right corner, and you can - when computation is finished - change the air relative humidity, with the cycle gadget under the reverberation distribution.

Das berechnete Datenfenster, das beim Beginn der Nachverfolgung aktiviert wird. Nach der Berechnungssitzung wird die Trefferquote im „Flood-Time-Left“-Widget angezeigt. Nach einer Berechnungssitzung können Sie einen spezifischen Empfänger mit dem „Receiver“-Rad-Widget auswählen. Dies führt zu einem Echogramm der Raumbewegung in der Nähe dieses Empfängers.

Preferences

I have implemented a preference window to make modelling life easier. Here you can change the location path - mass storage location - for each model type (e.g. models, objects, materials and flights) and the traced data. Furthermore you can change the screen colors as in the workbench palette-preferences. The following picture shows this window.

Das Einstellungsfenster sollte aufgerufen werden, wenn eine temporäre Festplattenänderung vorliegt – typischerweise beim Batch-Holen von einem anderen Modellierer – oder wenn Sie die Software mit Ihren Verzeichnispfaden und Bildschirmfarben installieren möchten.

As usual the "Project" menu is at the left most position and it has the following properties visualized in the following picture.

Wenn Sie diese Zeichnungen, Objekte, Materialien, Flüge und nachgezeichneten Daten öffnen, zusammenführen oder speichern müssen, müssen Sie die entsprechende Funktion im Menü „Projekt“ auswählen.

The "Editing windows" menu has the effect of placing the respective window front most.

Wenn Sie keinen großen Monitor haben (z. B. steht HIRES statt SUPERLACE auf dem Hauptprogrammsymbol – aufgerufen mit rechter Amiga-I-Taste beim Einzelklick auf das Symbol – Werkzeugtypenliste), wird dieses Menü sehr nützlich.

The "Tracer" menu have all the parameters associated to the accuracy of the ray-tracer algorithm, and the initiation of tracing is also done here.

Das Menü „Tracer“ enthält alle Parameter, die mit dem Ray-Tracing-Algorithmus verknüpft sind. Dies ist nur das Beta-Stadium; das Aussehen kann ohne Vorankündigung geändert werden. Für die neueste und benutzerfreundlichste Version dieses Aspekts (Parameterumschaltung) müssen Sie auf Release 2 warten.

The "Miscellaneous" menu have, amongst other things, the Undo stack clearance functions. If you run out of memory, after a while modelling, you have probably many things in these undo stacks. This is because the computer remembers all deletion within the respective model type.

Dieses Menü verwaltet die Undo-Stacks und ruft das Fenster „Einstellungen“ auf.

Data Files

Each of the model types can be edited in a normal text editor. All though it isn't recommended that a novice user should mess in these files, an expert user could have some fun with them. She can, amongst other things, create new primitive objects in this way. The following lists shows the file formats associated with 3D-Audio software.

WARNING!!!

Users that input false data format, could make the program calculate very strange things, and it is very important that she knows what she is doing. I have no responsibility if the computer goes berserk, or some "new" acoustical phenomena are encountered.

Drawing File Form

File form:

        $3D-Audio_DrawingHeader
# <number of objects> <Magnification 1-10000> <Perspective 1-250> <Measure: 0=Meter, 1=Feet, 2=Off> <Grid Size 0-11 (0=Big 11 Small)>
$<Object #n model name>
#<Object #n><origo XO, YO, ZO>
<eigen vectors XE, YE, ZE><size XS,YS, ZS>
$miniOBJHYES
Remark: $miniOBJHNO and discard the following if no object data is present.
$ <Object #m primitive name>
# <number of primitive objects>
# <Special primitive #> <Eight x,y,z coordinates>
0: Tetrahedra
1: Cube
2: Octahedra
3: Prism
4: Room
5: Pyramid
6: Two dimensional plate

$miniMATRHYES
Remark: $miniMATRHNO and discard the following if no material is assigned.
$ <Material name>
# 0 <type of source> 0 0
0: Furniture
1: Sender
2: Receiver
Remark:Frequencies (Hz): 32 63 125 250 500 1k 2k 4k 8k 16k 32k
# <Eleven absorption coefficients ranging from 0 to 100>
# <Eleven directivity numbers at above stated freq.>
0: Omnidirectional
1: Bicardioid
2: Cardioid
$miniFLGHNO
Remark: Not implemented.

Example:

            $3D-Audio_DrawingHeader
#1 9711 231 0 5
$Big Sofa
#0.040670 0.171643 0.656502 1 -0.001465 0.000168 0.001466 0.999994 -0.003108 -0.000164 0.003108 0.999995 67 92 99 $miniOBJHYES
$Big Sofa
#4
#1 -1.378665 -0.251693 0.281572 1.341315 -0.250144 0.273905 1.341489 0.251856 0.273736 -1.378491 0.250308 0.281404 -1.378989 -0.251859 -0.218429 1.340991 -0.250311 -0.226097 1.341165 0.251690 -0.226266 -1.378815 0.250141 -0.218600
#1 1.345374 0.259635 0.275123 1.478653 0.259711 0.274748 1.478686 0.357711 0.274715 1.345407 0.357636 0.275090 1.345049 0.259469 -0.224880 1.478328 0.259545 -0.225255 1.478362 0.357545 -0.225288 1.345084 0.357469 -0.224912
#1 -1.525151 0.240771 0.279624 -1.391872 0.240847 0.279249 -1.391839 0.338847 0.279215 -1.525117 0.338770 0.279591 -1.525478 0.240603 -0.224378 -1.392198 0.240679 -0.224754 -1.392165 0.338679 -0.224787 -1.525444 0.338602 -0.224412
#1 -1.394825 0.222433 0.385671 1.325155 0.223981 0.378003 1.325443 0.809575 0.508692 -1.394537 0.808027 0.516360 -1.394881 0.244214 0.288071 1.325099 0.245763 0.280403 1.325387 0.831357 0.411093 -1.394593 0.829808 0.418760
$miniMATRHYES
$Skin
#0 0 0 0
#8 10 7 12 25 30 29 31 40 45 44
#1 1 1 1 1 1 1 1 1 1 1
$miniFLGHHNO
Objects File Form

File form:

        $3D-Audio_ObjectsHeader
# <number of objects>
$ <Object #n primitive name>
# <number of primitive objects>
# <Special primitive #> <Eight x,y,z metric coords.>
0: Tetrahedra
1: Cube
2: Octahedra
3: Prism
4: Room
5: Pyramid
6: Two dimensional plate

Example:

            $3D-Audio_ObjectsHeader
#1
$Cube
#1
#1 -1 -1 1 1 -1 1 1 1 1 -1 1 1 -1 -1 -1 1 -1 -1 1 1 -1 -1 1 -1
Materials File Form

File form:

        $3D-Audio_MaterialsHeader
$ <Material name>
# 0 <type of source> 0 0
0: Furniture
1: Sender
2: Receiver
Remark:Frequencies (Hz): 32 63 125 250 500 1k 2k 4k 8k 16k 32k
# <Eleven absorption coefficients ranging from 0 to 100>
# <Eleven directivity numbers at above stated frequencies>
0: Omnidirectional
1: Bicardioid
2: Cardioid

Example:

            $3D-Audio_MaterialsHeader
#1
$Black Hole 100%
#0 0 0 0
#100 100 100 100 100 100 100 100 100 100 100
#0 0 0 0 0 0 0 0 0 0 0
Trace Data File Form

File form:

     $3D-Audio_ForwardTraceHeader or $3D-Audio_BackwardTraceHeader
#Number of trace hits
#<Ray density><Reverberation accuracy><Specular depth><Diffusion accuracy><Diffraction accuracy><Frequency accuracy><Mean reverberation time in seconds><Max Number Of Receivers>
Remark: Accuracy: 0.00 to 1.00 are Manual values -1.00 initiate Auto state.
Density, Depth & Max number: Integer values
Seconds: Float value.
Remark: Entries at frequencies (Hz): 32 63 125 250 500 1k 2k 4k 8k 16k 32k
# Frequency dependant reverberation times, 11 entries at 40% R. hum.
# Frequency dependant reverberation times, 11 entries at 50% R. hum.
# Frequency dependant reverberation times, 11 entries at 60% R. hum.
# Frequency dependant reverberation times, 11 entries at 70% R. hum.
#<Ray length in meters><Accumulated absorption coefficient><Receiver number>
# Directivity eigen vectors XE, YE, ZE
$Sender Name
$Receiver Name

Example: These data should not be manually edited, even if you know what you are doing!!!

Preferences File Form

File form:

        3D-Audio_Preferences_file.
Drawings Path
Objects Path
Materials Path
Flights Path
Trace Path
Remark: Color numbers 0-7, RGB values 0-15, Seven entries!
<color number> <Red value> <Green value> <Blue value>
Remark: For further expansions only, don't change manually.
0 0 0 0

Example:

            3DAudio_Preferences_file.
Work Harddisk:C Prg/Sound Tracer/Drawings
Work Harddisk:C Prg/Sound Tracer/Objects
Work Harddisk:C Prg/Sound Tracer/Materials
Work Harddisk:C Prg/Sound Tracer/Flights
Work Harddisk:C Prg/Sound Tracer/Traced_Data
0 13 8 6
1 0 0 0
2 15 13 9
3 14 11 8
4 15 0 0
5 0 15 0
6 0 0 15
7 15 15 15
0 0 0 0

Begriffserklärungen, Definitionen usw.

Additive Absorption

Lassen Sie den Energiestrahl an den Oberflächen {xi;i=1,2,...,n}\{x_i; i=1, 2, ..., n\} mit jeweiligen frequenzabhängigen Absorptionskoeffizienten {αi(f);i=1,2,...,n;f=[20..20000]Hz}\{\alpha_i(f); i=1, 2, ..., n; f=[20..20000] Hz\} reflektieren; dann ist die Gesamtabsorption wie folgt:

α(f)=1Π(1αi(f))\alpha(f)=1-\Pi(1-\alpha_{i}(f)) {i=1,2,...,n}\{i=1, 2, ..., n\}

Klarheit

g(t)g(t) ist der Impulsantwort des Raumes.

C=10log100ms80ms[g(t)]2dt80ms[g(t)]2dtC=10\log_{10}\frac{\intop_{0ms}^{80ms}[g(t)]^{2}dt}{\intop_{80ms}^{\infty}[g(t)]^{2}dt} dB

Deutlichkeit (Definition)

g(t)g(t) ist die Impulsantwort des Raumes.

D=050ms[g(t)]2dt0ms[g(t)]2dtD=\frac{\intop_{0}^{50ms}[g(t)]^{2}dt}{\intop_{0ms}^{\infty}[g(t)]^{2}dt} 100%

Dirac-Impuls

Definition:

(1) δ(t)=0,\delta(t)=0,t0,δ(0)=+\neq0,\delta(0)=+\infty

(2) δ(t)dt=1\intop_{-\infty}^{\infty}\delta(t)dt=1

(3) δ(t)=δ(t)\delta(-t)=\delta(t) (δ\delta ist gerade)

(4) δ(ta)=aδ(t),a>0\delta(\frac{t}{a})=a\delta(t),a>0

(5) Θ(t)=δ(t),ddtsgn(t)=2δ(t)\Theta'(t) = \delta(t), \quad \frac{d}{dt} \operatorname{sgn}(t) = 2\delta(t)

Disjunkt

Wir haben zwei Mengen A und B, die keine gemeinsamen Elemente besitzen.

AB=A\bigcap B=\emptyset

Dynamik

I ist die Informationsdatenbreite in Bit.

Dynamik=20log10(2)IDynamik=20\log_{10}(2) \cdot I dB

Erklärung Dynamik

Das Linksshiften eines binären Zahlenwerts um einen Schritt verdoppelt den Wert. Gemäß der Definition des Dezibels entspricht jedes Bit einem Wert von 10log10(22)10\log_{10}(2^{2}) dB. Dies ergibt die Formel.

Energieverteilung im Raum

Q: ist die akustische Leistung der punktförmigen Quelle.

I(r)I(r): ist die Energieintensität, r Meter von der Schallquelle entfernt.

SiS_i: ist die gesamte Absorptionsfläche einer bestimmten Fläche.

aia_i: ist der Absorptionskoeffizient einer bestimmten Fläche.

N: ist die Anzahl der Oberflächen im Raum.

R=αiSi(1αi)1R = \sum{\alpha_i}{S_i(1-\alpha_i})^{-1} {i=1,2,...,N}\{i=1, 2, ..., N\}

I(r)=Q((4πr2)1+4/R)I(r) = Q \cdot ((4{\pi}r^2)^{-1}+4/R)

Energieausbreitung

Q ist die akustische Leistung der punktförmigen Quelle.

I(r)I(r) ist die Energieintensität, r Meter von der Schallquelle entfernt.

I(r)=Q4πr2I(r) = \frac{Q}{4{\pi}{r^2}}

Faltung (Convolution)

Definition: Die Dirac-Abtastung ist eine diskrete Sequenz mit folgender Form: F={fi:i=[0..n1]}F=\{f_i:i=[0..n-1]\}

Die Eingangsdaten sind eine diskrete Sequenz mit folgender Form: S={sj:j=[0..n1]}S=\{s_j:j=[0..n-1]\}

Die Menge F ist statisch, aber S ist dynamisch und ändert in jedem Abtastmoment ihre Elemente: sj+1=sj, beginnend bei sn-1. Das neueste Abtastdaten sind s0, und beachten Sie:

n=fDIRACT60n=f_{DIRAC} \cdot T_{60}

da wir das Ergebnis nicht weiter falten müssen als die Länge der Dirac-Abtastung. Die Faltung von F und S ergibt dann:

C=f0s0+f1s1+...+fn1sn1C=f_0 \cdot s_0+f_1 \cdot s_1+ ... + f_{n-1} \cdot s_{n-1}

Dies erfordert n Multiplikationen und (n-1) Additionen. Der Einfachheit und Klarheit halber sage ich, dass es n Operationen pro Abtastmoment erfordert („op“ bedeutet, dass eine Addition und eine Multiplikation ausgeführt werden).

IOUTI_{OUT}

I ist die Informationsdatenbreite. S ist die Anzahl der Terme (schallproduzierende Objekte).

IOUT=IIN+Ceil(log2(S))I_{OUT}=I_{IN}+Ceil(\log_{2}(S))

Erläuterung IOUTI_{OUT}: Die größte Zahl, die wir mit I Bits darstellen können, ist 2I12I-1. Beim Addieren von S Termen beträgt der Maximalwert (2I1)S(2I-1) \cdot S. Um zu ermitteln, wie viele Bits benötigt werden, führen wir folgende Berechnung durch:

IOUT=Ceil(log2((2I1)S))=Ceil(log2(2I1))+Ceil(log2(S))=IIN+Ceil(log2(S))I_{OUT}=Ceil(\log_{2}((2^I-1) \cdot S))=Ceil(\log_{2}(2^I-1))+Ceil(\log_{2}(S))=I_{IN}+Ceil(\log_{2}(S))

Impulsantwort

Das Impulsantwortsignal g(t)g(t) meines Arbeitszimmers.

Die Dirac-Impulspulse in Abbildung B.1 wurden durch einen starken und schnellen Klaps erzeugt. Dieser wurde mit einer Abtastrate von 35 kHz über ein einfaches Mikrofon und eine selbstgebauten Sampler abgetastet. Der Sampler war an den Amiga angeschlossen, und der gesamte Vorgang dauert etwa 460 ms.

Laterale Effizienz

g(t)g(t) ist der Impulsantwort des Raumes.

glat(t)g_{lat}(t) ist die Energie, die von den Seiten kommt.

Leff.=25ms80ms[glat(t)]2dt080ms[g(t)]2dt100%L_{eff.} = \frac{ \intop_{25ms}^{80ms}[g_{lat}(t)]^{2}dt}{\intop_{0}^{80ms}[g(t)]^{2}dt} \cdot 100\%

MSM_S

fSf_S ist die Abtastrate. T60T_{60} ist die Nachhallzeit, berechnet mit der Sabine-Formel. IINI_IN ist die eingehende Informationsdatenrate in Bit.

MS=fST60IIN/8 byteM_S = f_S \cdot T_{60} \cdot I_{IN}/8\ \text{byte}

MS=fST60IIN/8 byteM_{S} = f_{S} \cdot T_{60} \cdot I_{IN}/8~\text{byte}

Erläuterung MSM_S: Um eingehende Daten in jeder Zeitinstanz interpolieren zu können, müssen wir alle abgetasteten Daten speichern. Diese Speicherung hat eine Länge von fST60f_S \cdot T_{60} Einheiten, da wir eine Speicherung bis zur Zeitdauer der Dirac-Impuls benötigen. Die obige Tatsache und die Definition der Informationsdatenrate ergeben die Formel.

MIXTHEM Kapazität

op ist eine Addition plus eine Multiplikation. D ist die Rechenleistung des Computers in Anzahl von op/s. fSf_S ist die Abtastfrequenz. S ist die Anzahl der klangerzeugenden Objekte. fDIRACf_{DIRAC} ist die Abtastfrequenz bei der Abtastung der Dirac-Impuls. T60T_{60} ist die Nachhallzeit, berechnet mit der Sabine-Formel. R ist die Anzahl der Empfänger.

D=fS(S+fDIRACT60)RD=f_S \cdot (S+f_{DIRAC} \cdot T_{60}) \cdot R

Erläuterung MIXTHEM Kapazität: Die Voraddition aller Schallquellen zu jedem Empfänger muss mit derselben Geschwindigkeit erfolgen wie die eingehenden Daten, und dies ergibt folgenden Beitrag zur Formel:

fSSRf_S \cdot S \cdot R

Die Länge der Impulsantwort beträgt fDIRACT60f_{DIRAC} \cdot T_{60} Einheiten und enthält Direktschall, Reflexionen und Nachhall. Außerdem müssen wir jeden Empfänger mit den fDIRACT60f_{DIRAC} \cdot T_{60} Teilgeräuschen falten, die wir voraddiert haben. Auch dies muss mit derselben Geschwindigkeit wie die eingehenden Daten erfolgen. Dies ergibt folgenden Beitrag:

fSfDIRACT60Rf_S \cdot f_{DIRAC} \cdot T_{60} \cdot R

MIXTHEM MTOTM_{TOT}

R ist die Anzahl der Empfänger. fSf_S ist die Abtastfrequenz der eingehenden Daten. T60T_{60} ist die Nachhallzeit, berechnet mit der Sabine-Formel. IOUTI_{OUT} ist die ausgehende Datenbandbreite in Bit.

MTOT=RfST60IOUT/8M_{TOT} = R \cdot f_S \cdot T_{60} \cdot I_{OUT}/8

Erläuterung MIXTHEM MTOTM_{TOT}: Für jeden Empfänger sind fDIRACT60IOUT/8f_{DIRAC} \cdot T_{60} \cdot I_{OUT}/8 Bytes erforderlich, um die Voradditionen zu speichern, die beim Falten mit der Impulsantwort verwendet werden (IOUT, da wir Daten nicht durch Berechnungen verlieren möchten). Beachten Sie, dass es von großer Wichtigkeit ist, dieselbe Abtastfrequenz für eingehende Daten und Dirac-Abtastung zu verwenden, um die Voradditionen zu erleichtern. Dies ergibt die Formel.

NODIRAC-Kapazität

op ist eine Addition plus eine Multiplikation. D ist die Rechenleistung in op/s. fSf_S ist die Abtastfrequenz. S ist die Anzahl der schallerzeugenden Objekte. XEX_E ist die Anzahl der frühen Reflexionen. XRX_R ist die Anzahl der Reverberationsapproximationen. R ist die Anzahl der Empfänger.

D=fS(S+XE+XR)RD=f_S \cdot (S+X_E+X_R) \cdot R

Erläuterung NODIRAC-Kapazität: Jede Quelle erzeugt S direkte Schallwellen pro Empfänger. Dies erfordert SRS \cdot R op zur Faltung des direkten Schalls.

Die frühen Reflexionen erzeugen XE Reflexschallwellen pro Empfänger. Dies erfordert XERX_E \cdot R op zur Faltung des Reflexschalls. Die Reverberationsapproximationen erzeugen XR Nachhall-Schallwellen pro Empfänger. Dies erfordert XRRX_R \cdot R op zur Faltung des Nachhall-Schalls.

All dies muss in jedem Abtastmoment durchgeführt werden, was die Formel ergibt.

NOMIX-Kapazität

op ist eine Addition plus eine Multiplikation. D ist die Rechenleistung in op/s. fSf_S ist die Abtastfrequenz. S ist die Anzahl der schallerzeugenden Objekte. fDIRACf_{DIRAC} ist die Abtastfrequenz bei der Abtastung der Dirac-Impuls. T60T_{60} ist die Nachhallzeit, berechnet mit der Sabine-Formel. R ist die Anzahl der Empfänger.

D=fSSfDIRACT60RD=f_S \cdot S \cdot f_{DIRAC} \cdot T_{60} \cdot R

Erläuterung NOMIX-Kapazität: Die Länge des Impulsantwort-Signals beträgt fDIRACT60f_{DIRAC} \cdot T_{60} Einheiten und enthält direkten, reflexiven und Nachhall-Schall. Außerdem erzeugt jede Quelle fDIRACT60f_{DIRAC} \cdot T_{60} Teil-Schallwellen pro Empfänger. Dies erfordert SfDIRACT60RS \cdot f_{DIRAC} \cdot T_{60} \cdot R op zur Faltung aller Teil-Schallwellen. Dies muss in jedem Abtastmoment durchgeführt werden, was die Formel ergibt.

NOMIX MTOTM_{TOT}

MSM_S ist die Zwischenspeichergröße für die Impulsantwort-Faltung. R ist die Anzahl der Empfänger. fDIRACf_{DIRAC} ist die Abtastfrequenz der Impulsantwort. T60T_{60} ist die Nachhallzeit, berechnet mit der Sabine-Formel. IINI_{IN} ist die eingehende Informationsdatenbreite in Bit.

MTOT=S(MS+RfDIRACT60IIN/8)M_{TOT} = S \cdot (M_S+R \cdot f_{DIRAC} \cdot T_{60} \cdot I_{IN}/8) Byte

Erläuterung NOMIX MTOTM_{TOT}: Zur Zwischenspeicherung der Faltungsdaten jedes Senders sind SMSS \cdot M_S Byte erforderlich. Von jedem Sender zu jedem Empfänger sind fDIRACT60IIN/8f_{DIRAC} \cdot T_{60} \cdot I_{IN}/8 Bytes erforderlich, um die Impulsantwort zu speichern, die bei den Faltungen verwendet wird. Dies ergibt folgendes:

MTOT=SMS+SRf+DIRACT60IIN/8M_{TOT} = S \cdot M_S+S \cdot R \cdot f+{DIRAC} \cdot T_{60} \cdot I_{IN}/8

Nyquist-Theorem

Die Abtastung eines Tiefpass gefilterten Signals mit einer Bandbreite von B Hz erfordert eine Abtastfrequenz von 2B Hz, um alle Frequenzen bis zu B Hz erfassen zu können.

Beweis: Eine Welle besteht aus einem positiven und einem negativen Teil um eine Referenz. Schwingt diese Welle B-mal pro Sekunde um die Referenz, so haben wir B positive Teile und ebenso viele negative Teile. Um beide Teile zu erfassen, sodass die Welle rekonstruiert werden kann, müssen wir 2B-mal pro Sekunde abtasten.

Anstiegszeit

Die Zeit, bis die Hälfte der Energie der übertragenen Dirac-Impuls an der Teststelle eintrifft.

Sabine-Formel

V ist das freie Volumen des Raumes. SiS_i ist die gesamte Absorptionsfläche einer spezifischen Oberfläche. aia_i ist der Absorptionskoeffizient einer spezifischen Oberfläche. m ist die Dämpfungskonstante der Luft und kann bei kleinen Räumen vernachlässigt werden. N ist die Anzahl der Oberflächen im Raum.

T60=0.163VSiαi+4mVT_{60}=\frac{0.163 \cdot V}{\sum{S_i\alpha_i+4mV}} i=1,2,...,N{i=1, 2, ..., N}

Spline-Funktion (kubisch)

Definition: Sei x1<x2<...<xnx1<x2<...<xn die Abtastpunkte und eine Funktion s(x) auf dem Intervall [x1,xn][x1, xn] definiert. Außerdem sollen s(x),s´(x),s´´(x)s(x), s´(x), s´´(x) über diesem Intervall stetig sein. Für jedes Teilintervall [xi,xi+1],i=1,...,n1{ [x_i, x_{i+1}], i=1, ..., n-1 } lassen wir ein kubisches Polynom die Werte zwischen den diskreten Abtastpunkten interpolieren. Dann ist s(x)s(x) eine kubische Spline-Funktion.

Superellipsoid

f(x,y,z)=((x/a1)2/e2+(y/a2)2/e2)e2/e1+(z/a3)2/e11f(x, y, z) = ((x/a_1)^{2/e_2}+(y/a_2)^{2/e_2})^{e_2/e_1}+(z/a_3)^{2/e_1}-1

0<e1<1,0<e2<1,f(x,y,z)=00<e_1<1, 0<e_2<1, f(x,y,z)=0

Bücher, Software & Hardware

Timeo hominem unius libri

St. Thomas Aquinas

Für diejenigen, die selbst ähnliche Arbeiten durchführen möchten, kann diese Aufstellung von Quellenmaterial von großem Nutzen sein. Alle nachfolgend aufgeführten Einheiten sind mit der am häufigsten verwendeten Einheit oben aufgeführt.

Bucheinflüsse

Heinrich Kuttruff, Raumakustik
Andrew S. Glassner, Einführung in Ray Tracing
K. Blair Benson, Audio Engineering Handbook
Alan Watt & Mark Watt, Advanced Animation & Rendering Techniques
Stewen Brawer, Einführung in die parallele Programmierung
John Watkinson, The Art of Digital Audio

Artikelinflüsse

Yoichi Ando, Berechnung der subjektiven Präferenz an jedem Sitzplatz in einem Konzertsaal, Acoustical Society of America 74 (1983) 873

A. Krogstad, S. Strøm & S. Sørsdal, Fünfzehn Jahre Erfahrung mit computerisierter Ray Tracing, Applied Acoustics 16 (1983) 291

Katsuaki Sekiguchi & Sho Kimura, Berechnung des Schallfeldes in einem Raum mit der Methode der endlichen Schallstrahlintegration, Applied Acoustics 32 (1991) 121

Buchverwendung

Amiga ROM Kernel Reference Manual: Include und Autodocs
Amiga User Interface Style Guide
Amiga ROM Kernel Reference Manual: Libraries
Amiga Hardware Reference Manual
Steven Williams, Programming the 68000
Craig Bolon, Mastering C
J.D. Foley & A. van Dam, Fundamentals of Interactive Computer Graphics
Karl Gustav Andersson, Lineare Algebra
Grant R. Fowles, Analytische Mechanik
Tobias Weltner, Jens Trapp & Bruno Jennrich, Amiga Graphics Inside & Out

Schnellreferenzbücher

Encyclopedia Britannica Version 1991
Webster's International Dictionary
Jorge de Sousa Pires, Elektronik-Handbuch
Carl Nordling & Jonny Österman, Physik-Handbuch
Lennart Råde & Bertil Westergren, Beta Mathematik-Handbuch
Steven Williams, 68030 Assemblersprache Referenz
Alan V. Oppenheim & Ronald W. Schafer, Digital Signal Processing

Softwareeinflüsse

Real 3D v2.0, RealSoft
Caligari, Octree
Lightwave, NewTech
Real 3D v1.4, RealSoft
Imagine 2.0, Impulse
Sculpt 3D, Eric Graham
Videoscape, Aegis

Software-Nutzung

Finalwriter, SoftWood, für Dokumentenverfassung
Deluxe Paint, Electronic Arts, für Bildbearbeitung und Retusche
TxEd, für Programmierung
Tool Maker, Commodore, für GUI-Erstellung
SAS C v6.0 und v6.5 Compiler, für Programmgenerierung
CPR, zur Fehlersuche
Enforcer, als Fehlerbehebungshilfsmittel
Devpac 3.0, HiSoft, zur Optimierung
Metacomco Macro Assembler, zur Optimierung
Maple IV, für Hypothesenuntersuchung

Hardware-Nutzung

Amiga 500+ System 2.1 mit 50 MHz MC68030, 60 MHz 68882 und 4 MB, für Entwicklung
Vidi Amiga, Rombo, zur Videoscannung diverser Bilder mit Sony Handycam
Star LC24-200, für Preprint-Korrekturen
Hewlett Packard Desk Jet 550C, für Masterprintout v1.0
Hewlett Packard Desk Jet 520, für Masterprintout v2.0 und höher
Amiga 1200 System 3.0 mit 28 MHz MC68020 und 6 MB, für Tests und Entwicklung
Amiga 1000 System 1.3 mit 7.14 MHz MC68000 und 2.5 MB, für Optimierungen
Amiga 3000 System 3.1 mit 25 MHz MC68030 und 25 MHz 68882, für Konsistenzprüfungen
Amiga 4000 System 3.1 mit 30 MHz MC68040, für Konsistenzprüfungen
Quadraverb, Alesis, für Auralisierungsversuche
Eigenbau-Sampler, MIDI-Schnittstelle und Mixer für Auralisierungsversuche
DSS8+ (Digital-Sound-Studio) Hardware und Software, GVP, für Auralisierungsversuche
Dynamisches Mikrofon, Sherman, zur Dirac-Sampling (Korrelationsbestimmung Modell \Leftrightarrow Realität)

Referenzen

1

Hofstätter, M., Illustrerad Vetenskap 11 (1989) 50.

2

Nya Rön, Illustrerad Vetenskap 12 (1993) 19.

3

IEC 581.

4

McGraw-Hill Encyclopedia of Science & Technology 8 (1992) 444.

5

Kuttruff, H., Room Acoustics (1991) 82.

6

Swiatecki, S., Illustrerad Vetenskap 5 (1994) 50.

7

Gabrielsson, A. & Lindström, B., "Perceived Sound Quality of High-Fidelity Loudspeakers," J. Audio Eng. Soc., 65, (1979) 1019-1033.

8

Shaw E. A. G., „The Acoustics of the External Ear“, Handbook of Sensory Physiology, Band V/1: Auditory System, Springer-Verlag, Berlin, 1974.

9

Human Hearing, Encyclopedia Britannica, 27 (1991) 204.

10

Meyer, J., Acoustics and the Performance of Music, Verlag das Musikinstrument (1978)

11

Olsen, H. F., Music, Physics and Engineering, 2. Auflage (1967)

12

Cell-To-Cell Communication Via Chemical Signaling (Encyclopedia Britannica) 15 (1991) 599.

13

Toole, Floyd E., Principles of Sound and Hearing (Audio Engineering Handbook) 1.42 (1988).

14

Oppenheim, A. V. & Shafer, R. W., Digital Signal Processing. Prentice Hall, Engelwood Cliffs, NJ, (1975) 242

15

Hilmar Lehnert & Jens Blauert, Principles of Binaural Room Simulation, Applied Acoustics 36 (1992) 285.

16

Adams, G. J. & Watson, A. P., Digital audio processing for simulation of room acoustics. ASSPA, 1989, 103–107

17

Endocrine Systems, Encyclopedia Britannica, 18 (1991) 291.

18

Animal Behaviour, Encyclopedia Britannica, 14 (1991) 662.

19

Pheromone, Encyclopedia Britannica, 9 (1991) 262.

20

Exploration, Encyclopedia Britannica, 19 (1991) 48.

21

Flight simulator, Encyclopedia Britannica, 4 (1991) 834.

22

Möller H., Fundamentals of Binaural Technology, Applied Acoustics 36 (1992) 171

23

Gierlich H. W., The Application of Binaural Technology, Applied Acoustics 36 (1992) 219

24

Lehnert H. & Blauert J., Principles of Binaural Room Simulation, Applied Acoustics 36 (1992) 259

25

Vian J. & Martin J., Binaural Room Acoustics Simulation: Practical uses and Applications, International Symposium on Auditory Virtual Environment and Telepresence (Bochum, 8. April 1991) & Applied Acoustics 36 (1992) 293

26

Krokstad A., Strøm S. und Sørsdal S., Fifteen Years' Experience with Computerized Ray Tracing, Applied Acoustics 16 (1983) 291

27

Roese J. A. und Khalafalla A. S., Stereoscopic Viewing with PLZT Ceramics, Ferroelectrics 10 (1976) 47

28

Roese J. A. und McCleary L., Stereoscopic Computer Graphics for Simulation and Modeling, SIGGRAPH '79 Proceedings, Computer Graphics 13(2) (1979) 41

29

Kuttruff H., Room Acoustics, Elsevier Applied Science (1991) 62

30

Forsberg P., Applied Acoustics 18 (1985) 393

31

Choi S. und Tachibana H., Estimation of impulse response in a sound field by the finite element method, Thirteenth ICA No. E11-7 (1986)

32

Borish J., Extension of the image model to arbitrary polyhedra, Acoustic Society America 75(6) (1986) 1827

33

Kirszenstein J., An image source computer model for room acoustics analysis and electroacoustic simulation, Applied Acoustics 17 (1984) 275

34

Krokstad A., Strøm S. und Sørsdal S., Calculating the acoustical room response by the use of a ray tracing algoritm, Sound & Vibration 8(1) (1968) 118

35

Vorländer M., Simulation of the transient and steady-state sound propagation in rooms using a new combined ray-tracing/image-source algorithm, ASA 86(1) (1989) 172

36

Van Maercke D., Simulation of sound fields in time and frequency domain using a geometrical model, Twelfth ICA No. E11-7 (1986)

37

L'Espérance A., Herzog P., Diagle G.A. & Nicolas J.R., Heuristic Model for Outdoor sound Propagation Based on an Extension of the Geometrical Ray Theory in the Case of a linear sound speed Profile,
Applied Acoustics 36 (1992) 111