Links und Funktionen
Sprachumschaltung

Navigationspfad
Sie sind hier: Startseite / Probestudium / 2011 / WS I: 3D-Programmierung / Arbeitsgruppen / baer / KollisionQuaderKugel


Inhaltsbereich

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

Funktionsleiste