zwei kugeln mit einer "stange" verbinden ?
-
ja, ich weis, dass der titel zweideutig ist, ich möchte aber über etwas trockenere deutung dieser aussage sprechen

nunja ich habe es jetzt hinbekommen, einen ball physikalisch relativ korrekt zu bewegen und an pixeln abprallen zu lassen. Jetzt würde ich daraus gerne ein spiel im stil dieser ganzen cross-biking 2d-onlinespiele zu basteln. dafür müssen die kugeln aber miteinander (oder durch einen motoradrahmen) verbunden werden. nunja, die beiden kugeln durch eine art gummiband zu verbinden ist leicht, aber eine fixe verbindung herzustellen gestaltet sich als schwieriger.
ich poste hier mal die aktuelle "moveBall" funktion:void moveBall(ball *toMove) { //Ballkram toMove->bVek = addVek(toMove->bVek, gravity); double cx = 0; double cy = 0; double toGo = toMove->bVek.len; double d; DblPoint apv; int dbgbreak = 0; double umfang; double cAngle; double step; bool rhit; bool hit; while(toGo > 0/* && dbgbreak < 100*/ && toMove->move) { dbgbreak++; cx += toMove->bVek.dir.x; cy += toMove->bVek.dir.y; toGo--; hit = 0; apv.x = 0; apv.y = 0; rhit = false; hit = false; POINT ballCenter; ballCenter.x = (int)toMove->bVek.pos.x + (int)cx; ballCenter.y = (int)toMove->bVek.pos.y + (int)cy; for(int i = (toMove->radius*-1); i <= toMove->radius && !hit; i++) { for(int j = toMove->radius*-1; j <= toMove->radius && !hit; j++) { d = sqrt(i*i+j*j); if(d < toMove->radius) { if(cMap.collisionMap[(int)toMove->bVek.pos.x+(int)cx+i][(int)toMove->bVek.pos.y+(int)cy+j]) { hit = true; umfang = (toMove->radius)*2*PI; step = 360/(umfang); int breaker = 0; double rad = atan2(toMove->bVek.dir.x*-1, toMove->bVek.dir.y*-1); double degree = rad*(180/PI); double cRad; double xd; double yd; int xdir; int ydir; for(cAngle = degree; rhit == false && breaker < umfang; cAngle += step) { cRad = (PI/180)*(cAngle); xd = sin(cRad); yd = cos(cRad); xdir = (toMove->radius)*xd; ydir = (toMove->radius)*yd; if(cMap.collisionMap[ballCenter.x+xdir][ballCenter.y+ydir]) { rhit = true; apv.x += xd; apv.y += yd; } // breaker++; } breaker = 0; rhit = false; for(cAngle = degree; rhit == false && breaker < umfang; cAngle -= step) { cRad = (PI/180)*(cAngle); xd = sin(cRad); yd = cos(cRad); xdir = (toMove->radius)*xd; ydir = (toMove->radius)*yd; if(cMap.collisionMap[ballCenter.x+xdir][ballCenter.y+ydir]) { rhit = true; apv.x += xd; apv.y += yd; } //breaker++; } } } } } if(hit) { //MessageBox(0,"","",0); cx -= toMove->bVek.dir.x; cy -= toMove->bVek.dir.y; apv.x /= 2; apv.y /= 2; double tx = toMove->bVek.dir.x*toMove->bVek.len; double ty = toMove->bVek.dir.y*toMove->bVek.len; double projektion = apv.x*tx + apv.y*ty; toMove->bVek.pos.x -= apv.x; toMove->bVek.pos.y -= apv.y; tx -= apv.x*(projektion*2); ty -= apv.y*(projektion*2); double para = apv.x*tx + apv.y*ty; double orto = apv.y*tx + (apv.x*-1)*ty; para *= 0.7; orto *= 1; DblPoint parav; parav.x = para*apv.x; parav.y = para*apv.y; DblPoint ortov; ortov.x = orto*apv.y; ortov.y = orto*(apv.x*-1); DblPoint newV; newV.x = parav.x + ortov.x; newV.y = parav.y + ortov.y; double vlen = sqrt(newV.x*newV.x + newV.y*newV.y); toMove->bVek.dir.x = newV.x/vlen; toMove->bVek.dir.y = newV.y/vlen; toMove->bVek.len = vlen; } } toMove->bVek.len *= 0.998; toMove->bVek.pos.x += cx; toMove->bVek.pos.y += cy; }wär toll wenn mir jemand helfen könnte

-
ich schätze dir gehts net darum wie man die stange bastelt sondern wie das dann physikalisch aussieht?
-
GreyHound schrieb:
ich schätze dir gehts net darum wie man die stange bastelt sondern wie das dann physikalisch aussieht?
die "stange" ist nur die visualisierung des physikalischen verbindung, ja.
wie man die zeichnet ist mir schon klar
ich weis nur nicht, wie ich das physikalisch berechne. ich hab mir mehrere varianten überlegt, aber alle sind sehr unsauber. z.B. hab ich überlegt, dass man den jeweiligen ball erstmal normal bewegen könnte, und nach der bewegung schaut wie weit der ball jetzt von dem anderen entfernt ist. dann nimmt man die distanz als vektor, bewegt den aktuellen ball um diese differenz (so dass er wieder in korrekter distanz zu dem anderen ball ist) und addiert sie gleichzeitig auf den bewegungsvektor des anderen balls, um die schub/zugkraft zu simulieren. in dem fall aber wirkt dabei keine kraft auf den aktuellen ball, was ja auch wieder falsch ist usw.
-
Bei den Crossbike spielen wird das glaube ich folgendermaßen gemacht:
Nur eine Kugel bestimmt die Flugbahn und die andere wird in einem konstanten Abstand mitgeführt. Je nach dem wieviel Gas du gibst rotiert die Kugel um die andere.
Immer die Kugel welche zuletzt den Boden berührt hat Bestimmt je nach aufprall winkel und Geschwindigkeitsvektor die Flugbahn.ich denk mal noch über Alternativen nach...
muli