PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Trigonometrie (2D): Schneiden sich zwei Strecken?


Kinman
2008-11-19, 21:36:22
Hallo, ich hab momentan irgendwie ein Brett vorm Kopf...
Und zwar hab ich zwei Strecken, festgelegt durch Anfangs bzw. Endpunkt. Nun will ich wissen ob sich diese Strecken schneiden oder nicht. Sollten Sie sich schneiden ist mir prinzipiell egal wo der Schnittpunkt liegt.

Eine der beiden Strecken darf auch eine Halbgerade sein, sollte es sich so leichter "berechnen" lassen.

Das ganze soll nach Möglichkeit halbwegs effizient sein.
Super wäre auch, wenn ich im gleichen Zug feststellen könnte ob die Strecken zufällig übereinanderliegen, ist aber kein muss. Hier kann ich sonst mit der normalen Geradengleichung arbeiten.

Danke, mfg Kinman

Senior Sanchez
2008-11-19, 21:39:31
Da hatte man mal etwas in der Schule ;)

Bringe beide Strecken (oder beschreibe es noch besser als Geradengleichung) in den Schnitt, dass heißt gleichsetzen.

Nun gibts verschiedene Fälle, die sich durch die Lösung des Gleichungssystems ergeben:
- keine Lösung --> die Strecken/Geraden sind parallel
- eine Lösung --> sie schneiden sich und der Schnittpunkt ist leicht zu berechnen
- unendlich viele Lösungen --> sie sind deckungsgleich, liegen also aufeinander

Aber was sucht dieser Thread hier in der Lounge? *g*

Kinman
2008-11-19, 21:43:18
Ja, ich hätte ihn im Offtopic erstellen sollen...
Naja egal.

So leicht is es auch wieder nicht, da es sich um Strecken und nicht um geraden handelt. Und momentan hab ich absolut ein Brett vor Kopf da ich gar nichtmal weiß wie ich "keine Lösung" programmiertechnisch lösen sollte.

Es geht eigentlich um das Testen ob ein Punkt innerhalb eines Polygons liegt.
Schneidet eine Halbgerade ausgehend vom Punkt in irgendeine Richtung eine ungerade Anzahl an Kanten (also Strecken), dann ist der Punkt innerhalb des Polygons.

mfg Kinman

EDIT:
Ich hab eine Lösung gefunden
http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline2d/lineline2.gif
Wenn ua und ub > 1 sind, dann gibts keinen Schnittpunkt
Aber irgendwie reichlich ineffizient. Naja ich werds mal implementieren und schaun wie langsam das ist....

Senior Sanchez
2008-11-19, 22:03:39
Ob es nun Strecken oder Geraden sind ist doch völlig latte.
Du baust einfach ne Geradengleichung auf - einen Startpunkt findste ja und den Richtungsvektor auch.
Das machste für jede der beiden Strecken und stellst das Gleichungssystem auf.

Wenn du ne Lösung rausbekommst, schaust du einfach ob der Zielpunkt auf beiden Strecken liegt.

pest
2008-11-19, 23:13:36
Es geht eigentlich um das Testen ob ein Punkt innerhalb eines Polygons liegt.


das macht man effizient über ein sweep-verfahren in der ebene
du schickst vom punkt ausgehend von links einen strahl nach rechts und berechnest wie oft eine polygonkante geschnitten wird
ist die anzahl...ähm...ungerade liegt der punkt im polygon, sonst nicht

Kinman
2008-11-19, 23:20:58
das macht man effizient über ein sweep-verfahren in der ebene
du schickst vom punkt ausgehend von links einen strahl nach rechts und berechnest wie oft eine polygonkante geschnitten wird
ist die anzahl...ähm...ungerade liegt der punkt im polygon, sonst nicht

Und genauso mach ich es. Nur das ich halt den Strahl vom Punkt aus in eine beliebige Richtung "schieße".

mfg Kinman

pest
2008-11-19, 23:30:19
Und genauso mach ich es. Nur das ich halt den Strahl vom Punkt aus in eine beliebige Richtung "schieße".

mfg Kinman

warum? macht doch keinen sinn. also du solltest dir schon eine richtung aussuchen.
ob sich der strahl mit dem nächsten kantenzug schneidet berechnet man über eine 3-reihige determinante und testet auf lösbarkeit des gls (also ob die determinante 0 ist)
ich hab hier auch c-code aber mit ner speziellen bibliothek names leda

