Ich habe die Schritte jetzt verstanden, jedoch weiß ich nicht wie man die gleichungssysteme löst :S.
Beiträge von moritz1243
-
-
wäre cool wenn du mir das mal vorrechnen könntest aber benutze dann bitte variabln namen, danke
-
Nein auch nicht wirklich, ein funktionierendes bsp würde mir mehr helfen
-
Ja, aber hilft mir noch nicht wirklich weiter
-
stimmt ich habe mir jetzt diesen artikel zuende durchgelesen, da muss man noch viel umstellen etc. Hier steht was das schein einfacher zu sein:
http://softsurfer.com/Archive/algori…orithm_0105.htmhab was gefunden:
Spoiler anzeigen
[autoit]bool TrimeshFace::intersectLocal( const ray& r, isect& i ) const
[/autoit]
{
// retrieve the vertices
const Vec3d& v0 = parent->vertices[ids[0]];
const Vec3d& v1 = parent->vertices[ids[1]];
const Vec3d& v2 = parent->vertices[ids[2]];
Vec3d e1 = Vec3d(v1[0] - v0[0], v1[1] - v0[1], v1[2] - v0[2]);
Vec3d e2 = Vec3d(v2[0] - v0[0], v2[1] - v0[1], v2[2] - v0[2]);
Vec3d h = Vec3d(r.getDirection()[2] * e2[3] - r.getDirection()[3] * e2[2],
r.getDirection()[3] * e2[1] - r.getDirection()[1] * e2[3],
r.getDirection()[1] * e2[2] - r.getDirection()[2] * e2[1]);
double a = (e1[0] * h[0]) + (e1[1] * h[1]) + (e1[2] * h[2]);
if (a > -0.00001 && a < 0.00001)
return false;
double f = 1/a;
Vec3d s = Vec3d(r.getPosition()[2] * v0[3] - r.getPosition()[3] * v0[2],
r.getPosition()[3] * v0[1] - r.getPosition()[1] * v0[3],
r.getPosition()[1] * v0[2] - r.getPosition()[2] * v0[1]);
double u = f * ((s[0] * h[0]) + (s[1] * h[1]) + (s[2] * h[2]));
if (u < 0.0 u > 1.0) {
return false;
}
Vec3d q = Vec3d(s[2] * e1[3] - s[3] * e1[2],
s[3] * e1[1] - s[1] * e1[3],
s[1] * e1[2] - s[2]* e1[1]);
double v = f * ((r.getDirection()[0] * q[0]) +
(r.getDirection()[1] * q[1]) +
(r.getDirection()[2] * q[2]));
if (v < 0.0 u + v > 1.0)
return false;
// at this stage we can compute t to find out where
// the intersection point is on the line
double t = f * ((e2[0] * q[0]) + (e2[1] * q[1]) + (e2[2] * q[2]));
if (t > 0.00001) // ray intersection
{
i.obj = this;
i.t = t;
i.N = Vec3d(e1[2] * e2[3] - e1[3] * e2[2],
e1[3] * e2[1] - e1[1] * e2[3],
e1[1] * e2[2] - e1[2]* e2[1]);;
return true;
}hier noch besser das letzt bei opimasation:
http://www.devmaster.net/wiki/Ray-triangle_intersection -
Mmh mit dem gaußschen Eliminationsverfahren könnte man das lösen jedoch versteh ich es noch nicht richtig
-
Naja sagen wir mal so, ich kann das was ich kann sehr gut, aber der sprung von 2 zu 3d ist doch enorm. Ich schreibe gerade an einer kleinen biblihothek, vekotren sind schon enthalten, und matrixen und ebenen auch(zwar nur translationen und rotationen aber noch nicht mehr ). Deshalb wollte ich jetzt noch die kollisionen berechnen können. Aber das ist schonmal gut.
Wäre super wenn du restlichen schritte auch noch "verbeispielen" könntest
Mit der Geradengleichung meinst du: Kollisionspunkt(x,y,z) = StartpunktdesStrahl(_, _, _,) + VektordesStrahl(_, _, _)*t?
Achja nochwas, wie berechen ich den ob die Position in dreieck ist?
-
Ne leider nicht wirklich, ich habe auch schon viel gegooglt, aber irgendwie nichts brauchbares gefunden.
-
Hallo zusammen,
ist irgendjemand so gut in Mathe das er mir helfen kann, die Kollision von einem Strahl mit einem Dreieck im 3D Raum zu berechnen bzw eine funktion zu schreiben. Die Eingangsparameter sind die 3 Koordinaten Punkte des Dreicks(A,B,C). Sowie ein Strahl bestehend aus einem Startpunkt (P) und einem Vektor(V)?
Danke
-
genau, das ist der letzte wert bei jedem objekt
-
hi
Ja das ist die Stoßzahl, sie gibt an ob ob der stoß komplett (Wert = 1) oder nur halb (Wert = 0.5) etc. übertragen wird
-
hi,
du musst noch machen das das spielen die ergebnisse überprüft über internet. Ich weiß das klingt kompliziert würde das spiel aber stark aufwerten^^, sonst schöne idee.
grüße Moritz
-
HI,
mmh eigentlich schon, jedoch arbeite ich nicht mehr soviel mit autoit sondern fast ausschließlich nurnoch mit c++ vielleicht schriebe ich das script in c++ mal neu oder mal schauen
grüße Moritz
-
@tkaus! hast du den fehler mal in berichtig? - wenn ja kannste mir das script mal schicken, dann muss ich es nicht extra nochmalberichtigen???
-
Nee das ist nicht gewollt und sollte gefixed werden
-
Hi,
die Funktionen zum erstellen der Körper sind folgende:
Func Kugel_erstellen($Center_x, $Center_y, $Radius, $Vektor_x, $Vektor_y, $Omega, $Masse, $Flaechentraegheitsmoment, $Stoszzahl, $Farbe, $Texture)
Func Koerper_erstellen($Punkte, $Center_x, $Center_y, $Vektor_x, $Vektor_y, $Winkel, $Omega, $Masse, $Flaechentraegheitsmoment, $Stoszzahl, $Farbe, $Texture)$Punkte: ist ein array mit 8 Elementen die jeweil die Form des Körpers bestimmen $Punkte[8] = [x,y, x,y, x,y, x,y]
$Center_x/y ist die Koordinate wo der Körper startet
$Vektor_x/y ist die Geschwindigkeit des Körpers beim start in x/y richtung
$Winkel ist der start winkel des Körpers
$Omega ist die Rotationsgeschwindigkeit die der Körper beim start hat
$Masse = Masse
$Flachenträgheitsmoment ist wie leicht oder schwer sich der Körper drehen lässt
$Stoszzahl ist der Anteil der Energie, der bei einem stoß Ubertragen wird bzw erhalten bleibt.
$Farbe braucht man nicht da die Körper seit Version 0.5 Texturen haben.
$Texture ist halt der Pointer zur TextureHoffe das hilft dir
grüße Moritz
-
Naja ich arbeite leider nicht mehr so oft mit autoit, ich hab mir mittlerweile c++ angeeignet. Ich habe die Physik-Engine auch mittlerweile in in c++ neu geschrieben und die fehler die bekannt sind bzw andere mit den array behoben(ist in c++ mit klassen eigentlich viel einfach und komfortabeler als mit autoit, wenn man es erstmal verstanden hat);
grüße Moritz
-
Stimmt Flipper ist ne gut idee
-
Respekt, sieht richtig gut aus. Das mit dem Fluchtpunkt bekommste auch noch hin
grüße Moritz
-
vielen Dank,
mich würde mal interessieren ob schon jemand die physik-engine für ein spiel, wie zum beispiel Angry Bird(Ipod) benutzt hat?
grüße Moritz