Meshesintersect() - zu langsam!

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Mr Hopp

Betreff: Meshesintersect() - zu langsam!

BeitragMo, Nov 20, 2006 17:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey!

Ich habe gestern Abend (ENDLICH) herausgefunden, wie man Treppen steigen könnte. Dazu erstelle ich einen Cube um meine Füße herum (etwas über dem Boden) und bewege diesen mit mir. Wenn der Player nun mit einer Stufe/Wand kolidiert, wird er nur dann hoch bewegt, wenn der Cube NICHT kollidiert (um zu vermeiden, dass man die wand hoch laufen kann). Dies prüfe ich mit Meshintersect()..... Allerdings zieht mir das sage und schreibe 1000fps im Testprogramm...wie macht ihr sowas?? Kann man diesen Befehl umgehen?

Danke schonmal
Zitat:
Wie poste ich falsch?

Nachdem ich Google, die FAQ's und die Boardsuche erfolgreich ignoriert habe, erstelle ich zwei bis fünf neue Themen, in den falschen Unterforen, mit kreativen Titeln und undeutlichem Text, unter dem sich jeder etwas anderes vorstellen kann.
 

Dreamora

BeitragMo, Nov 20, 2006 17:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Indem du einfach die Kollision via Collisions nimmst und Modus 2 oder 3 nimmst.

Ach ja: 1000 FPS sind nix, denn alles was mehr als 500 FPS ist, sind sowieso "heisse Luft FPS" sprich die verliert man bedeutend schneller (und durch bedeutend weniger) als im Bereich 500-0 (auf mid-high end karten)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

FreetimeCoder

BeitragMo, Nov 20, 2006 18:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst einfach den Collisionsradius größer machen, oder die Treppenstufenhöhe kleiner.
"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
 

Mr Hopp

BeitragMo, Nov 20, 2006 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Nunja...mir geht es ja darum, dass der Cube ermittel, ob die Kante zu hoch ist, oder nicht. Wenn der Cube dann eine Kugel zur Kollision hat, verfälscht das extrem.

@Dreamora: also 280fps reichen für ein Testprogramm? Smile (Ich will so früh, wie möglich, anfangen, den Code speed-orientiert zu machen, damit ich später keine Probleme hab)
Zitat:
Wie poste ich falsch?

Nachdem ich Google, die FAQ's und die Boardsuche erfolgreich ignoriert habe, erstelle ich zwei bis fünf neue Themen, in den falschen Unterforen, mit kreativen Titeln und undeutlichem Text, unter dem sich jeder etwas anderes vorstellen kann.
 

Dreamora

BeitragMo, Nov 20, 2006 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, denn aktuell läuft dein Programm im Debug Mode. Will heissen, dass vor allem Loops extrem viel langsamer laufen und darüber hinaus wenn ich mich richtig erinner, sind vor allem auch Pick und MeshIntersect speziell langsam Smile

Solange du kein AMD64 5000 mit 7950 GTX hast ist das von daher kein Problem ^^

Das mit der Stephöhe lässt sich übrigens anders viel einfacher erreichen:

Deine Figur kann nur in eine Richtung gehen auf einmal. Also kann er eigentlich auch nur in diese Richtung an eine Wand geraten, von daher lässt sich das "Treppensteigen" auch mit einigen wenigen LinePicks erledigen, die nur eine sehr kurze Distanz überprüfen müssen -> sehr sehr schnell
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Mr Hopp

BeitragMo, Nov 20, 2006 19:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Achso ok, dann ist ja gut, danke Smile

Linepick und so kannte ich auch noch gar nicht...bedeuten dx,dy,dz, dass mehrere Linien (z.B. im Abstand von x zu dx) erstellt werden??? Und was, wenn meine Figur rückwärts oder seitlich laufen soll???
Zitat:
Wie poste ich falsch?

Nachdem ich Google, die FAQ's und die Boardsuche erfolgreich ignoriert habe, erstelle ich zwei bis fünf neue Themen, in den falschen Unterforen, mit kreativen Titeln und undeutlichem Text, unter dem sich jeder etwas anderes vorstellen kann.
 

Dreamora

BeitragMo, Nov 20, 2006 19:29
Antworten mit Zitat
Benutzer-Profile anzeigen
dx, dy, dz sind sie Länge des Picks in X, Y, Z Richtung.

Und wie die Richtung heisst, in welche du läufst, macht keinen Unterschied, da du das in die X,Y,Z Position für den LinePick einfliessen lässt.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Mr Hopp

BeitragDi, Nov 21, 2006 15:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Mhh.....das mit dem Linepick hab ich jetz noch net so ganz.... ich poste ma den Code (sorry, net lauffähig ohne mesh):

Mit Cube:
Code: [AUSKLAPPEN]
Graphics3D 1024,768,32,1
SetBuffer BackBuffer()
AppTitle("Test")

Dim fps(3)

objekt=LoadMesh("Treppe.3ds")
PositionEntity objekt,0,0,0
EntityType objekt,1