Kinman
2008-11-28, 10:03:57
Sooo.. obiges funktioniert wunderbar, dauert aber sehr lange....
Da ich mittlerweile so oder so nurnoch auf Dreiecke setze, ändert sich meine Anforderung an "Ist der Punkt im Dreieck".
Dazu hab ich auch schon eine passende Lösung gefunden:

http://matheplanet.com/matheplanet/nuke/html/viewtopic.php?rd2&topic=54229&start=0#p404653

http://matheplanet.com/matheplanet/nuke/html/uploads/6/5126_punktimDreieck.jpg

Ich habe natürlich die Eckpunkte + Q gegeben. Also auch den Vektor OQ.
Aber wie zum Teufel berechne ich r & s? Also im Prinzip die Länge der zwei Komponenten.
Mathe war noch nie meine Stärke...

Danke, mfg Kinman

pest
2008-11-28, 10:13:09
Sooo.. obiges funktioniert wunderbar, dauert aber sehr lange....

dann hast du was falsch gemacht ;)


Aber wie zum Teufel berechne ich r & s? Also im Prinzip die Länge der zwei Komponenten.


Q = r*A + s*B

Da die Vektoren jeweils Zwei Komponenten besitzen, kannst du das GLS einfach auflösen

Kinman
2008-11-28, 10:15:56
Ok, danke, dass sollte ich eventuell noch zusammenbringen...

Zu obrigen: Bestimmt. Einfach weil ich da mehr zusammenkopiert habe, denn selbst geschrieben. Optimierungen waren somit auch nicht wirklich drin.

mfg Kinman

Kinman
2008-11-28, 11:12:39
Hmm.. irgndwie klappt das nicht ganz so wie gewollt....

Hier mal kurz mein Code:


$xa = $px[2]-$px[0];
$ya = $py[2]-$py[0];

$xb = $px[1]-$px[0];
$yb = $py[1]-$py[0];

for ($y = $min_y; $y <= $max_y; $y++)
{
for ($x = $min_x; $x <= $max_x; $x++)
{
$xq = $x - $px[0];
$yq = $y - $py[0];

//Berechne r
$r = (($yb * $xq) - ($xb * $yq)) / (($xa * $yb) - ($xb * $ya));

//Berechne s
if ($xb != 0) $s = ($xq - ($r * $xa)) / $xb;
else $s = ($yq - ($r * $ya)) / $yb;


if (($r + $s) <= 1) imagesetpixel ($canvas, $x, $y, $col_red);
}
}


P[0] = (100/100)
P[1] = (200/130)
P[2] = (150/50)

Ich teste alle Punkte innerhalb des Vierecks. Wenn der Punkt im Dreieck liegt, dann male ich ihn hellrot an. Leider sieht das Ergebnis nicht unbedingt so aus, wie gewünscht.

Woran kanns liegen?

Danke, mfg Kinman

vudu
2008-11-28, 11:32:56
$r bzw $s nehmen in den Bereichen die du nicht rot haben wolltest negative Werte an.

Kinman
2008-11-28, 11:41:43
Ok danke. Ich hab zwar mit r + s > 0 probiert aber nicht einzeln...

Jetzt funktionierts, Danke!

mfg Kinman

Kinman
2008-11-28, 14:20:07
So... kaum hat man ein Problem gelöst, tut sich das nächste auf...

Und zwar:
Ich habe jetzt ein Dreieck in einem Raum, gegeben durch die drei Eckpunkte A(x/y/z), B & C. Desweiteren habe ich einen Punkt P, der auf der Ebene liegt. Allerdings habe ich nur x & y gegeben und muss z ausrechnen.

Die Schräglage der Ebene kann ich über den Normalvektor des Dreiecks feststellen. Aber bei allem weiterem steig ich aus... D.h. keine Ahnung wie und ob ich das Nutzen kann...

Ich hoffe das war dann das letzte Stückchen Mathematik, das mir im Weg steht.

Danke, mfg Kinman

pest
2008-11-28, 14:27:24
also nen Dreieck ausfüllen geht wesentlich eleganter

ist das Letzte ne Aufgabe? oder hast du damit was anderes vor?

