KollisionQuaderKugel
KollisionQuaderKugel.py — text/python-source, 4 KB (5080 bytes)
Dateiinhalt
#ALLES WAS HIER STEHT WURDE NICHT GETESTET from visual import * def vektorBetrag(v): return ((float)(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]))**(0.5) #** ist Hochrechnen def kreuzprodukt(v1, v2): return (v1[1]*v2[2] - v1[2]*v2[1], v1[2]*v2[0] - v1[0]*v2[2], v1[0]*v2[1] - v[1]*v2[0]) def vektorBetragAnpassen(v, l): vektorbetrag = vektorBetrag(v) x = (v[0] / vektorbetrag) * l y = (v[1] / vektorbetrag) * l z = (v[2] / vektorbetrag) * l return (x, y, z) def vektorAddition(v1, v2): x = v1[0] + v2[0] y = v1[1] + v2[1] z = v1[2] + v2[2] return (x, y, z) def vektorSubtraktion(v1, v2): x = v1[0] - v2[0] y = v1[1] - v2[1] z = v1[2] - v2[2] return (x, y, z) #q = quader def relevantePunkteGebenQuader2(q): axis = vektorBetragAnpassen(q.axis, length / 2) up = vektorBetragAnpassen(q.up, heigth / 2) senkrecht = vektorBetrag(kreuzprodukt(axis, up), widht / 2) liste = [vektorAddition(q.pos, axis), vektorSubtraktion(q.pos, axis)] #Mittelpunkte der Flächen die durch height und width aufgespannt werden #Mittelpunkte der Flächen die durch length und width aufgespannt werden liste.append(vektorAddition(q.pos, up)) liste.append(vektorSubtraktion(q.pos, up)) #Mittelpunkte der Flächen die durch height und length aufgespannt werden liste.append(vektorAddition(q.pos, senkrecht)) liste.append(vektorSubtraktion(q.pos, senkrecht)) #kantenmittelpunkte liste.append(vektorAddition(vektorAddition(q.pos, axis), up)) liste.append(vektorSubtrkation(vektorAddition(q.pos, axis), up)) liste.append(vektorAddition(vektorSubtraktion(q.pos, axis), up)) liste.append(vektorSubtrkation(vektorSubtraktion(q.pos, axis), up)) liste.append(vektorAddition(vektorAddition(q.pos, axis), senkrecht)) liste.append(vektorSubtraktion(vektorAddition(q.pos, axis), senkrecht)) liste.append(vektorAddition(vektorSubtraktion(q.pos, axis), senkrecht)) liste.append(vektorSubtraktion(vektorSubtraktion(q.pos, axis), senkrecht)) liste.append(vektorAddition(vektorAddition(q.pos, up), senkrecht)) liste.append(vektorSubtraktion(vektorAddition(q.pos, up), senkrecht)) liste.append(vektorAddition(vektorSubtraktion(q.pos, up), senkrecht)) liste.append(vektorSubtraktion(vektorSubtraktion(q.pos, up), senkrecht)) #eckpunkte liste.append(vektorAddition(vektorAddition(vektorAddition(q.pos, axis), up), senkrecht)) liste.append(vektorAddition(vektorAddition(vektorSubtraktion(q.pos, axis), up), senkrecht)) liste.append(vektorAddition(vektorSubtraktion(vektorAddition(q.pos, axis), up), senkrecht)) liste.append(vektorAddition(vektorSubtraktion(vektorSubtraktion(q.pos, axis), up), senkrecht)) liste.append(vektorSubtraktion(vektorAddition(vektorAddition(q.pos, axis), up), senkrecht)) liste.append(vektorSubtraktion(vektorAddition(vektorSubtraktion(q.pos, axis), up), senkrecht)) liste.append(vektorSubtraktion(vektorSubtraktion(vektorAddition(q.pos, axis), up), senkrecht)) liste.append(vektorSubtraktion(vektorSubtraktion(vektorSubtraktion(q.pos, axis), up), senkrecht)) return liste #k = kugel, p = punkt, true, bei kollision, false ohne kollision def kollisionPunktKugel(k, p): mp = vektorSubtraktion(k.pos, p) betrag = vektorBetrag(mp) return (betrag <= radius) """ def relevantePunkteGebenQuader(q): axislength = vektorBetrag(q.axis) uplength = vektorBetrag(q.up) #Mittelpunkte der Flächen die durch height und width aufgespannt werden x = q.pos[0] + (q.axis[0] / axislength) * (q.length / 2) y = q.pos[1] + (q.axis[1] / axislength) * (q.length / 2) z = q.pos[2] + (q.axis[2] / axislength) * (q.lenght / 2) liste = [(x, y, z)] x = q.pos[0] - (q.axis[0] / axislength) * (q.length / 2) y = q.pos[1] - (q.axis[1] / axislength) * (q.length / 2) z = q.pos[2] - (q.axis[2] / axislength) * (q.lenght / 2) liste.append((x, y, z)) #Mittelpunkte der Flächen die durch length und width aufgespannt werden x = q.pos[0] + (q.up[0] / uplength) * (q.height / 2) y = q.pos[1] + (q.up[1] / uplength) * (q.height / 2) z = q.pos[2] + (q.up[2] / uplength) * (q.height / 2) liste.append((x, y, z)) x = q.pos[0] - (q.up[0] / uplength) * (q.height / 2) y = q.pos[1] - (q.up[1] / uplength) * (q.height / 2) z = q.pos[2] - (q.up[2] / uplength) * (q.height / 2) liste.append((x, y, z)) #Mittelpunkte der Flächen die durch height und length aufgespannt werden senkrecht = kreuzprodukt(q.axis, q.up) senkrechtlength = vektorBetrag(senkrecht) x = q.pos[0] + (senkrecht[0] / senkrechtlength) * (q.width / 2) y = q.pos[1] + (senkrecht[1] / senkrechtlength) * (q.width / 2) z = q.pos[2] + (senkrecht[2] / senkrechtlength) * (q.width / 2) liste.append((x, y, z)) x = q.pos[0] - (senkrecht[0] / senkrechtlength) * (q.width / 2) y = q.pos[1] - (senkrecht[1] / senkrechtlength) * (q.width / 2) z = q.pos[2] - (senkrecht[2] / senkrechtlength) * (q.width / 2) liste.append((x, y, z)) """ #false ohne Kollision, true bei Kollision def kollisionQuaderKugel(kugel, quader): liste = relevantePunkteGebenQuader2(quader) for i in liste: if kollisionPunktKugel(kugel, i): return true return false