Kollision und die Tücken

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

tft

Betreff: Kollision und die Tücken

BeitragDi, Apr 10, 2007 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ...

Ich habe folgendes gennerelles Problem.

Wenn ich ein 3Ds Object Lade. Und mittels Collission (Kugel/Poli) teste.
Dann bekommen beide Kollidierten Objecte einen Eintrag in der Collisions liste des jeweiligen Objectes.
Ich nutze das. Um ein Object mit hilfer des Collitierten Triangels auszurichten.
Das Funktioniert aber nicht wenn ich ein Mesh selber erzeuge. Weis einer fieleicht woran das liegen kann.
Wenn ich das 3Ds Modell erst Lade. Dann die Meshdaten extrahiere und dann neu erzeuge. Funktioniert es auch nicht.
Das muss also mit der 3ds Lade rutine zusammen hängen.

Also ich komme da nicht weiter ... bitte helfen .
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Apr 10, 2007 22:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe zu meinen 3D-Anfangszeiten folgenden Testcode erstellt. Man sieht oben ein weißen Cube und unten ein aus zwei Triangles erstellten Quad in Blau. Mit der Maus lässt sich die Sphere auf die beiden Objekte beweget und kollidieren. Wie du feststellen wirst, gehts auch auf das eigene Mesh. Vielleicht hast du was übersehen oder sowas...

Code: [AUSKLAPPEN]
Graphics3D 800,600,0,2
SetBuffer BackBuffer()
HidePointer

camera=CreateCamera()
PositionEntity camera,0,200,400
RotateEntity camera,180,0,0

light=CreateLight()
RotateEntity light,-120,0,0

sphere=CreateSphere(16)
ScaleEntity sphere,20,20,20
EntityRadius sphere,20
EntityType sphere,1

mesh=CreateMesh()
brush=CreateBrush(96,96,96)
surface=CreateSurface(mesh,brush)
EntityColor mesh,Rand(0,255),Rand(0,255),Rand(0,255)
v0=AddVertex(surface,+50,400,50)
v1=AddVertex(surface,-50,400,50)
v2=AddVertex(surface,-50,400,-50)
v3=AddVertex(surface,50,400,-50)

AddTriangle(surface,v0,v1,v2)
AddTriangle(surface,v0,v2,v3)
UpdateNormals mesh
EntityType mesh,2

cube=CreateCube()
ScaleEntity cube,40,40,40
PositionEntity cube,0,0,0
EntityType cube,2

Collisions 1,2,2,2




;HAUPTSCHLEIFE
While Not KeyHit(1)

 ;Mauskoordinaten
 mx=MouseXSpeed()
 my=MouseYSpeed()
 MoveMouse 400,300

 MoveEntity sphere,mx,my,0
 UpdateWorld
 RenderWorld

 Text 0,500,"Anzahl Kollisionen:"
 If CountCollisions(sphere) Text 200,500,CountCollisions(sphere)

 Delay 10
 Flip
Wend
End
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

tft

BeitragDi, Apr 10, 2007 22:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi ...

danke für den Code abschnitt. Wie es scheint hast du recht. Ich muss irgendwas anderes falsch machen.
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!
 

Dreamora

BeitragDi, Apr 10, 2007 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Schon mal UpdateNormals aufgefahren?
Ohne Normalen gibts keine Kollision da du mit einem Triangle nur von der Seite kollidieren kannst in welche die Normale zeigt (sprich von "Vorne")
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

tft

BeitragDi, Apr 10, 2007 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi ...

hir mal der Code der mir kopfschmerzen verursacht

Code: [AUSKLAPPEN]

   ; Ausrichtungs Sytem für landung
   mode=0
   If kugelcol>0
      kollision.col=Object.col(kugelcol)
      kolent=EntityCollided (kollision\handler,1)
      
      If kolent>0
         co=CountCollisions(kollision\handler)
         If co>0
            For i = 1 To co
               If ly<0 Then mode=1
               If ly>0 Then mode=2
               If kd200 Or kd208 Or landen=1
                  
                  su=GetSurface(kolent,1)
                  
                  ve=CountVertices(su)
                  tr=CountTriangles(su)
                  
                  cc=CountCollisions(kolent)
                  
                  If cc
                     
                     kst=CollisionTriangle(kolent,1)
                     ksk=CollisionSurface(kolent,1)
                     
                     AlignToTriangle(objcol,kolent,ksk,kst,0.01,mode)
                  Else
                     
                     ;LinePick(EntityX(camp),EntityY(camp),EntityY(camp),EntityX(kolent),EntityY(kolent),EntityY(kolent))
                     ;ksk=PickedSurface ()
                     ;kst=PickedTriangle ()
                     ;AlignToTriangle(objcol,kolent,ksk,kst,0.01,mode)

                     
                  EndIf
               EndIf
            Next
         EndIf
      EndIf
   EndIf


Der sinn des ganzen ....

kollision\handle ist eine Kugel die auf Collision mit Polis getestet wird.
EntityCollid() gibt das Entity zurück mit dem die Kugel Kollidiert ist.
CollisionTriangle(kolent,1) gibt bei 3Ds Objecten das entsprechende Triangel
und bei Selbst gemachten Meshs nicht.
Ich benötige aber das Triangel das mit der Kugel Kollidiert ist. Nicht das Triangle der Kugel.
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!
  • Zuletzt bearbeitet von tft am Di, Apr 10, 2007 23:13, insgesamt einmal bearbeitet
 