Kinman
2008-11-28, 14:30:51
Ja, das Dreieck ausfüllen. Allerdings muss ich so oder Pixel für Pixel zeichnen.
Eleganter gings sicherlich mit einem Kantenlisten-Algorythmus, aber so versteh ich wenigstens noch so halbwegs was ich mache. Eventuell werd ich das später durch etwas besseres ersetzen...

mfg Kinman

pest
2008-11-28, 14:49:13
ich muss jetzt erstmal los, aber heut Abend kann ich noch was posten, das geht auch über nen Sweep-Verfahren imo

pest
2008-11-28, 18:51:19
so jetzt musst du nochmal schreiben, ob du wissen willst wie man effizient ein polygon ausmalt, oder

ob du zu unten was wissen willst, oder ob es eigentlich um was ganz anderes geht :D
das könnte entscheident sein


Und zwar:
Ich habe jetzt ein Dreieck in einem Raum, gegeben durch die drei Eckpunkte A(x/y/z), B & C. Desweiteren habe ich einen Punkt P, der auf der Ebene liegt. Allerdings habe ich nur x & y gegeben und muss z ausrechnen.


welche Ebene? die von A und den Richtungsvektoren AB u. AC aufgespannt wird?

Kinman
2008-11-28, 19:15:19
Das mit dem Polygon (aka Dreieck) ausmalen ist abgeschlossen, das klappt jetzt wunderbar und ist mir auch schnell genug.

Mein neues Problem ist:
Ich habe ein Dreieck (bzw. eine Ebene, ist in dieser Frage egal) im 3 dimensionalen Raum, welches durch die Vektoren AB und AC aufgespannt ist (A, B und C sind gegeben). Zusätzlich habe ich einen Punkt P der auf dieser Ebene aufliegt. Allerdings habe ich von diesem Punkt nur die x und die y Koordinate gegeben d.h. ich muss die z-Koordinate berechnen.

Danke, mfg Kinman

Kinman
2008-11-28, 19:20:53
EDIT Doppelt gemoppelt

pest
2008-11-28, 19:48:11
Ich habe ein Dreieck (bzw. eine Ebene, ist in dieser Frage egal) im 3 dimensionalen Raum, welches durch die Vektoren AB und AC aufgespannt ist (A, B und C sind gegeben). Zusätzlich habe ich einen Punkt P der auf dieser Ebene aufliegt. Allerdings habe ich von diesem Punkt nur die x und die y Koordinate gegeben d.h. ich muss die z-Koordinate berechnen.


das ist genauso "einfach" wie bei dem Dreieck
der Punkt muss als Linearkombination der beiden Richtungsvektoren + Aufhängepunkt dargestellt werden können

also

P = a * AB + b * AC + A

macht 3 Gleichungen, mit 3 Unbekannten (a,b,P.z)

Kinman
2008-11-28, 20:16:34
Perfekt, danke!

mfg Kinman

EDIT: Somit funktioniert mein z-Buffer :D

pest
2008-11-28, 21:49:11
erklär' mal'n bisschen, weiß nur so ungefähr was ein z-Buffer macht, also schreib mal wie du ihn implementierst
bzw. das geht bestimmt intelligenter ;) :D - nicht bös' gemeint ;)

Kinman
2008-11-28, 22:47:23
Der z-Buffer speichert für jeden gezeichneten Pixel die Tiefeninformation, damit man Objekte, die hinter einem bereits gezeichneten Objekt (bzw. Teilobjekt) nicht vor diesem schreibt.
Am besten Du überfliegst mal diesen Artikel http://de.wikipedia.org/wiki/Z-Buffer

mfg Kinman

pest
2008-11-28, 22:48:52
Der z-Buffer speichert für jeden gezeichneten Pixel die Tiefeninformation, damit man Objekte, die hinter einem bereits gezeichneten Objekt (bzw. Teilobjekt) nicht vor diesem schreibt.


das ist mir schon klar, ich wollte halt wissen, wie du ihn implementierst

Kinman
2008-11-28, 23:04:36
wenn ich das dreieck pixel für pixel zeichne, dann berechne ich nebenher auch den z-Wert des Pixels.



