Hi Wolfi,
nunja, es gibt mehrere Möglichkeiten das herauszufinden. Wenn du deine Wände so gestellt hast das ihre Kanten parallel zu den Achsen stehen, dann brauchst du nur herausfinden ob dein Ray (der Strahl den du angeklickt hast) für diesen Bereich definiert ist. Das ist leicht, denn du kannst die Vektorgleichen g=p1 + s*(p2-p1) ganz einfach aufstellen. In etwa müsste das so aussehen:
RV=Richtungsvektor, tn=trifft nicht
wenn RV.x <> 0
dann für welche s geht die gerade durch den x-Bereich deiner Wand
sonst wenn RV.x im x-Bereich dann weiter sonst ->tn
wenn RV.y <> 0
dann für welche s geht die gerade duch den y-Bereich ... bla bla bla
so wenn jetzt alle s-Bereiche sich überlappen dann hat dein Strahl getroffen (Strahl-Box-Kollision)
das nächste wäre wenn du deine Wände oder Objekte allgemein mit "Kugeln" füllst. Du brauchst für jede Kugel nur Mittelpunkt und Radius wissen, du musst sie nichtmal anzeigen, sie sind nur gedachte Volumen für unsere Berechnung. Natürlich hab ich auch dafür wieder eine schöne Funktion geschrieben:
Function AbstandPG(p1, p2, p3, g1, g2, g3, a1, a2, a3) As Double
Dim r, d1, d2, d3, d
r = (a1 * (p1 - g1) + a2 * (p2 - g2) + a3 * (p3 - g3)) / (a1 * a1 + a2 * a2 + _
a3 * a3)
d1 = g1 + r * a1 - p1
d2 = g2 + r * a2 - p2
d3 = g3 + r * a3 - p3
d = Sqr(d1 * d1 + d2 * d2 + d3 * d3)
AbstandPG = CDbl(d)
End Function sie berechnet den minimalen Abstand zwischen einem Punkt und einer Geraden. ganz simpel zu benutzen: p ist dein Punkt,g der Ortsvektor deiner Geraden und a der Richtungsvektor und 1,2 und 3 sind nur Platzhalter für x,y,z.
So wofür das ganze? Du kontrollierst alle Kugeln und wenn bei einer der Radius kleiner ist als der Abstand des Mittelpunktes zum Strahl dann hast du getroffen.
Und natürlich gibt es noch die professionelle Ebenen-Strahl-Kollisions-Erkennung. Nunja, das kann ich nur theoretisch erklären da ich es noch nie genutzt hab: Man stellt für die Oberflächen deiner Wände jeweils die Ebenegleichung auf (die normale und ihr ortsvektor) und kontrolliert wo der Strahl die Ebene trifft. Jetzt müsstest du deine Oberfläche dreiecksweise kontrollieren ob der Punkt darin liegt.
SO und wie bekomme ich jetzt die Kollsion mit einem Dreieck raus? Dafür gibt es viele Formeln, aber ich find folgendes am einfachsten:
wenn man den Punkt auf der Ebene des Dreiecks hat, verlängert man ihn zu einer Geraden mit einem Eckpunkt von dem Dreieck. Die restlichen beiden Punkte verbindet man auch zu einer Geraden. Nun berechnet man den Schnittpunkt der beiden Geraden. wenn nun dieser Schnittpunkt auf der 2. geraden zwischen den zwei Punkten liegt, und der Kontrollpunkt auch zwischen dem Schnittpunkt und dem dritten Eckpunkt , dann liegt der Punkt IM Dreieck.
Das klingt ziemlich kompliziert, ist aber für den Rechner sehr schnell berechnet, da keine Wurzeln oder andere rechenintensive Operationen benötigt werden.
Yo, das wäre ja glatt ein zweites Tutorial^^
naja, schönen Tag noch, ich hoffe die Antwort reicht
MfG Weltraumputze
..oO°*Kondome schützen nicht vor Geschlechtsverkehr*°Oo..
Alles was man zur DirectX8 Programmierung braucht
Visual Basic auf USB-Stick |