APPLICATIONSDIVERS ★ Grafik mit dem 3D-Processor ★

3D-Processor (CPC Magazin)Applications Divers
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

Cliquez sur l'image pour l'agrandirCliquez sur l'image pour l'agrandir

Eine der faszinierenden Möglichkeiten, die ein Computer bieten kann, sind grafische Darstellungen. Das beste Beispiel dafür sind neue Spiele wie "Elite” oder "Starion”, die sich sicherlich nicht zuletzt dank ihrer schnellen Vektorgrafiken zu Rennern entwickelt haben. Sicher hat sich schon bei so manchen beim Anblick solcher eindrucksvollen und - für heutige Rechner - schnellen Grafiken der Wunsch geregt, es den Entwicklern solcher Programme nachzutun. Meist stellt man dann jedoch fest, daß die Programmierung speziell dreidimensionaler Körper und deren Bewegungsabläufe sehr kompliziert und aufwendig wird, da die verwendete Programmiersprache häufig Basic ist und die Arbeitsgeschwindigkeit nur als besch... bezeichnet werden kann. Dies drängt uns förmlich eine schnellere Sprache auf, wobei der Maschinensprache der Vorzug zu geben ist. Dies erhöht allerdings wieder beträchtlich die Komplexität der Programme. Am geeignetsten erscheint mir deshalb eine gesunde Mischform, die zum einen die zeitkritischen Routinen in Assembler enthält und zum anderen das schwierige Steuerprogramm in einer höheren Programmiersprache wie Basic, Pascal oder C zuläßt. Sie haben richtig gelesen: Dieses Hilfsprogramm ist nicht, nur unter Basic einsetzbar, sondern auch unter den eben ais Beispiel genannten Sprachen, die mittlerweile für die Schneider-Rechner verfügbar sind.

Zu diesem Zweck habe ich die Kommandos in Form einer RSX-Erweiterung angelegt, da sie am universellsten einsetzbar sind (von einfachen CALLs einmal abgesehen). Ein Problem stellte sich jedoch bei der Übergabe der Parameter an die Kommandos, speziell für die Angabe der Eckpunktkoordinaten. Um eine höhere Genauigkeit und einen größeren Wertebereich für die Eckpunktkoordinaten zu ermöglichen, hätte man diese eigentlich als Fließkommazah-len übergeben müssen. Leider jedoch ist das Fließkommaformat keinerlei Codierungsnormen unterworfen. So benutzt zum Beispiel das Basic des Schneiders eine 5-Byte-Codierung für eine Fließkommazahl, HiSoft-Pascai dage-
gen eine 4-Byte-Codierung. Das einzige standardisierte Zahlenformat ist die integerzahl. Sie ist zwar ganzzahlig und hat nur einen Wertebereich von -32768 bis +32767, doch dieser Bereich ist für unsere Zwecke vollkommen ausreichend, solange man keine hochpräzisen Skizzen anfertigen muß. Außerdem sprechen die wesentlich höheren Berechnungsgeschwindigkeiten und der geringe Speicherplatzbedarf der Daten für die Anwendung des Integerformats.

Kartesisches Koordinatensystem

Für diejenigen, die sich noch nie mit dem Problem der dreidimensionalen Darstellung auseinandergesétzt haben, sei folgendes angemerkt. Die Position eines Punktes im Raum läßt sich mittels eines sogenannten kartesischen Koordinatensystems festlegen. Dabei bedient man sich dreier gedachter Koordinatenachsen, die sich alle im rechten Winkel Schneiden und im allgemeinen die Bezeichnung X, Y und Z tragen. Somit ist ein Punkt P (X = 100/Y = 50/Z = 87) eindeutig bestimmt. Um nun eine Gerade im Raum festzulegen, greifen wir auf das eben Gesagte zurück und geben einfach die Koordinaten ihres Anfangs- und Endpunktes an.

Doch was sind nun die elementaren Voraussetzungen, die für räumliche Darstellungen und vor allem für Bewegungen gefordert werden? Zunächst einmal muß ein solches Programm räumliche Strukturen zweidimensional auf dem Bildschirm darstellen können. Des weiteren ist das Drehen eines Körpers um einen beliebigen Drehpunkt mit beliebigen Drehwinkeln eine elementare Angelegenheit. Oft ist es auch nützlich, einen Körper im Raum verschieben zu können.

