Abprallwinkel im 3D-Raum [ist erledigt]

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Nescio

Betreff: Abprallwinkel im 3D-Raum [ist erledigt]

BeitragDo, Dez 14, 2006 17:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich habe folgende Situation:

Ich hab einen großen Würfel und
eine Kugel. (Alles in 3D)

Jetzt möchte ich, dass sich die Kugel im Würfel bewegt und an den Wänden abprallt. Allerdings ohne 3 speed-variablen, damit ich weiter MoveEntity verwenden kann.

Daraus ergeben sich jetzt mehrere Probleme:

1.) Wie testen, an welcher Wand die Kugel ist (Kollision oder Koordinaten prüfen?)

2.) Wie muss man die Kugel dann drehen ?

Ich würde gern bei Befehlen wie MoveEntity und TurnEntity bleiben (also nicht x=x+xspeed und das PositionEntity).

Ich hab leider bei der Suche (noch) nichts vernünftiges gefunden zu dem Thema. Aber ich werde weiter suchen.

Danke für Hilfe jeder Art
Quod est faciendum? Nescio!
  • Zuletzt bearbeitet von Nescio am Fr, Dez 15, 2006 20:37, insgesamt einmal bearbeitet

Xaron

BeitragDo, Dez 14, 2006 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Das wird dann recht schnell komplex. Am einfachsten (und wohl auch am realistischsten) für Dich wäre es wohl, das ganze eine Physik-Engine wie Tokamak oder Newton machen zu lassen.

Gruß - Xaron
Cerberus X - Monkey X Reloaded!

5k41

BeitragDo, Dez 14, 2006 18:08
Antworten mit Zitat
Benutzer-Profile anzeigen
anhand den Punkten der Kollision und dem Mittelpunkt des Objektes sollte es sich doch eigentlich relativ leicht berechnen lassen oder nicht?
Projekte:
For a better World - Gesellschaftsspiel ( 100%)

User posted image

FireballFlame

BeitragDo, Dez 14, 2006 20:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn der Würfel immer "gerade steht" (also so gedreht, wie bei der Erstellung), ginge es so:

Code: [AUSKLAPPEN]

MoveEntity kugel,xspeed,yspeed,zspeed

If EntityX(kugel) < EntityX(wuerfel) - wuerfelkantenlaenge/2 + kugelradius xspeed=-xspeed
If EntityX(kugel) > EntityX(wuerfel) + wuerfelkantenlaenge/2 - kugelradius xspeed=-xspeed
If EntityY(kugel) < EntityY(wuerfel) - wuerfelkantenlaenge/2 + kugelradius yspeed=-yspeed
If EntityY(kugel) > EntityY(wuerfel) + wuerfelkantenlaenge/2 - kugelradius yspeed=-yspeed
If EntityZ(kugel) < EntityZ(wuerfel) - wuerfelkantenlaenge/2 + kugelradius zspeed=-zspeed
If EntityZ(kugel) > EntityZ(wuerfel) + wuerfelkantenlaenge/2 - kugelradius zspeed=-zspeed


Dann hättest du trotzdem 3 Speed-Variablen Wink
Aber es wird nur das Vorzeichen geändert...

Wenn sich der Würfel aber auch noch drehen soll, wirst du um ein paar mehr Variablen aber nicht herumkommen...
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Nescio

BeitragFr, Dez 15, 2006 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke schonmal für die Antworten. Aber ich glaub, mit ner Physik-Engine wird das zu komplex, ich wollte lieber irgendne einfache Formel (sogar ohne Schwerkraft). Und speed-Variablen wollt ich nicht, weils dann aussieht, als ob sich der Ball schneller oder langsamer bewegt.

Ich bin jetzt grad was am testen mit Winkeln (also Pitch, Yaw und Roll). Da müsste sich doch was tun lassen. Meld mich, wenn ich Erfolg hab.
Quod est faciendum? Nescio!

Xaron

BeitragFr, Dez 15, 2006 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm... gerade _mit_ einer Physik-Engine bleibt es doch einfach!

Gruß - Xaron
Cerberus X - Monkey X Reloaded!

Nescio

BeitragFr, Dez 15, 2006 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, aber dann muss man erst noch eine DLL einbinden usw. (nix jetzt gegen dich oder gegen Physik-Engines)

Ich wollte eigentlich nur ein paar kurze Formeln wie z.B.
Code: [AUSKLAPPEN]
If x<-9.5 then pitch=pitch+90


Die Formel stimmt jetzt nicht, aber es muss doch solche Formeln geben (Ich bin auf der Suche).
Es soll einfaches "Einfallswinkel gleich Ausfallswinkel" gelten und der Würfel bleibt auch Lokal.

Danke für eure Hilfe weiterhin.

*************EDIT*********************

OK, ICH HAB DIE LÖSUNG:
Code: [AUSKLAPPEN]
Graphics3D 1024,768,0,2
SetBuffer BackBuffer()

SeedRnd MilliSecs()

Global yaw_x_korrekt,yaw_z_korrekt

Global kugel=CreateSphere()
EntityColor kugel,255,0,0
ScaleEntity kugel,0.5,0.5,0.5
EntityFX kugel,1
TurnEntity kugel,-50,30,0

cube=CreateCube()
EntityColor cube,0,127,255
ScaleEntity cube,10,10,10
EntityFX cube,17
EntityAlpha cube,0.3


cam=CreateCamera()
PositionEntity cam,15,15,-15
PointEntity cam,kugel

Repeat

   Kugelbewegen()
;   PointEntity cam,kugel
   
   Cls
   
   RenderWorld
   
   Flip

Until KeyHit(1)
End

Function Kugelbewegen()
   
   x#=EntityX(Kugel)
   y#=EntityY(Kugel)
   z#=EntityZ(Kugel)
   
   pitch#=EntityPitch#(Kugel)
   yaw#=EntityYaw#(Kugel)
   
   If x>-9.5 And x<9.5 Then yaw_x_korrekt=0
   If z>-9.5 And z<9.5 Then yaw_z_korrekt=0
   
   If yaw_x_korrekt=0 Then If x<-9.5 Or x>9.5 Then yaw=-yaw : yaw_x_korrekt=1
   If yaw_z_korrekt=0 Then If z<-9.5 Or z>9.5 Then yaw=180-yaw : yaw_z_korrekt=1
   If y<-9.5 Or y>9.5 Then pitch=-pitch
   
   RotateEntity kugel,pitch,yaw,0
   
   MoveEntity Kugel,0,0,0.4
   
   
End Function


Das wichtigste ist die Funktion Kugelbewegen() !!

So, danke, ich glaub, das war's.

THX
Quod est faciendum? Nescio!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group