function drawFilledTriangle ($px, $py, $pz, $color, $zBuffer = true)
{
$nodes = count($px);

if ($nodes == 3)
{
$r = substr($color, 0, 2);
$g = substr($color, 2, 2);
$b = substr($color, 4, 2);

//Allocate color
$canvas_color = imagecolorallocate($this->canvas, hexdec($r), hexdec($g), hexdec($b));

//Get smallest and largest x and y
$min_x = $px[0];
$max_x = $px[0];

$min_y = $py[0];
$max_y = $py[0];

for ($i = 1; $i < $nodes; $i++)
{
if ($px[$i] > $max_x) $max_x = $px[$i];
if ($px[$i] < $min_x) $min_x = $px[$i];

if ($py[$i] > $max_y) $max_y = $py[$i];
if ($py[$i] < $min_y) $min_y = $py[$i];
}

$xa = $px[2]-$px[0];
$ya = $py[2]-$py[0];
$za = $pz[2]-$pz[0];

$xb = $px[1]-$px[0];
$yb = $py[1]-$py[0];
$zb = $pz[1]-$pz[0];

for ($y = $min_y; $y <= $max_y; $y++)
{
for ($x = $min_x; $x <= $max_x; $x++)
{
$xq = $x - $px[0];
$yq = $y - $py[0];

$r = (($yb * $xq) - ($xb * $yq)) / (($xa * $yb) - ($xb * $ya));
if ($xb != 0) $s = ($xq - ($r * $xa)) / $xb;
else $s = ($yq - ($r * $ya)) / $yb;

$inTriangle = true;
if (($r + $s) > 1) $inTriangle = false;
if ($r < 0) $inTriangle = false;
if ($s < 0) $inTriangle = false;

if($inTriangle)
{
if ($zBuffer)
{
$b = (($px[0] * $ya) - ($xa * ($py[0] - $y)) - ($x * $ya)) / (($xa * $yb) - ($xb * $ya));
if ($xa != 0) $a = -1 * ((($b * $xb) + ($px[0] - $x)) / $xa);
else $a = -1 * ((($b * $yb) + ($py[0] - $y)) / $ya);
$z = $a * $za + $b * $zb + $pz[0];

if (($this->z_buffer[$x][$y] == false) || ($z <= $this->z_buffer[$x][$y]))
{
$this->z_buffer[$x][$y] = $z;
imagesetpixel ($this->canvas, $x, $y, $canvas_color);
}
}
else imagesetpixel ($this->canvas, $x, $y, $canvas_color);
}
}
}
}

}




Ist aber erst eine "Testimplementation". Darum so wenig kommentare und kaotische Variablenbezeichnung.

mfg Kinman

pest
2008-11-28, 23:21:45
wenn ich das dreieck pixel für pixel zeichne, dann berechne ich nebenher auch den z-Wert des Pixels.


für ne Testimplementation ist das schon ganz ordentlich (y)

spontan würde mir z.B. einfallen, das du, bevor du anfängst Dreiecke auszumalen, die Eckpunkte der Dreiecke nach z-Koord. vorsortierst
das Ausmalen kann man wie gesagt auch verbessern, z.B. über nen Scanline/-Sweep-Verfahren das abhängig von schon errechneten z-Werten Schnittmengen bildet.
ist aber eben auch vom Overdraw abhängig welche Strategie ansonsten optimaler ist

läuft der Rasterizer auch in Software?

danke für den Code, aber ich bin leider nicht mehr so richtig in der Lage das jetzt zu verstehen :D :tongue:
in Worten hätte gereicht ;)

:)

Kinman
2008-11-29, 06:40:35
Da es PHP ist, läuft der Rasterizer nur in Software. Hier muss man alles selbst machen ;)

mfg Kinman

Kinman
2008-12-01, 14:04:05
Leider brauch ich nochmals Hilfe.
Und zwar möchte ich ein Dreieck verzerren. D.h. ich habe die Eckpunkte von Dreieck "Alt" und die Eckpunkte von Dreieck "Neu". Und jetzt möchte ich einen Punkt P in Dreieck Alt zum Punkt P' in Dreieck neu umrechnen.

Für Vierecke hab ich schon etwas gefunden, wobei ich das nicht 100% Versteh: http://www.c-plusplus.de/forum/viewtopic-var-t-is-226947.html

Danke, mfg Kinman

pest
2008-12-01, 14:51:05
die Tranformation unter der das Bild der Eckpunkte entsteht, benutzt du einfach für das Bild des Punktes

du verwendest da ja bestimmt eine affine Tranformation

pest
2008-12-01, 16:40:07
Wenn du natürlich sowas wie Texturemapping machen willst, musst du über die Umkehrtransformation gehen, sonst entstehen "Lücken"