Ein weiterer, nicht ganz so wichtiger Aspekt ist das "Zoomen” - also das Vergrößern oder Verkleinern eines Körpers. Hier und da möchte man auch einmal einen Körper um seinen eigenen Schwerpunkt rotieren lassen. Da ist es dann nützlich, diesen Schwerpunkt blitzschnell ausrechnen zu können.

Alle diese Funktionen sind im 3D-Processor integriert. Zusätzlich verfügt er noch über zwei Befehle, mit denen man festlegen kann, ob ein Körper perspektivisch oder nichtperspektivisch dargestellt werden soll, wobei die letztere Form die naturgetreuere aber auch rechen- und zeitintensivere ist. Als nützliche Eigenheit ist noch ein Transfer-Kommando implementiert, mit dem man Speicherblöcke (hier vor allem gedacht für die Datenspeicher der Eckpunkt-Koordinaten) in Windeseile verschieben kann. Diese Funktion ist aber nicht ungefährlich in ihrer Anwendung und daher vor allem den Schneider-Experten Vorbehalten.

Bevor man sich an den Rechner setzt, sollte auf einem Blatt Papier schon eine Skizze des gewünschten Körpers vorliegen. Dabei numeriert man auf dem Papier alle Eckpunkte beginnend bei null durch, um später bei der Festlegung der Geraden mit Hilfe dieser Eckpunktnummern nicht in Schwierigkeiten zu kommen. Nun wird für jeden Eckpunkt die Koordinate im Raum festgelegt. Sinnvollerweise wählt man für die Koordinatenachsen einen ungefähren Wertebereich zwischen 0 und 1000, um auch zwischen Punkten, die entlang einer Achse einen relativ geringen Abstand zueinander halten, diesen Abstand verdeutlichen zu können, da wir ja bekanntlich mit ganzen Zahlen operieren. Später lassen sich immer noch mit Hilfe des 3D-Proces-sors diese Koordinaten durch Verkleinern, Vergrößern oder Verschieben in die gewünschte Lage bringen.

Um den Körper zu vervollständigen, müssen wir jetzt noch die Kanten definieren. Dies geschieht, indem wir die Nummer des Anfangs- und des Endpunktes angeben. Und zum Schluß muß der Körper nur noch in den Rechner eingegeben werden. Dies geschieht, wie in den Beispielen gezeigt, in Basic am besten in Form von DATA-Zeilen. Diese werden beim Programmstart dann ausgelesen und für den 3D-Processor gewissermaßen vorcodiert.

Dabei gelten für das Format der Eckpunktdefinition folgende Maßgaben: Jeder Körper besteht aus n Eckpunkten, wobei jeder dieser Eckpunkte die drei Koordinatenbestandteile X, Y und Z hat. Folglich besitzt jeder Körper n X-, n Y- und n Z-Komponenten. Jede dieser drei Komponenten muß als ein zusammenhängender Block im Speicher des Rechners stehen, wobei diese Blöcke aus n Zwei-Byte-Integerzahlen im INTEL-Format (Low-High) bestehen. Außerdem darf jeder Block nicht kürzer sein als 2*n Bytes, da es sonst bei einer Manipulation dieser Blöcke zu Überschneidungen in anderen Datenbereichen kommen kann. Beim Aufruf einer Routine des 3D-Processors müssen also zu jedem Körper drei Speicherbereiche für jede der drei Koordinatenkomponenten vorhanden sein, deren Länge in Bytes mindestens der doppelten, meistens der gleichen Anzahl der Eckpunkte entspricht.
Kanten- und Eckpunktdefinition
Für das Format der Kantendefinition gelten folgende Maßgaben: Jeder Körper besteht aus in Kanten. Jede dieser Kanten wird festgelegt durch die jeweilige Nummer des Anfangs- und Endpunktes. Da die Nummern der Eckpunkte die Zahl 255 nicht übersteigen dürfen, ein Körper folglich auf maximal 256 Eckpunkte (einschließlich des Eckpunktes Nr. 0) begrenzt ist, reichen zwei Bytes für die Festlegung einer Geraden: Byte Nr. 1 für den Anfangs- und Byte
Nr. 2 für den Endpunkt. Daraus ergibt sich übrigens auch das etwas seltsam anmutende Einlesen der Kantenfestlegungen in den Beispiellistings, in denen Byte 1 in das Highbyte und Byte 2 in das Lowbyte des Integerarrays für die Kanten transportiert wird.

