Autor Beitrag
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Do 21.02.08 15:38 
Hier habe ich ein Bild einer Strasse:

user defined image

Die rote Linie stellt die Tiefe von 1 Meter dar.

Nun möchte die gesamte Strasse ich 1 Meter Stücke teilen. Aber, genau wie mit der Tiefe die Breite abnimmt, nimmt mit der Tiefe die Länge ab. Weiß einer wie man die Länge berechnen kann? Um wie viel wird der nähste Meter kürzer, usw.? Wie kann man das berechnen?

_________________
Popov
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Do 21.02.08 16:12 
Titel: Perspektiven
Hi,

Vielleicht hilft dir das weiter:
Die scheinbare Größe eines Objektes ist proportional 1/r, also sRES = sREAL / r.

Die scheinbare Position eines Punktes kannst du demnach folgendermaßen errechnen:

  • Nimm an, du betrachtest einen Kreis mit Bildschirmmitte(Formularmitte) als Mittelpunkt, auf dem der Punkt liegt.
  • Nun errechnest du die scheinbare Größe des Kreises und ziehst den Punkt auf den neuen Kreis.


Überleg mal, wie du daraus auf eine Formel kommst.
Wenn du nicht darauf kommst, frag noch einmal nach.

mfG,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
Popov Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Do 21.02.08 16:35 
Ich glaube das bringt mich nicht weiter, oder ich verstehe deine Gedanken nicht.

_________________
Popov
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: Do 21.02.08 16:44 
Nun ja die Straße liegt bei normalen Menschen ca 2 Meter unter den Augen. Diese Höhe wird nicht verändert in größerer Entfernung wohl aber die "z"-Koordinate für Tiefe.

Was man machen muss: Man hat eine Kameraposition (x1,y1,z1) und einen Punkt im Raum (x2,y2,z2). Den Koordinatenursprung legst du in die Kameraposition => (0,0,0)

Den Differzvektor (Da der eine Vektor jetzt Null ist ist der Diffvektor der Ortsvektor zum Punkt, den du abbilden möchtest) transformierst du in Kugelkoordinaten (Wikipedia) und damit hast du deine beiden Winkel theta und phi, welche wiederum die Koordinaten deiner Abbildung theta=y phi=x auf dem bildschirm sind.

P.S. Deine Linie dürfte streng genommen in dieser Perspektive nicht gerade verlaufen.
Popov Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Fr 22.02.08 00:21 
Also das ist mir immer noch zu hoch. Vielleicht liegt das daran, daß ich keine 3D Engine nutze, sondern es mir hier um reine Berechnung im Bild geht. Somit habe ich keine Kamera die ich irgendwo setzten kann.

Ich hab ein wenig experimentiert. Das Einzige was einigermaßen die Tiefe verleit ist die Ableitung aus einem Kreis. Zufrieden bin ich damit immer noch nicht. Vielleicht hat einer noch eine bessere Idee.


user defined image

Da meine Schulzeit paar Jahre hinter mir liegt, vielleicht kann mir einer bei der Formel helfen. Was ich habe ist der Radius und eine Länge. Hmm... Wenn nichts kommt, sehe ich mir den Satz des Pythagoras an.

_________________
Popov
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: Fr 22.02.08 13:18 
Also nochmal allgemein: Deine Augen sind der Ursprung des Koordinatensystems (das heißt von dort zählst du alle Längen). Sei z die Tiefe also da wo deine Straße hingeht y die Höhe und x die Breite.

Deine Füße sind also irgendwo bei z=0 y=-1,8m und plus minus x=+-20cm Das ist eine karteische Koordinate. Diese rechnest du um in Kugelkoordinaten:

r=sqrt(x^2+y^2+z^2)
theta=pi/2-arctan(z/sqrt(x^2+y^2))
phi=arccos(x/sqrt(x^2+y^2)) für y>=0 und phi=2*pi-arccos(x/sqrt(x^2+y^2)) für y<0