also das transformierte Dreieck Punkt für Punkt durchgehen und schauen,
wo der aktuelle Punkt im Ursprungsdreieck lag.

Kinman
2008-12-02, 09:58:49
Wenn du natürlich sowas wie Texturemapping machen willst, musst du über die Umkehrtransformation gehen, sonst entstehen "Lücken"

also das transformierte Dreieck Punkt für Punkt durchgehen und schauen,
wo der aktuelle Punkt im Ursprungsdreieck lag.

*Hand-an-die-Stirn-klatsch"
Zurückrechnen... Darauf hätt ich selbst auch kommen können ;)
Aber ich habe dabei trotzdem noch ein kleines Problem.
Wie kann man ein Dreieck von 3D Koordinaten auf 2D Koordinaten umrechnen, so al ob ich immer "von vorne" auf das Dreieck sehe?
Natürlich könnte ich die Rotation ausrechnen und das Dreieck projezieren, aber das kommt mir irgendwie ein wenig umständlich vor.

@pest: Ich glaube ich werde, einen Danksagungspunkt in der Signatur erstellen und dich darin anführen....

mfg Kinman

pest
2008-12-02, 12:04:36
Aber ich habe dabei trotzdem noch ein kleines Problem.
Wie kann man ein Dreieck von 3D Koordinaten auf 2D Koordinaten umrechnen, so al ob ich immer "von vorne" auf das Dreieck sehe?
Natürlich könnte ich die Rotation ausrechnen und das Dreieck projezieren, aber das kommt mir irgendwie ein wenig umständlich vor.


Du projezierst doch mittels Zentralprojektion deine 3D Koordinaten auf 2D Koordinaten (damit das räumlich aussieht)?

Unabhängig davon, aber abhängig von deinem Koordinatensystem, lässt du einfach von den 3D-Koordinaten eine Komponente weg
(wahrscheinlich z) und schon hast du eine Draufsicht auf die entsprechende Ebene, glaube ich (mein Gehirn ist gerade sehr weich, habe gerade nen Vortrag gehalten)



@pest: Ich glaube ich werde, einen Danksagungspunkt in der Signatur erstellen und dich darin anführen....


ah, bitte nicht, erstens habe ich keine Ahnung von 3D-Grafik und zweitens wäre mir das ultrapeinlich

Kinman
2008-12-02, 12:18:36
Du projezierst doch mittels Zentralprojektion deine 3D Koordinaten auf 2D Koordinaten (damit das räumlich aussieht)?
Das mache ich. Allerdings ist es dann eigentlich verzerrt. Besser gesagt perspektivisch verzerrt. Ich hätte weiterhin allerdings die Korrekten u und v Koordinaten. (Ich mach gleich mal ein Bild dazu).

Unabhängig davon, aber abhängig von deinem Koordinatensystem, lässt du einfach von den 3D-Koordinaten eine Komponente weg
(wahrscheinlich z) und schon hast du eine Draufsicht auf die entsprechende Ebene, glaube ich (mein Gehirn ist gerade sehr weich, habe gerade nen Vortrag gehalten)

Das war auch mein erster Gedanke. Klappt allerdings so nicht. Ich kann z.B. ein Dreieck haben, welches wie folgt aussieht:

A(0,1,0)
B(0,1,1)
C(0,0,0)

Oder eben total schräg im Raum. Ich möchte allerdings immer eine Draufsicht haben. D.h. mein Blick ist in die Gegenrichtung zur Normalen auf die Ebene.
Somit könnte ich das ganze schon Berechnen. Also im Prinzip wieder eine Projektion, aber ich vermute, dass es viel einfacher geht.

Oder eventuell gibt es einen ganz anderen Ansatz:
Wie Du schon richtig vermutest will ich meine Dreiecke texturieren. Wenn das Dreieck mir zugewandt ist, kann ich es schon korrekt texturieren (UV Mapping), aber wenn es perspektivisch Verzerrt ist, dann hab ich Probleme.
Das erste hast Du mit dem Ansatz "Zurückrechnen" gelöst. D.h. ich gehe jeden Punkt im Dreieck durch und Rechne den Originalen Punkt aus. Geht auch relativ flott, da ich die z-Kompente schon zur verfügung hab, durch den z-Buffer. Somit hab ich X Y Z vom Originalen Dreieck. Und dieses X/Y/Z müsste ich jetzt korrekt auf u & v von der Textur umrechnen. Wenn mein Dreieck zu mir orientiert ist (z ist über alle Punkte gleich), dann funktionierts wunderbar. Aber mit anderen Dreiecken habe ich Probleme.
Ich weiß ehrlich gesagt nicht einmal nach was ich suchen könnte. Alles was man über Texturierung findet behandelt OpenGL und DirectX und kann mir somit nicht weiterhelfen.

