Einfalls- = Ausfallswinkel am Kreis
Übersicht

Mr HoppBetreff: Einfalls- = Ausfallswinkel am Kreis |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi!
Weiß jemand, wie man Einfalls- = Ausfallswinkel an einer Rundung machen kann? Ich habe ein Image, welches wie eine Schablone das Spielfeld begrenzt, stößt nun der Ball an eine Bande....wie berechne ich den neuen winkel? ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn du anstelle des Images eine Vekorisierung der Kannten vornimmst, könnte man auch den Winkel ausrechnen. Aber so?!? Falls du B3D haben solltest, dann kann man es da auch ganz einfach machen... | ||
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
lol ![]() |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hmmm, nagut. Hier mal ein Ausschnitt meines aktuellen Projektes:
Code: [AUSKLAPPEN] a) If CountCollisions(schiff)>0 Then
b) nx#=CollisionNX(schiff,1) c) ny#=CollisionNY(schiff,1) d) w1=ATan2(yg,xg) e) w2=ATan2(ny,nx) f) w3=180+(w2*2)-w1 g) speed#=Sqr(xg^2+yg^2)/2 h) xg=Cos(w3)*speed i) yg=Sin(w3)*speed j) xp=xpa k) yp=ypa l) End If a) Wenn Kollision, dann soll neuer Ausstrittswinkel berechnet werden. b) +c) Kollisionskoordinate relativ vom Bezugspunkt. d) Rechnet aus der Schiffsgeschwinigkeit (xg, yg) den Flugwinkel aus =w1. e) Rechnet aus der Relation Bezugspunkt/Kollisionskoordinate den Winkel aus =w2. f) Hier wird aus w1 und w2 der neue Flugwinkel berechnet =w3. g) Rechnet die vorherige Geschwindigkeit ala pythagoras aus und halbiert sie (Abprallwiederstand) =speed. h) +i) Rechnet die neue Fluggeschwindigkeit (xg, yg) aus und setzt sie auch gleich zur 'Runtimeverarbeitung'. j) +k) Setzt das Schiff an eine Position, bevor es eine Kollision gab. l) Ende der Geschichte. Dieses ist aber (wie man auch schon an den Befehlen sehen kann) nur für B3D als 2D Behandlung. Ob es einen kürzeren Weg zur Berechnung gibt, weiß ich nicht. Für 2D müsste eventuell unter 'f)' nicht 180+ sondern vielleicht 90+ stehen, je nachdem wie die Winkel der Vektorlinien ausgelesen werden. Das oben genannte Beispiel ist vergleichbar mit der Grafik des Spieles 'Soldat' (oder wie auch immer es heissen mag)... |
||
![]() |
x-pressive |
![]() Antworten mit Zitat ![]() |
---|---|---|
Interessant -die Umsetzung in 3D ist eigentlich gar nicht so kompliziert. 2D wäre wohl schwieriger, da man hier kein Modell zur Hand hat und die Vektoren ja irgendwie "editieren" oder erstellen muss.
Was mich nämlich schon seit Worms interessiert: könnte man denn z.B. für ein 2D-Spiel anhand einer schwarz-weissen "Schablone" der Landschaft (Landschaft = weisse Flächen, Hintergrund = schwarz) eine automatische Vektorisierung vornehmen, um dann das "Vektorbild" auf Kollisionen zu prüfen, anstatt direkt auf Pixel zu checken? So könnte man z.B. auch ein nettes Pinball-Programm etc. schreiben. |
||
• BLITZ SHOWCASE:
PARTICLE CANDY • PARTICLE CANDY FOR iPHONE • SPRITE CANDY • DON'T GET ANGRY! 2-3 • CLICK CLACK XL |
Mr Hopp |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Sorry, aber "Vektoren" sagen mir leider gar nichts ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vektoren sind Bezugspunkte in einem Koordinatensystem. Man rechnet nur anhand eines Koordinatensystems zB in 2D oder auch 3D... Wenn man Vektorgrafiken zeichnen möchte, so muß jede Start- und Endposition einer Linie oder einer Kurve angegeben werden (zB x1=100, y1=10, x2=400, y2=340). Also so wie mit 'Line 100,10,400,340' <--- auch eine Vektordarstellung. Da man die Koordinaten der Start- und Endpositionen kennt, kann man anhand dieser den Winkel des Vektors ausrechnen. In 2D ist allerdings das Problem, daß man recht aufwändig eine Vektorkollision ausrechnen muß. In 3D dagegen, kann man sich die 3D-Engine zu nutze ziehen und mit 3D schöne 2D Grafiken zeichnen... Eine aufwändige Kollisionsabfrage entfällt, genauso wie das aufwendige berechnen des Kollisionswinkels...
Siehe dazu auch: http://de.wikipedia.org/wiki/Vektor |
||
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
zum Thema Vektorisieren:
Habe hier mal was gebastelt, wo ein Ball von einem Pixelbild abprallt. Dazu werden bei einer Kollision einfach eine Reihe Pixel in Flugrichtung "abgeschossen" und bei einem Treffer mit der Wand deren Position gespeichert. Daraus wird dann der Winkel errechnet. Ist aber noch nicht ganz ausgereift: www.mein-murks.de/quellcode/testkoll.zip |
||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
![]() |
Spikespine |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi,
hab mal einen Code geschrieben ganz ohne Vektorisieren und Krams. Bin mir jezt aber gar nicht mehr sicher ob es völlig korrekt ist, sieht für mich auf jedenfall so aus! Code: [AUSKLAPPEN] Graphics 800,600,32,2
;Mittelpunkt des Spielfeldkreises Const Kreis_MX = 400 Const Kreis_MY = 300 ;Radius: Const Kreis_r = 200 Kreis_Image = CreateImage(Kreis_r*2,Kreis_r*2) SetBuffer ImageBuffer(Kreis_Image) Oval 0,0,Kreis_r*2,Kreis_r*2,0 MidHandle Kreis_Image Ball_Image = CreateImage(10,10) SetBuffer ImageBuffer(Ball_Image) Oval 0,0,10,10 MidHandle Ball_Image ball_x# = 500 ball_y# = 300 ball_richtung# = 90;Grad ball_v# = 3.0 ;Geschwindigkeit SetBuffer BackBuffer() Repeat Cls ball_x# = ball_x# + Cos(ball_richtung) * ball_v# ball_y# = ball_y# - Sin(ball_richtung) * ball_v# If ImagesCollide(Ball_Image,ball_x#,ball_y#,0,Kreis_Image,Kreis_MX,Kreis_MY,0) Then wa# = (ATan2(ball_x#-Kreis_MX,ball_y#-Kreis_MY)+360) Mod 360 Local bnr# = 2*(wa#+180)-ball_richtung ball_richtung# = bnr EndIf DrawImage Ball_Image,ball_x#,ball_y# DrawImage Kreis_Image,Kreis_MX,Kreis_MY Flip Until KeyHit(1) End |
||
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
@BIG BUG, dein Code ist, bis auf sehr selten auftrettenden Fehlberechnungen, sehr gut. Super Leistung. Daraus kann man schon ein sinnvolles Spiel mit aufbauen.
@Spikespine, dein Code funktioniert leider nur in einem Kreis. Schon die Änderung zu einem Oval wird es nicht mehr richtig berechnet. Hätte noch eine mögliche Idee zur Problemlösung. Man könnte auch ein Image nehmen und für jeden 2er Grad-Schritt eine andere Farbe an der Kante legen. Dieses Bild müsste natürlich vorberechnet werden und separat behandelt werden. Wenn ein Objekt dann mit einem Bild kollidiert, wird dann die Farbe ermittelt und daraus der Winkel ausgelesen. zB Farbe 0 = 0°, Farbe 128 = 180°, Farbe 255 = 358°... Die Lösung von BIG BUG ist aber sicherlich besser und professioneller. |
||
![]() |
Spikespine |
![]() Antworten mit Zitat ![]() |
---|---|---|
edit...
Doch, in der überschrift steht Kreis!! |
||
Athlon 64 3700+ | 1024 MB RAM | GeForce 7900 GT | Blitz2D, Blitz3D, BlitzPlus, BlitzMax |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group