Danach ist also für jeden Körper ein Speicherbereich reserviert, in dem für m Kanten abwechselnd Anfangs- und Endpunktnummer untergebracht sind und somit auch hier die Speichergröße je Körper mindestens 2*m betragen muß. Die Anzahl der Kanten ist ebenfalls auf maximal 256 beschränkt.

Hier noch ein paar Tips:. -

  1. Für die Eckpunkte jedes Körpers sollte man zwei gleichgroße Bereiche reservieren. Der eine Speicherbereich enthält die Originaldaten der Eckpunkte für den Körper, der andere dient als Rechenpuffer, in dem die neuberechneten Koordinaten bei einer Drehung abgelegt werden. Ansonsten kann es nämlich zu Rundungsfehlern kommen, die sich bei jeder neuen Berechnung potenzieren. Vor allem bei zugeschalteter Perspektive entsteht spätestens nach der Drehungsberechnung im gleichen Array ein heilloses Chaos. Dieser zweite Speicher - auch Arbeitsspeicher genannt - kann dann mittels des DISPLAY-Kommandos auf dem Bildschirm ausgegeben werden. In den Beispiellistings wurden ebenfalls immer mindestens zwei Koordinatenspeicher je Körper angelegt, wie die Arrays p und pn (eu) zeigen.
  2. Die Z-Achse des Koordinatensystems weist mit ihrem positiven Anteil in Richtung auf den Beobachter.
  3. Bei zugeschalteter perspektivischer Berechnung erhöht sich die Rechenzeit ca. auf das Vierfache.
  4. Die in den Beispiellistings oft verwendete Basic-Funk-tion ”§” gibt die Speicheradresse der nachstehend aufgeführten Variablen zurück. Äquivalent hierzu wäre unter HiSoft-Pascal die Funktion ADDR ().
  5. Bei etwaig anzugebenden Drehwinkeln ist zu beachten, daß diese ganzzahlig sein müssen. Nach Möglichkeit sollte man außerdem negative Drehwinkel vermeiden, da sie fehlerhaft interpretiert werden. Eine Abhilfe schafft folgende Formel, die den Drehwinkel vor dessen Übergabe (ob nun positiv oder negativ) wieder in seine korrekten Schranken weist: (360 + Winkel) mod 360 = Winkel.
  6. Komplexe Drehbewegungen lassen sich ebenfalls durchführen. Hierbei handelt es sich nur um mehret e überlagerte Drehungen um mehrere verschiedene Drehpunkte mit verschiedenen Drehwinkeln. Dazu ein Beispiel: Zwei Körper sollen um einen gemeinsamen Schwerpunkt kreisen und gleichzeitig Drehungen um ihren jeweils eigenen Schwerpunkt ausführen. Daraus ergäbe sich das folgende schematische Vorgehen (die Lösung in Basic finden Sie in Listing 3):
    a) Perspektive abschalten,
    b) Schwerpunkt von jedem der beiden Körper berecn-
    c) aus'den beiden Schwerpunkten den gemeinsamen Schwerpunkt berechnen,
    d) beide Körper um ihren jeweils eigenen Schwerpunkt drehen,
    e) Perspektive wieder einschalten,
    f) Drehung um diesen gemeinsamen Schwerpunkt durchführen.

    Zu beachten ist vor allem Punkt a) und e): Wäre die Perspektive nicht abgeschaitet, so würde man sie zweimal berechnen. Dies hieße letzten Endes, in einen schon einmal perspektivisch berechneten Körper erneut Perspektive hineinzubringen. (Übrigens lassen sich Punkt d) und f) ohne weiteres vertauschen.)

  7. Wichtig: Alle übergebenen Parameter an die Routinen müssen vom Typ Integer sein. Daher sollten nach Möglichkeit ausschließlich Integervariablen in den Programmen verwendet werden, um Verwechslungen mit Realzahlen zu vermeiden. Dies kann sonst unter Umständen ein tragisches Schickal nehmen, da der 3D-Processor alle Daten auf Integerbasis erwartet.
  8. Ebenfalls wichtig: Bei den unten aufgeführten Erklärungen der einzelnen Kommandos muß sorgfältig darauf geachtet werden, ob die übergebenen Parameter als Zeiger auf einen Parameterblock gedacht sind oder aber schon direkt die nötigen Werte darstellen sollen.
  9. Die Funktion CENTRE berechnet übrigens den Schwerpunkt eines Körpers, nicht dessen Mittelpunkt. Diesen erhalten Sie, indem Sie die entsprechenden Koordinatenkomponente (X, Y oder Z) nach dem jeweiligen kleinsten und größten Wert durchsuchen (hierbei sind die Basic-Funktionen MIN und MAX von Nutzen) und diese beiden Werte mitteln; so zum Beispiel für Listing 1 die X-Koordinate betreffend:

    FOR i = 1 to pmax-1
    maximum = MAX (px(i), px(i—1)): minimum = MIN (px(i), px(i-1))
    NEXT i

    mittelx = (maximum + minimum)/2