mfg Kinman




ah, bitte nicht, erstens habe ich keine Ahnung von 3D-Grafik und zweitens wäre mir das ultrapeinlich
Hehe, wie Du willst. Aber Du hast viel Ahnung von Mathematik, die ich benötige ;)

Coda
2008-12-02, 12:24:58
Ich hab mal ungefähr das gleiche gemacht, vielleicht hilft's ja:
http://www.mental-asylum.de/files2/cube.phps
http://www.mental-asylum.de/cube/cube.php

Kinman
2008-12-02, 12:36:12
Ich hab mal ungefähr das gleiche gemacht, vielleicht hilft's ja:
http://www.mental-asylum.de/files2/cube.phps
http://www.mental-asylum.de/cube/cube.php
Danke, ja, das werde ich mir mal ansehen.

---

Trotzdem hier noch kurz das Bild, welches ich oben versprochen habe:

P1, P2, P3 haben Koordinaten sowohl im xyz-Bereich, sowie im uv-Bereich.
P1', P2', P3' haben nur noch die Koordinaten xy (also wirklich so wie es gezeichnet wird), aber die gleichen Koordinaten im uv Bereich.

mfg Kinman

pest
2008-12-02, 12:54:48
Das war auch mein erster Gedanke. Klappt allerdings so nicht. Ich kann z.B. ein Dreieck haben, welches wie folgt aussieht:

A(0,1,0)
B(0,1,1)
C(0,0,0)

Oder eben total schräg im Raum. Ich möchte allerdings immer eine Draufsicht haben. D.h. mein Blick ist in die Gegenrichtung zur Normalen auf die Ebene.
Somit könnte ich das ganze schon Berechnen. Also im Prinzip wieder eine Projektion, aber ich vermute, dass es viel einfacher geht.


du fragst halt immer nur nach konkreten math. Problemen, und nicht was du wirklich vorhast ;)


Das erste hast Du mit dem Ansatz "Zurückrechnen" gelöst. D.h. ich gehe jeden Punkt im Dreieck durch und Rechne den Originalen Punkt aus. Geht auch relativ flott, da ich die z-Kompente schon zur verfügung hab, durch den z-Buffer. Somit hab ich X Y Z vom Originalen Dreieck. Und dieses X/Y/Z müsste ich jetzt korrekt auf u & v von der Textur umrechnen. Wenn mein Dreieck zu mir orientiert ist (z ist über alle Punkte gleich), dann funktionierts wunderbar. Aber mit anderen Dreiecken habe ich Probleme.


das meine ich nicht mit Zurückrechnen

du hast 3D-Koord. im Raum, diese werden auf 2D-Koordinaten projeziert
das was du dann darstellst ist ja auch nur eine 2D-Fläche und während du die füllst, kannst du durch geschicktes weiterzählen, die Koordinaten in der unverzerrten Fäche rausbekommen

oben habe ich ja schon geschrieben. Jeder Punkt einer Fläche lässt sich als Linearkombination der Fächenvektoren darstellen.
Hast du also das "alpha" und "beta" in der verzerrten Fläche (skalare Vielfache der Richtungsvektoren,GLS ;)), dann nimmst du die einfach um den Punkt innerhalb der unverzerrten Fläche auszurechnen
(natürlich mit anderen Richtungsvektoren)

Ich habe das mal vor 10 Jahren gemacht, vielleicht fällt mir noch ein wie genau ;), aber vielleicht reicht das ja schon :)

ah Coda ist da, ich kann mich verpissen :D

Kinman
2008-12-02, 14:58:20
Wenn ich das richtig verstanden habe, dann rechne ich mit folgender Gleichung

P = a * AB + b * AC + A

Berechne a und b mit den originalen Vektoren. Wenn ich dann den Punkt im verzerrten Dreieck verwenden will, dann berechne ich den Punkt mit den neuen Vektoren, aber mit gleichem a & b?

