Collisions Reaktionen

Übersicht BlitzBasic Blitz3D

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.

rctuner

Betreff: Collisions Reaktionen

BeitragDi, Sep 19, 2006 13:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Für Kollision gibt es nur 3 Reaktionen, kann ich irgendwie einstellen dass einfach nichts passiert wenn zwei objekte sich berühren?

Also dass ich mit hilfe von EntityCollided zwar herausbekomme wenn sie sich schneiden, jedoch einfach nix passiert und sie durch sich durch fliegen.

Reaktion = Was soll bei einer Kollision passieren:
1=stopen
2=sliden (normal)
3=sliden (nur raufsliden)
[Y[our Film, Game ]M[akers and more [F]un!
www.Master-Entertainment.de.vu

[AMD 6000+ X2 @ 6400+][2GB RAM][NVidia 8800GT 512 MB]
 

Dreamora

BeitragDi, Sep 19, 2006 13:57
Antworten mit Zitat
Benutzer-Profile anzeigen
ResetEntity könnte da eventuell funktionieren.

Allerdings kannst du, wenn du eh keine Reaktion willst (Polygonkollision zwischen bewegten Objekten geht net ausser meshIntersect), auch einfach mathematisch überprüfen ob sie sich schneiden.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

rctuner

BeitragDi, Sep 19, 2006 14:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit ResetEntity hats leider nicht geklappt.

Ich brauch das für meine ChaseCam. Wenn man den Character zb. hinter eine Tür steuert und die Kamera die Wand berührt, sie einfach nach vorne zum Character geschoben wird.

Eigendlich wie in jedem Third Person Shooter.

Im Castle (Mario) Beispiel gibt es auch so eine Kamera, nur versteh ich den Code irgendwie nicht.

Hat jemand ein einzellnes Beispiel, in dem es nur um die Kamera geht?
[Y[our Film, Game ]M[akers and more [F]un!
www.Master-Entertainment.de.vu

[AMD 6000+ X2 @ 6400+][2GB RAM][NVidia 8800GT 512 MB]
 

Dreamora

BeitragDi, Sep 19, 2006 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Nunja, das Verhalten, dass du da haben möchtest, klingt eigentlich nach Kollisionsmodus 2.
Allerdings denke ich nicht, das der in diesem Falle wirklich so sinnvoll ist.

Eine Möglichkeit wäre:
Die Kamera hat den Spieler nicht als Parent drin, sondern wird manuell platziert.
Dazu merkt man sich die lokale Position der Kamera hinter dem Spieler. Damti das ganze nun aber auch noch funktioniert wenn sich der Spieler dreht, nimmt man diesen Positionsvektor und nutzt TFormVector von 0,Spieler um den "aktuellen Positionsvektor" zu bekommen.

Nun kommt der Punkt wo festgestellt wird, wo die Kamera genau zu liegen kommt:
Man macht einen LinePick mit der Position des Spielers und genau diesem Positionsvektor von oben.
Gibt es dabei einen Intersect, so positioniert man die Kamera dort (bzw. kurz davor). Gibt es keinen Intersect, so positioniert man die Kamera an der Position Spieler + Positionsvektor von oben

Am schluss kommt dann jeweils noch ein PointEntity.


Weiss nicht wie gut das geht und das ist natürlich auch noch keine "intelligente 3rd Person" Cam, aber als Grundgerüst denke ich, sollte es funktionieren.


PS: Bevor jetzt wieder wer kommt, das LinePick böse sei möchte ich darauf hinweisen, das es das nur ist wenn man sich wie ein Anfänger verhält und mehrere tausend Einheiten weit pickt. In diesem Falle reden wir jedoch von 50 Einheiten oder so, denn weiter ist eine Cam normalerweise nicht weg (sofern die Spieler Modelle nicht riesig sind, aber dann entstehen sowieso ziemliche Probleme)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

FreetimeCoder

BeitragDi, Sep 19, 2006 15:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du nur prüfen willst ob sich die Kamera zB mit der Burg schneidet, dann erzeuge eine Kugel als Child der Kamera.
Mach die Kugel mit Entityalpha durchsichtig und benutzte Meshesintersect.

Allerdings kann das bei zu vielen Polygonen sehr langsam sein.
"Wir haben keine Chance, aber wir werden sie nutzen!"
Projekte:
Dexterity Ball (100%)
Aquatic Atmosfear (22 % ca 4700 Zeilen) eingefrohren mangels OOP Fähigkeiten von Blitz
(ehemals Uboot)
PC: Intel D 3 GHz | NVidiaGforce 6700 256 Mb | 1024 Mb DDR RAM 400 Mhz | 2x160 GB S-ATA

rctuner

BeitragDi, Sep 19, 2006 16:24
Antworten mit Zitat
Benutzer-Profile anzeigen
genauso hab ich das jetzt versucht, funktioniert eigendlich auch. Wenn die Kamera jetzt etwas berührt, wird sie so lange nach vorne geschoben, biss sie nichts mehr berührt.

Nur ist es jetzt blöd, dass die Kamera dann vorne bleibt, auch wenn sie nichts mehr berührt.

Das habe ich versucht so zu lösen:

Code: [AUSKLAPPEN]

If MeshesIntersect(camera_radius,map)=0 ; wenn Kamera nichts berührt
If cam_z>-180 ; wenn Kamera nicht an iherer richtigen stelle steht
cam_z=cam_z-14 ; nach hinten bewegen
 EndIf
EndIf
 EndIf


Das Problem ist jetzt aber:
Wie gesagt wird die Kamera so lange nach vorne geschoben biss sie nichts mehr berührt.
Dann ist also MeshesIntersect(camera_radius,map)=0 und die obere Funktion greift sofort ein und schiebt sie wieder an richtiger stelle (nach hinten) hinten ist aber die wand, also MeshesIntersect(camera_radius,map)=1 und Kamera wird wieder nach vorne geschoben....

Das ganze Wackelt dan ziemlich und siht wie ein erdbeben aus^^

Kann mir jemand helfen?
[Y[our Film, Game ]M[akers and more [F]un!
www.Master-Entertainment.de.vu

[AMD 6000+ X2 @ 6400+][2GB RAM][NVidia 8800GT 512 MB]

StepTiger

BeitragDi, Sep 19, 2006 20:29
Antworten mit Zitat
Benutzer-Profile anzeigen
platziere die kamera manuell, berechne x,y,z und nutze pointentity

zum berechnen:

Code: [AUSKLAPPEN]
xwink#=45
ywink#=90

x#=playerx#+sin(ywink#)*camdist#*cos(xwink#)
y#=playery#+sin(xwink#)*camdist#
z#=playerz#+cos(ywink#)*camdist#*cos(xwink#)

positionentity cam,x#,y#,z#
pointentity cam,player

<FUNKTION ZUM VERSCHIEBEN DER KAMERA NACH VORN>



dürfte gehen
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

rctuner

BeitragDi, Sep 19, 2006 21:08
Antworten mit Zitat
Benutzer-Profile anzeigen
@StepTiger:
Hab das jetzt mal so probiert, nur wo ist jetzt der unterschied , als wenn ich das mit Parent mache?

Die Kamera soll sich ja schlau verhalten und sich nicht mit der Welt schneiden.
[Y[our Film, Game ]M[akers and more [F]un!
www.Master-Entertainment.de.vu

[AMD 6000+ X2 @ 6400+][2GB RAM][NVidia 8800GT 512 MB]
 

Dreamora

BeitragDi, Sep 19, 2006 21:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich nehme jetzt Mal an du hast gelesen, was ich oben geschrieben habe, oder?
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

rctuner

BeitragDi, Sep 19, 2006 21:35
Antworten mit Zitat
Benutzer-Profile anzeigen
ja habe ich, nur kann mir aus dem vielen Text schlecht ein code vorstellen.
Habs zwar versucht, hat aber nicht geklappt. Auch keine ahnung wieso...

Ist kein Beispielcode vorhanden?
[Y[our Film, Game ]M[akers and more [F]un!
www.Master-Entertainment.de.vu

[AMD 6000+ X2 @ 6400+][2GB RAM][NVidia 8800GT 512 MB]
 

Dreamora

BeitragDi, Sep 19, 2006 21:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun, soweit ich das sehe willst du doch etwas programmieren.
Mehr als Text, den man nur noch durch Blitz Befehle ersetzen muss, kann oder besser will ich nicht liefern, da ich denke, das Text -> Code eine elementare Grundeigenschaft eines Programmierers ist und auch sein muss. Oder wie genau möchtest du dir komplexere Dinge einbauen? Ich hoffe nicht via "Versuchen, löschen, neu schreiben" ...
Von daher ist es eine gute Übung es zu versuchen mit einer von jemand anderem vorgeschlagenen Lösung das ganze Mal zu versuchen, damit du dann später anhand eigener Ideen und schriftlichen Lösungsideen einen Code dazu erzeugen kannst.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

rctuner

BeitragDi, Sep 19, 2006 21:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Mehr als Text, den man nur noch durch Blitz Befehle ersetzen muss, kann oder besser will ich nicht liefern, da ich denke, das Text -> Code eine elementare Grundeigenschaft eines Programmierers ist und auch sein muss.


Da gibts aber ein Problem, wenn man den Text nicht versteht, kann man unmöglich einen funktionierenden code daraus machen.
[Y[our Film, Game ]M[akers and more [F]un!
www.Master-Entertainment.de.vu

[AMD 6000+ X2 @ 6400+][2GB RAM][NVidia 8800GT 512 MB]
 

Dreamora

BeitragDi, Sep 19, 2006 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Nun wenn du mir sagst, wo genau das Problem ist, versuche ich es besser oder anders zu erläutern.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

rctuner

BeitragDi, Sep 19, 2006 22:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Dazu merkt man sich die lokale Position der Kamera hinter dem Spieler


Das hab ich wie Steptiger gemacht:

xwink#=45
ywink#=90

x#=playerx#+sin(ywink#)*camdist#*cos(xwink#)
y#=playery#+sin(xwink#)*camdist#
z#=playerz#+cos(ywink#)*camdist#*cos(xwink#)

positionentity cam,x#,y#,z#
pointentity cam,player


Zitat:
Damti das ganze nun aber auch noch funktioniert wenn sich der Spieler dreht, nimmt man diesen Positionsvektor und nutzt TFormVector von 0,Spieler um den "aktuellen Positionsvektor" zu bekommen.


Den Befehl hab ich mir schon in der OH angeguckt, weiss aber nicht wie ich ihn anwenden kann. Brauch ich zb. auch VECTORPITCH# usw?



Zitat:
Gibt es dabei einen Intersect, so positioniert man die Kamera dort (bzw. kurz davor).

intersect=kollision???
Wenn ja, dann Kollision mit was? Und was heist dann "dort" positionieren (WO?)
[Y[our Film, Game ]M[akers and more [F]un!
www.Master-Entertainment.de.vu

[AMD 6000+ X2 @ 6400+][2GB RAM][NVidia 8800GT 512 MB]
 

Dreamora

BeitragMi, Sep 20, 2006 0:27
Antworten mit Zitat
Benutzer-Profile anzeigen
rctuner hat Folgendes geschrieben:
Zitat:
Dazu merkt man sich die lokale Position der Kamera hinter dem Spieler


Das hab ich wie Steptiger gemacht:

xwink#=45
ywink#=90

x#=playerx#+sin(ywink#)*camdist#*cos(xwink#)
y#=playery#+sin(xwink#)*camdist#
z#=playerz#+cos(ywink#)*camdist#*cos(xwink#)

positionentity cam,x#,y#,z#
pointentity cam,player


Zitat:
Damti das ganze nun aber auch noch funktioniert wenn sich der Spieler dreht, nimmt man diesen Positionsvektor und nutzt TFormVector von 0,Spieler um den "aktuellen Positionsvektor" zu bekommen.


Ich würde dir dann doch empfehlen, künftig keine Codes mehr zu kopieren.
Die Codes die dir Leute posten, dienen dazu das du eine Idee bekommst wie eine Lösung aussehen könnte, aber solange du keine Ahnung davon hast, was sie machen hat es keinen Sinn.
Und ich fürchte leider obiger Source zusammen mit deinem Quote danach belegen die Unverständnis des Codes.
Warum ich das behaupte?
Nun, den Source den du da kopiert hast ist die manuelle Variante der Koordinatentransformation Anfangskoordinaten in die aktuellen Koordinaten via Kugelkoordinatentransformation.
Und das ist eigentlich genau das, was ein simpler Aufruf von TFormVektor auch tut. Mit dem kleinen Unterschied, das es direkt die Blitz interne Matrix benutzt, die auch benutzt wird um den Spieler zu positionieren, skalieren und rotieren.
Die TForm Befehle machen dabei nichts anderes, als Punkte oder Vektoren zwischen 2 verschiedenen Koordinatensystemen zu transformieren. Normalerweise gehts es dabei von 0, Entity oder Entity,0 - Sprich man transformiert sie vom globalen KoordSys ins lokale einer Entity oder umgekehrt.

Damit wäre dann sicher auch die Frage bezüglich Vectorpitch und so erklärt, da das alles garnicht gebraucht wird. Nur die Position der Cam ganz zu Beginn ist wichtig. (wenn die Cam zb 5 Einheiten dahinter und 3 Einheiten drüber ist wäre der Vektor zur Transformation 0,5,-3 wenn man davon ausgeht das der Spieler in +Z Richtung schaut und Y nach oben zeigt)


rctuner hat Folgendes geschrieben:

Zitat:
Gibt es dabei einen Intersect, so positioniert man die Kamera dort (bzw. kurz davor).

intersect=kollision???
Wenn ja, dann Kollision mit was? Und was heist dann "dort" positionieren (WO?)


Indirekt ist es eine Kollision, da die Kollisionserkennungen auch so arbeiten.
Wenn du mit LinePick arbeitest, bekommst du Schnittpunkte und zwar dort wo die gedachte Linie sich mit einem anderen Objekt überschneidet (intersected), welches einen entsprechenden PickMode gesetzt hatte.

Das "dort" bekommst du danach mittels PickedX() ( Y() Z() ), näheres dazu findest du unter www.blitzbase.de
Das wichtige hier ist wie gesagt, dass du den TFormed Vektor nimmst, denn sonst pickst du entweder in die falsche Richtung oder eine viel zu grosse Distanz, wo dann die Pick Befehle wieder langsam werden.



EDITIERT von mir

~GESCHLOSSEN~

Problem gelöst, muss nur noch mit Code umgesetzt werden. Flame und Spam gecleant
Dreamora
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group