So, und nun folgt endlich die Liste mit den Befehlserläuterungen. Sofern sich Kommandos abkürzen lassen, ist dies in Klammern angegeben.

NO.PERSPECTIVE

Format: |NO.PERSPECIWE

Funktion: Schaltet die perspektivische Berechnung ab.

PERSPECTIVE

Format: |PERSPECTIVE, fx, fy, fz fx - fz: Fluchtpunktkoordinaten.

Funktion: Schaltet die perspektivische Berechnung ein und übergibt die gedachte Position des Beobachters im Koordinatensystem. Kann auch zum stufeniosen Zoomen benutzt werden, indem man den Abstand des Körpers zum Fluchtpunkt entlang der Z-Achse verändert.

MOVE (M)

Format: |MOVE, pkte, px, py, pz, dx, dy, dz pkte: Anzahl der Eckpunkte.

px - pz: Zeiger auf die jeweiligen Speicherbereiche der Eckpunktkoordinaten des betreffenden Körpers, dx - dz: Zu addierender oder zu subtrahierender Offset. Funktion: Addiert auf die drei angegebenen Integerarrays jeweils den dazugehörigen Offset und bewirkt dadurch eine Verschiebung im Raum.

ZOOM (Z)

Format: |ZOOM, pkte, px, py, pz, zx, zy, zz pkte: Anzahl der Eckpunkte, px - pz: Zeiger, siehe MOVE.
zx - zz: Geben die Zoomfunktion und den Faktor an. Funktion: Bei negativen Vorzeichen löst diese Funktion eine Verkleinerung, bei positiven eine Vergrößerung des Körpers entlang der jeweiligen Achse aus. Ein Zoomfaktor von null oder eins stellt den neutralen Wert dar, falls keine Aktion für die betreffende Achse gewünscht ist. Auf diese Weise läßt sich ein Körper in jede Richtung beliebig stauchen oder strecken.