@Coda:
Ich hab mir das mal angesehen und auch gefunden wo Du die Texturkoordinaten berechnest. Aber wirklich schlau werde ich daraus leider nicht.

mfg Kinman

pest
2008-12-02, 16:29:29
naja fast, ich erklärs dir mal mit dem Würfel, weil es da einfacher ist
die Mathematik kannst du dir wirklich selbst erarbeiten

die Textur ist ein Quadrat einer fixen Auflösung (z.B. 256x256).

um jetzt z.B. den Punkt an Stelle (10,10) zu bekommen,
machst du ja eigentlich P = 10 * (1,0) + 10 *(0,1)

Jetzt hast du einen Würfel den du in den 2D-Raum projizierst.
die Seitenfläche wird aber verzerrt dargestellt, mit Hilfe von neuen (normierten) Richtungsvektoren.

Während du die Seitenfläche füllst, berechnest du die dazu passenden Skalare (a,b) und holst dir den Farbwert aus der Textur mit F = a*(1,0) + b*(0,1)

wie gesagt, die Implementation ist dann noch etwas anders, um nicht mehrmals irgendwas zu berechnen, aber ich hoffe du verstehst das Prinzip.

Kinman
2008-12-02, 16:39:41
Danke, jetzt funktionierts...
Vermutlich werde ich demnächst noch Probleme bei der Schattenberechnung bekommen, aber bis dahin werden sicherlich wieder einige Tage vergehen.

mfg Kinman

pest
2008-12-02, 16:57:34
ich bin einfach nur erstaunt, das das was ich schreibe nicht totaler müll ist :biggrin:

Kinman
2008-12-02, 17:07:15
Darf ich fragen was Du so machst bzw. wo Du das alles gelernt hast?

Btw. jetzt sogar mit "SSAA" (intern einfach in vierfacher Auflösung berechnet)

pest
2008-12-02, 17:12:57
ich würde dir ja empfehlen als nächstes mit Lichtquellen anzufangen,
und dann die Flächen entsprechend einzufärben, das macht bestimmt auch Spaß

Darf ich fragen was Du so machst bzw. wo Du das alles gelernt hast?

die Mathematik? das ist 1. Semester Lineare Algebra
und der Rest interessiert mich einfach, ich studiere eigentlich nur um meinen Werkzeugkoffer weiter aufzufüllen ;)

Kinman
2008-12-02, 17:22:07
ah Ok.
Beleuchtung funktioniert Bereits: Ambient light und direct light. Beliebig viele Lichtquellen und beliebige Lichtfarben und Intensitäten.
Punktförmige Lichtquellen muss ich noch hinzufügen.


die Mathematik? das ist 1. Semester Lineare Algebra
und der Rest interessiert mich einfach, ich studiere eigentlich nur um meinen Werkzeugkoffer weiter aufzufüllen ;)

Nicht schlecht. Ich hab zwar kein Studium, aber 5 Jahre HTL technische Informatik und wird sowas vielleicht einmal am Rande erwähnt. Dafür Differenzieren / Integrieren das volle Programm.
Also im Prinzip wieder die Dinge gelernt die ich nicht brauche...

mfg Kinman

pest
2008-12-02, 17:31:41
ah Ok.
Beleuchtung funktioniert Bereits: Ambient light und direct light. Beliebig viele Lichtquellen und beliebige Lichtfarben und Intensitäten.
Punktförmige Lichtquellen muss ich noch hinzufügen.


das du ambient oder etwas in der richtung implementiert hast, ist mir beim betrachten der bilder, dann auch aufgefallen, lol



Dafür Differenzieren / Integrieren das volle Programm.
Also im Prinzip wieder die Dinge gelernt die ich nicht brauche...


kommt drauf an was du machen willst.
wenn der würfel phsysikalisch korrekt mit anderen würfeln kollidieren soll, könnte das hilfreich sein :D

halt mich auf dem laufenden :)

Coda
2008-12-03, 12:28:40
Wie berechnest du eigentlich die Eckpunkte? Machst du wirklich eine perspektivische Projektion? Und wenn ja korrigierst du dann auch entsprechend die Texturkoordinaten?

Kinman
2008-12-03, 17:44:11
Wie berechnest du eigentlich die Eckpunkte? Machst du wirklich eine perspektivische Projektion? Und wenn ja korrigierst du dann auch entsprechend die Texturkoordinaten?

Die Berechnung läuft im Prinzip so:

$drawPoint_x = $this->canvas_offset_x + ($this->fov_intern * ($point_x / $point_z));
$drawPoint_y = $this->canvas_offset_y + ($this->fov_intern * ($point_y / $point_z));


Ob ich die Texturkoordinaten korrigiere kann ich nichtmal sagen, da ich nicht weiß, was es zu korrigieren geben würde.
Wenn ich das aber mit irgendeinen Beispiel (Karo, Linien, etc.) kontrollieren könnte, dann mach ich das mal und poste das Bild.

mfg Kinman

Coda
2008-12-04, 04:24:53
Wenn du Texturkoordinaten einfach linear interpolierst wenn du eine perspektivische Transformation machst, dann ist deine Texturierung verzerrt.

Deshalb musst du 1/z und jeweils u/z und v/z interpolieren und dann pro Pixel 1/(1/z_interpoliert) rechnen und das mit den interpolierten u/z und v/z multiplizieren, sonst stimmt es nicht.

pest
2008-12-04, 06:32:48
und dann pro Pixel 1/(1/z_interpoliert) rechnen

1/(1/z_interpoliert)=z_interpoliert :confused:

Kinman
2008-12-04, 08:00:38
Wenn du Texturkoordinaten einfach linear interpolierst wenn du eine perspektivische Transformation machst, dann ist deine Texturierung verzerrt.

Deshalb musst du 1/z und jeweils u/z und v/z interpolieren und dann pro Pixel 1/(1/z_interpoliert) rechnen und das mit den interpolierten u/z und v/z multiplizieren, sonst stimmt es nicht.

Achso, davon hab ich zumindest schon was gelesen.
Aber bei läufts etwas anders, da ich nicht interpoliere, sondern auf die Originalkoodinaten zurückrechne. D.h. im Prinzip wird jeder Texel(?) perspektivisch verzerrt.

Ist zwar langsamer, aber ich habs zumindest mal zusammengebracht. Eventuell werde ich diesen Teil nochmals überarbeiten, aber für den eigentlichen Zweck, werde ich vermutlich kaum Texturierung benötigen.

1/(1/z_interpoliert)=z_interpoliert :confused:

http://de.wikipedia.org/wiki/Texturierung#Perspektivenkorrektur


mfg Kinman

pest
2008-12-04, 10:20:03
http://de.wikipedia.org/wiki/Texturierung#Perspektivenkorrektur


der :confused: war nur dafür, das der Doppelbruch nicht viel Sinn macht.

Kinman
2008-12-04, 10:36:33
der :confused: war nur dafür, das der Doppelbruch nicht viel Sinn macht.

Ergeht mir genauso, aber es wird schon etwas dran sein, sonst würde es nicht gemacht werden.

mfg Kinman

Coda
2008-12-04, 14:05:37
Aber bei läufts etwas anders, da ich nicht interpoliere, sondern auf die Originalkoodinaten zurückrechne. D.h. im Prinzip wird jeder Texel(?) perspektivisch verzerrt.
Dann brauchst du das wohl nicht machen. Ist aber wirklich lahm ;)

1/(1/z_interpoliert)=z_interpoliert :confused:
Es ist etwas anderes 1/z linear zu interpolieren und dann pro Pixel den Bruch wieder zu "entfernen" als gleich linear zu interpolieren. Sollte doch klar sein.

pest
2008-12-04, 14:16:49
Es ist etwas anderes 1/z linear zu interpolieren und dann pro Pixel den Bruch wieder zu "entfernen" als gleich linear zu interpolieren. Sollte doch klar sein.

Also (1 / (1/z)_interpoliert) ... wenn man so will

Coda
2008-12-04, 14:53:15
Ja, so ist es wohl klarer.

Wir brauchen hier eindeutig ein LaTeX-Plugin für das VB ;)

pest
2009-05-03, 15:13:31
da ich mich selbst mit was ähnlichem derzeit beschäftige ist mir noch was eingefallen

du machst keine perspektivische projektion, sondern nur eine parallelprojektion
das sieht man erstens wenn man sich deine formel anschaut und zweitens im bild das die höhe der hinten liegenden kanten genauso hoch wie die der vorderen ist.

eine perspektivische projektion ist realistisch im sinne der perspektive, parallel im sinne der darstellenden geometrie

der vorteil ist, das deswegen auch meine vorschläge funktioniert haben :D
schwein gehabt