cam=CreateCamera()
PositionEntity cam,0,5,-6
EntityRadius cam,1,3
EntityType cam,2
cube=CreateCube(cam)
ScaleEntity cube,1,0.1,1
MoveEntity cube,0,-1.5,0
EntityType cube,3
EntityAlpha cube,0

Collisions 2,1,2,3

light=CreateLight()

Repeat
Cls

TranslateEntity cam,0,-1,0

If KeyDown(17) Then MoveEntity cam, 0, 0, 0.1
If KeyDown(31) Then MoveEntity cam, 0, 0, -0.1
If KeyDown(30) Then MoveEntity cam, -0.1, 0, 0
If KeyDown(32) Then MoveEntity cam, 0.1, 0, 0

RotateEntity cam,EntityPitch(cam)+MouseYSpeed(),EntityYaw(cam)-MouseXSpeed(),0
   MoveMouse 512, 384

UpdateWorld
RenderWorld

If MeshesIntersect(cube,objekt)=0 And EntityCollided(cam,1)>0 Then TranslateEntity cam,0,1,0

Text 9,9,"FPS:"+FPS(1):FPS(2)=FPS(2)+1:If MilliSecs()>FPS(3)+999 Then FPS(1)=FPS(2):FPS(2)=0:FPS(3)=MilliSecs()

Flip
Until KeyHit(1)
End


Mit Linepick:
Code: [AUSKLAPPEN]
Graphics3D 1024,768,32,1
SetBuffer BackBuffer()
AppTitle("Test")

Dim fps(3)

objekt=LoadMesh("Treppe.3ds")
PositionEntity objekt,0,0,0
EntityType objekt,1

cam=CreateCamera()
PositionEntity cam,0,5,-6
EntityRadius cam,1,3
EntityType cam,2
EntityPickMode cam,1

Collisions 2,1,2,3

light=CreateLight()

Repeat
Cls

TranslateEntity cam,0,-1,0

If KeyDown(17) Then MoveEntity cam, 0, 0, 0.1
If KeyDown(31) Then MoveEntity cam, 0, 0, -0.1
If KeyDown(30) Then MoveEntity cam, -0.1, 0, 0
If KeyDown(32) Then MoveEntity cam, 0.1, 0, 0

RotateEntity cam,EntityPitch(cam)+MouseYSpeed(),EntityYaw(cam)-MouseXSpeed(),0
   MoveMouse 512, 384

UpdateWorld
RenderWorld

If cam=LinePick(EntityX(cam),EntityY(cam)+1.5,EntityZ(cam),0,0,0.5) Then TranslateEntity cam,0,1,0

Text 9,9,"FPS:"+FPS(1):FPS(2)=FPS(2)+1:If MilliSecs()>FPS(3)+999 Then FPS(1)=FPS(2):FPS(2)=0:FPS(3)=MilliSecs()

Flip
Until KeyHit(1)
End
Zitat:
Wie poste ich falsch?

Nachdem ich Google, die FAQ's und die Boardsuche erfolgreich ignoriert habe, erstelle ich zwei bis fünf neue Themen, in den falschen Unterforen, mit kreativen Titeln und undeutlichem Text, unter dem sich jeder etwas anderes vorstellen kann.
 

Dreamora

BeitragDi, Nov 21, 2006 15:32
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich sehe so auf Anhieb 2 Fehler:

1. Du hast EntityY(cam) + 1.5 statt -1.5
2. Das Levelmesh scheint nicht pickable zu sein. Sprich solange das Picksetup net da ist, wird der Pick immer 0 ergeben Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Markus2

BeitragDi, Nov 21, 2006 19:46
Antworten mit Zitat
Benutzer-Profile anzeigen
und dein pick geht nach vorne(Z) statt nach unten

y + oben
y - unten

camerea y sollte da sein wo der kopf ist und von dort den strahl los zu schicken ist ok .
Wenn der zu hoch startet über den Kopf mußte aufpassen das zu nicht
in einer anderen Etage landest .
Zu tief triffst du die Stufe evtl. nicht mehr .

wenn du was pickst solltest du den höhen unterscheid ausrechnen
und nicht einfach um 1 verschieben .
Siehe PickedY
 

Dreamora

BeitragDi, Nov 21, 2006 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Pick muss auch nach vorne sein, da er ja wissen will ob vor dem Fuss auf Knöchelhöhe eine Wand ist. Der Boden wird ja durch die Kollision abgedeckt.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Markus2

BeitragDi, Nov 21, 2006 23:49
Antworten mit Zitat
Benutzer-Profile anzeigen
@Dreamora
Für Wand und Boden reicht doch die normale Collision nur bei
Treppen muß er nach helfen das der Spieler angehoben wird .

@Mr Hopp
Linepick hat auch noch nen Radius was du dir wie nen Zylinder vorstellen kannst der auf dem Boden steht wenn du in Richtung Y pickst .
Also Spielerbreite/2
 

Mr Hopp

