Kollision und die Tücken
Übersicht

![]() |
tftBetreff: Kollision und die Tücken |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 !!!!!! |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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)
smamt den endif hinausschmeißen
If kolent>0 |
||
![]() |
tft |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Könnte eventuell an EntityBox bzw. EntityRadius liegen. Die Kollisionszone der erstellten Objekte muss vielleicht grössenmässig angepasst werden. | ||
www.selfmadegames.de |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 !!!!!! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group