Die Winkel theta und phi benutzt du jetzt als Koordinaten (und zwar als kartesische x,y) auf deinem Canvas. Das heißt theta geht von 0 bis 180 oder in Rad von 0 bis pi. 0 entspricht dann der Oberkante deines Canvas und pi der Unterkante also 400 Pixel als Höhe beispielsweise. Das ist die Vorschrift für einen Dreisatz:
für theta: pi/gesamtyPixel=theta/yPixelwert

Zu diesem Zeitpunkt kennst du alles außer yPixelwert, was die Pixelkoordinate deines zu malenden Punktes ist. Für phi gilt das gleiche bloß das phi bis 2*pi geht und natürlich die x-Achse aufspannt (also pi's durch 2 pi ersetzen und y's durch x'se).

Wenn du diese Streifen im Bild als Gerade nähern möchtest (Was sie in dieser Perspektive streng genommen nicht sind) brauchst du nur theta.

Algorithmus du bildest dir eine Abbildungsfunktion, welche dreidimensionale Kartesische Koordinaten akzeptiert und ober obigen Algorithmus in 2 dim Pixelkoordinaten transformiert. Damit malst du. Dann brauchst du eingentlich nur noch eine Schleife, die die kartesischen Koordinaten erzeugt, aber dies sind die Orte im Reum, wo die Streifen bzw, die Punkte der Streifen liegen. Das musst du also selber wissen, wo die hinsollen, bsp.weise alle 100 meter.

P.S. Diese Schleife müsste selber abbrechen, da noch in unendlicher Entfernung abgebildet werden kann.
ene
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 779
Erhaltene Danke: 1

Vista, XP, W2K
Delphi, .Net, Deutsch und Englisch
BeitragVerfasst: Fr 22.02.08 14:10 
Wenns nur 2D ist, sollte der Strahlensatz doch auch ausreichen.

_________________
Wir, die guten Willens sind, geführt von Ahnungslosen, Versuchen für die Undankbaren das Unmögliche zu vollbringen.
Wir haben soviel mit so wenig so lange versucht, daß wir jetzt qualifiziert sind, fast alles mit Nichts zu bewerkstelligen.
Wonko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 69



BeitragVerfasst: Fr 22.02.08 14:11 
Hallo,

da Du das ganze nur zweidimensional darstellen möchtest, folgende Überlegung: die y-Position der Linien berechnet sich mit
y=(x-d)*h/x,
dabei ist x die Entfernung der Linie vom Betrachter, d die Entfernung der Bildebene vom Betrachter (ergibt sich aus dem angestrebten Blickfeld) und h die Höhe des Betrachters (seine Augen).
Das ganze ergibt sich mit Hilfe der angehängten Abbildung und der Anwendung des Tangens: tan(a)=y/(x-d) und tan(a)=h/x, a ist der Winkel zwischen "Strahl" und Erde.

Grüße,
Wonko
Einloggen, um Attachments anzusehen!
_________________
"Read the directions, even if you don't follow them.", Mary Schmich
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: Fr 22.02.08 14:48 
@user profile iconwonko Das soll wohl ein Strahlensatz sein. Das wäre dann im Gegensatz zu mir eine Abbildung auf eine Ebene gut, aber sie sollte wenigstens richtig sein:
Da darf nicht x-d stehen, sondern nur d.
Wonko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 69



BeitragVerfasst: Fr 22.02.08 15:41 
@user profile iconAllesquarks: Strahlensatz?
@user profile iconAllesquarks: Das (x-d) wird sich bestimmt ärgern, wenn Du ihm verbietest, dort zu stehen.
Ob (x-d) oder d richtig oder falsch ist, hängt davon ab, wo der Koordinatenursprung gewählt wird! Bei mir ist er unten am Boden, wo sich die beiden dicken Linien treffen. Du hast ihn hingegen in Augenhöhe platziert, wie es halt beliebt; dann sollten wir aber auch unter x verschiedene Längen verstehen...

_________________
"Read the directions, even if you don't follow them.", Mary Schmich