BeitragMi, Nov 22, 2006 14:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Mhhh.....hab die angesprochenen Fehler mal geändert, geht aber immer noch net. Hab mal die Treppe ins Archiv geladen (https://www.blitzforum.de/upload/file.php?id=797)

Hier der Code:
Code: [AUSKLAPPEN]
Graphics3D 1024,768,32,1
SetBuffer BackBuffer()
AppTitle("Test")

Dim fps(3)

objekt=LoadMesh("Treppe.3ds")
PositionEntity objekt,0,0,0
EntityType objekt,1
EntityPickMode objekt,2

cam=CreateCamera()
PositionEntity cam,0,5,-6
EntityRadius cam,1,3
EntityType cam,2
EntityPickMode cam,1

Collisions 2,1,2,3

light=CreateLight()

Repeat
Cls

TranslateEntity cam,0,-1,0

If KeyDown(17) Then MoveEntity cam, 0, 0, 0.1
If KeyDown(31) Then MoveEntity cam, 0, 0, -0.1
If KeyDown(30) Then MoveEntity cam, -0.1, 0, 0
If KeyDown(32) Then MoveEntity cam, 0.1, 0, 0

RotateEntity cam,EntityPitch(cam)+MouseYSpeed(),EntityYaw(cam)-MouseXSpeed(),0
   MoveMouse 512, 384

UpdateWorld
RenderWorld

If cam=LinePick(EntityX(cam),EntityY(cam)-1.5,EntityZ(cam),0,0,1) Then TranslateEntity cam,0,1,0

Text 9,9,"FPS:"+FPS(1):FPS(2)=FPS(2)+1:If MilliSecs()>FPS(3)+999 Then FPS(1)=FPS(2):FPS(2)=0:FPS(3)=MilliSecs()

Flip
Until KeyHit(1)
End

Markus2

BeitragMi, Nov 22, 2006 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
@Mr Hopp
dann schau nochmal was ich für dich geschrieben habe ...
 

Mr Hopp

BeitragMi, Nov 22, 2006 20:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Nunja....habe ich schon und bin leider immer noch nicht zu einem ergebnis gekommen (entschuldigt meine Dummheit Sad )..... im übrigen möchte ich ja auch in Richtung Z picken Smile Allerdings bringen da alle werte von 0.0001 bis 1 nix
Zitat:
Wie poste ich falsch?

Nachdem ich Google, die FAQ's und die Boardsuche erfolgreich ignoriert habe, erstelle ich zwei bis fünf neue Themen, in den falschen Unterforen, mit kreativen Titeln und undeutlichem Text, unter dem sich jeder etwas anderes vorstellen kann.
 

Dreamora

BeitragMi, Nov 22, 2006 21:38
Antworten mit Zitat
Benutzer-Profile anzeigen
das wundert mich nicht. Mit tendenz wird dein objekt ja nicht 0.001 gross sein, sprich mit einer Distanz von 1 bist du nicht mal aus dem Objekt raus normalerweise.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Mr Hopp

BeitragMi, Nov 22, 2006 21:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Derzeitig hab ich ja kein objekt sondern nur die cam^^ Aber es geht auch weder mit 5,10,20,200....ich glaub ich verstehe die Funktionsweiße von Linepick falsch.

Ich dachte, dass eine virtuelle Linie von x,y,z, nach x+dx,y+dx,z+dx gezogen wird und das erste Objekt, was die Linie berührt, zurückgeliefert wird.....ist es so???
Zitat:
Wie poste ich falsch?

Nachdem ich Google, die FAQ's und die Boardsuche erfolgreich ignoriert habe, erstelle ich zwei bis fünf neue Themen, in den falschen Unterforen, mit kreativen Titeln und undeutlichem Text, unter dem sich jeder etwas anderes vorstellen kann.
 

Dreamora

BeitragMi, Nov 22, 2006 22:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Genau

Wobei X,Y,Z in globalen Koordinaten sind, nicht in Objektkoordinaten. (falls du das hast und nutzen willst, einfach erst die lokalen dx,dy,dz durch TFormVektor von Objekt nach 0 jagen)
Ich vermute mal das war der Fehler mit dem Pick in Z Richtung.

aber mit Picktiefen von 0 .. 1 wirst du nichts sehen, denn per Default ist bei 1 die near clipping plane. Also da wo er stehen bleiben würde siehst du nix mehr.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Mr Hopp

BeitragMi, Nov 22, 2006 22:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Autsch das tut weh.....ich hab in der If-Abfrage vergessen, den Code anzupassen....da stand genau das Gegenteil vom erwünschten..... Ich hab nämlich vergessen die Kollision des Players selbst mit der Treppe zu prüfen... *DUMM* Very Happy thx an alle für die hilfe, jetz gehts
Zitat:
Wie poste ich falsch?

Nachdem ich Google, die FAQ's und die Boardsuche erfolgreich ignoriert habe, erstelle ich zwei bis fünf neue Themen, in den falschen Unterforen, mit kreativen Titeln und undeutlichem Text, unter dem sich jeder etwas anderes vorstellen kann.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group