Beispiel: |ZOOM.....-2,3,0 (Der Körper wird in X-Richtung um die Hälfte verkürzt und in Y-Richtung um das Dreifache verlängert. Die Null läßt den Körper in Z-Richtung unverändert.

CENTRE

Format: |CENTRE, pkte, px, py, pz, mx, my, mz

pkte: siehe oben.
px - pz: Zeiger, siehe oben.
mx - mz: Zeiger auf Integer-Variablen, die die Werte des er-rechneten Schwerpunktes aufnehmen sollen. Diese Variablen müssen vor Aufruf der Routine deklariert werden, sonst kommt es zu einer Fehlermeldung des Basic-Inter-preters.

Funktion: Errechnet den Schwerpunkt des angegebenen Körpers durch Mittelung von dessen Koordinaten. Das Ergebnis ist vom Typ Integer und kann, wie in den Beispielen gezeigt, als Drehpunkt eingesetzt werden.

CALCULATE (C)

Format: |CALCULATE, pkte, px, py, pz, pxn, pyn, pzn, wx, wy, wz, rx, ry, rz
pkte: siehe oben.
px - pz: Zeiger, siehe oben.
pnx - pnz: Diese Zeiger weisen auf einen freien Speicherbereich hin, der als Arbeitsspeicher dienen soll und mindestens dieselbe Größe haben muß wie der Originaldatenbereich, der mit px - pz angegeben worden ist. wx-wz: Geben den Drehwinkel um die jeweilige Achse an. rx - rz: Geben die Koordinate des Punktes an, um den der Körper gedreht werden soll.

Funktion: Diese Funktion stellt das Kernstück des 3D-Pro-cessors dar. Sie führt die eigentliche Berechnung, d. h. Drehung durch. Dabei geht die Routine intern wie folgt vor: Zunächst werden die drei Speicherbereiche für die eigentlichen Berechnungen transferiert, danach in einem ersten Durchlauf die Drehungen um die drei Achsen durchgeführt und, falls erforderlich, die Perspektive mit hineinberechnet. Anschließend stehen die neuen Koordinaten im Arbeitsspeicher entweder für eine neue Berechnung oder für eine Ausgabe auf dem Bildschirm bereit. Soll eine zweite Drehung durchgeführt werden, so muß in einem zweiten CAL-CULATE-Kommando als Originaldatenbereich der mit der vorherigen Drehung berechnete Datenspeicher angegeben werden. Vergessen Sie nicht das An- und Ausschalten der Perspektive.

DISPLAY (D)

Format: |DiSPLAY, linien, pxn, pyn, g linien: Anzahl der Geraden des darzustellenden Körpers, pxn, pyn: Zeiger auf den Arbeitsspeicher der beiden Koordinatenkomponenten X und Y.

g: Zeiger auf das Kantenarray, das die Geraden beschreibt.

Funktion: Stellt den Körper auf dem Bildschirm grafisch dar. Zur Arbeitsweise: Der 3D-Processor holt sich nacheinander aus dem Speicherbereich für die Kantenbeschreibung die Anfangs- und die Endpunktnummer jeder Geraden, über die er dann die X- und die Y-Koordinate des Anfangs- und Endpunktes aus dem Arbeitsspeicher bezieht und die entsprechende Gerade auf dem Monitor darstellt.

TRANSFER

Format: |TRANSFER, start, ziel, anz start: Startadresse des zu transferierenden Speicherbereichs.

ziel: Startadresse, ab dem die Kopie des zu transferierenden Speicherbereiches abgelegt werden soll, anz: Anzahl der zu transferierenden Bytes.

Funktion: Die Funktion entspricht im wesentlichen dem Z80-Befehl LDIR, nur daß hier vor Ausführung der Funktion noch eine Plausibilitätsprüfung auf etwaige fehlerhafte Angaben gemacht wird (z. B. Überlappungen der beiden Bereiche). Sinn dieser Funktion ist es vor allem, den Inhalt eines Arrays in ein anderes zu kopieren. Eine konkrete Anwendung wäre, z. B. zwei Arbeitsspeicher für die Koordinaten zu definieren, wobei der eine immer die Koordinaten in-ne hat, die der zurZeit auf dem Bildschirm befindliche Körper besitzt, während das zweite Array schon mit den Daten des nächsten Bildes gefüllt werden kann. Dann kann mit dem älteren Array der Körper vom Monitor weggezeichnet und das ältere Array wieder blitzschnell mit den Werten des neuen geladen werden, so daß irgendwelche Verrenkungen mit Logikflags vermieden werden. Die beiden Startadressen der Arrays kann man leicht unter Basic ermitteln. Die Anzahl der Bytes in einem Integerfeld errechnet sich durch: Anzahl der Feldelemente * 2. Diese Routine ist vor allem den Profis unter den Schneider-Programmierern zugedacht, da sie gewisse Gefahren in sich birgt.

Weitere Einzelheiten werden Sie sicherlich mit Hilfe der Beispiellistings erkennen.

O. Welsch , CPC Magazin

★ PUBLISHERS: CPC Magazin , CPC Magazin Codex
★ YEAR: 1986
★ CONFIG: 64K + AMSDOS
★ LANGUAGE:
★ LiCENCE: LISTING
★ COLLECTION: CPC MAGAZIN 1985 1986
★ AUTHOR: O.Welsch
 

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listings:
» RSX-3D-Processors  v1.2    GERMANDATE: 2013-01-09
DL: 298
TYPE: ZIP
SiZE: 9Ko
NOTE: 40 Cyls
.HFE: Χ

» RSX-3D-Processors  v1.3    (CPC  Magazin)    GERMANDATE: 2021-02-02
DL: 213
TYPE: PDF
SiZE: 1545Ko
NOTE: 10 pages/PDFlib v1.6

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Applications » RSX Input (Computer Partner)
» Applications » RSX Scroll
» Applications » RSX DFILL (Schneider Aktiv)
» Applications » Varput
» Applications » RSX Circle (Schneider Aktiv)
» Applications » Rsx - Resident System Extensions (CPC Amstrad International)
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 219 millisecondes et consultée 1999 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.