Dreamora

BeitragDi, Apr 10, 2007 23:12
Antworten mit Zitat
Benutzer-Profile anzeigen
entitycollided + countcollisions geht glaub nicht, das hebelt sich gegenseitig aus, wenn ich mich net irre.
Aber bitte net drauf festnageln.

Habe jeweils nur CountCollisions genommen, gab keinen Grund dazu, beides zu nehmen wenn du eh durchs count durchloopen musst und EntityCollided auch nix anders machen kann als durchloopen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Silver_Knee

BeitragMi, Apr 11, 2007 11:05
Antworten mit Zitat
Benutzer-Profile anzeigen
die sache ist ein entweder-oder entitycollided gibt nur das letzte objeckt zurück demnach für deine zwecke nicht zu gebrauchen einfach den Code: [AUSKLAPPEN]
      kolent=EntityCollided (kollision\handler,1)
     
      If kolent>0
smamt den endif hinausschmeißen

tft

BeitragMi, Apr 11, 2007 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi ....

machen wir es doch mal anders herum ....

eine Kugel kollidiert mit einer Fläche. Jetzt möchte ich wissen welche Fläche und welches Triangle. Damit ich dieses zum beispiel löschen oder ferändern kann.
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

Shodan

BeitragSo, Apr 15, 2007 21:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Könnte eventuell an EntityBox bzw. EntityRadius liegen. Die Kollisionszone der erstellten Objekte muss vielleicht grössenmässig angepasst werden.
www.selfmadegames.de
 

Dreamora

BeitragSo, Apr 15, 2007 22:07
Antworten mit Zitat
Benutzer-Profile anzeigen
tft hat Folgendes geschrieben:
Hi ....

machen wir es doch mal anders herum ....

eine Kugel kollidiert mit einer Fläche. Jetzt möchte ich wissen welche Fläche und welches Triangle. Damit ich dieses zum beispiel löschen oder ferändern kann.



Löschen: geht nicht musst du Surface rekonstruieren.

Aber prinzipiell:

Den Code dafür hast du ja schon. Nur das du beim Kollisionen durchgehen versuchst explizit zu schauen ob es damit kollidiert.

Heisst:
Loope von 0 bis CountCollisions() -1
Und nutze collisionentity(index) um zu sehen ob es die gewünschte entity ist (was du jetzt mit entity collided machst, was nix anderes macht)
wenn ja dann führst du die restlichen operationen aus.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

tft

BeitragSo, Apr 15, 2007 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo...

das habe ich alles schon versucht. Wenn ich mit 3ds Modellen arbeite funktioniert alles perfekt. Aber bei mit CreateMesh erzeugten Objecten bekomme ich nur eine Info. Nämlich die der Kollidierten Spherer. Keine Infos der Kolision verursachenden Fläche. Habe jetz den Umweg über LinePick genommen . Bei Kollision suche ich nach der nächsten Fläche... das kostet zum glück nicht fiel Zeit.
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!
 

Dreamora

BeitragSo, Apr 15, 2007 23:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie gesagt: Solange du keine Normalen hast, gibt es keine Polygon Kollision.
UpdateNormals rein oder selbst normalen berechnen.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

tft

BeitragMo, Apr 16, 2007 8:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo ...

den Tip mit den Normals habe ich nicht ganz verstanden. Durch anwenden von Update Normals ist keine Besserung zu erziehlen. Und das selber berechnen .... keine ahnung wie das geht. Es macht aber sinn....... denn ich berechne eindeutig keine Normals für die selbst gemachten Meschs.
Für Hilfe wäre ich dankbar.......
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!
 

Dreamora

BeitragMo, Apr 16, 2007 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Es hat im CodeArchiv eine verbesserte UpdateNormals Funktion glaube ich, die wäre ein Ansatz. Weiss nicht ob die bei selbst gebauten Meshes wird.

Ansonsten ist es prinzipiell für Dreiecke v0,v1,v2 so:

tNormal = (v0 - v1) x (v0 - v2) (x ist das kreuzprodukt)
Normal = tNormal / länge(tNormal)


Für die Vertexnormalen, falls du nicht für jedes Dreieck einzelne Vertices erzeugt hast, wirds dann ein wenig aufwändiger.
Dafür müsstest du die Normalen am besten im Dreieck Type speichern.
Danach kannst du dir raussuchen in welchen Dreiecken der Vertex drin ist. Danach addierst du alle Dreiecksnormalen der anliegenden Dreiecke und Skalierst den resultierenden Vektor mit 1 / AnzahlDreiecke

Damit hättest du dann auch die Vertex Normalen.


PS: Grund dafür das es Normalen braucht: Du kannst in Blitz mit einer Fläche nur von vorne kollidieren, nicht jedoch von hinten (selbst wenn du Backface Culling via EntityFX abschaltest, denn das ist ein grafischer, kein geometrischer Effekt!). Wenn es jedoch keine Normale gibt, gibt es auch kein vorne und hinten womit es dann leider auch nicht kollidieren kann.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

tft

BeitragMo, Apr 16, 2007 19:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi ..
danke für die ausfürungen. Wenn ic hdas Pproblem gemeistert habe melde ich mich wieder.
TFT
https://www.sourcemagic.ch
Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!!

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group