Problem mit "Kamera Kollisionsabfrage"

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

DennY

Betreff: Problem mit "Kamera Kollisionsabfrage"

BeitragFr, Dez 14, 2007 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Leute,
ich habe erneut ein Problem! Crying or Very sad
Also ich ein kleines Programm geschrieben in dem man eine Kugel steuert. Die Kollisionsabfrage der Kugel funktioniert auch ganz Prima. Aber wenn man mit der Kamera gegen eine Wand "klatscht" so bleibt diese nicht stehen, sondern ich bin plötzlich hinter der Wand. Das Problem habe ich damit gelöst indem ich einfach eine Kollisionsabfrage mit der Kamera und dem Objekt gemacht habe. Das hat aber den Nachteil, das die Kamera sich , bei einer Kollision, von der Kugel "wegdreht". Hier der code:

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

; setzen der Kollisionstypen
type_character=1
type_objekte=2
type_camera=3

;--------LICHT_--------

AmbientLight 255, 255, 255


;-----------die kugel die man bewegt-----------
spieler=CreateSphere(10 )
EntityRadius spieler,0.5                       ;-----der Radius der Kugel (hängt mit Kollisionsabfrage zusammen)
EntityType spieler,type_character     ; dieser Typ eben ...............
;PositionEntity sphere,0,10,0      ;startposition
ScaleEntity spieler,0.5,0.5,0.5




; Die map
cube=  CreateCube()
EntityRadius cube,1
EntityType cube,type_objekte
PositionEntity cube,0,-12,0
EntityColor cube,127,0,0
ScaleEntity cube,10,10,10


cube2=  CreateCube()
EntityRadius cube2,1
EntityType cube2,type_objekte
PositionEntity cube2,0,0,5
EntityColor cube2,127,127,0
ScaleEntity cube2,2,2,2



;-----------------------------------------Kamera!---------------

Global camera=CreateCamera(spieler)
PositionEntity camera, 0, 5, -10
RotateEntity camera,20,0,0
EntityType camera,type_camera


;-----------------------------------
Repeat


x#=0
y#=0
z#=0


;--------------------------Bewegung--------------------

If KeyDown( 203 )=True Then TurnEntity spieler, 0, 1, 0      ; "LINKS" (im Raum drehen)
If KeyDown( 205 )=True Then TurnEntity spieler, 0, -1, 0      ; "Rechts" (im Raum drehen)
If KeyDown( 208 )=True Then z#=-0.1  ;    "RUNTER (zurück)"
If KeyDown( 200 )=True Then z#=0.1   ;    "HOCH (vor)"

MoveEntity spieler,x#,y#,z#
MoveEntity spieler,0,-0.1,0
;------------------------------------------------------------------------


; Aktivieren der kollisionsabfrage zwischen Charakter/kamera und umwelt!
Collisions type_character,type_objekte,2,2
Collisions type_camera,type_objekte,2,2

UpdateWorld
RenderWorld

Text 0,0,"Verwende die Pfeiltasten um die Spielfigur (die weiße Kugel) zu bewegen!"

Flip

Until KeyHit(1)
End


Ich will aber, dass die Kamera wenn man an der Wand entlangschrammt, zum Spieler heranzommt, soweit wie es eben notwendig ist, und danach wieder wegzoomt, wenn "sie wieder Platz hat"

1. Geht das überhaupt?
2. Wie ist das realisierbar?

Danke für eure Antworten! Smile
 

gigi

BeitragFr, Dez 14, 2007 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
prüf doch ob sich die camera einen bestimmten Wert hinter der Kugel befindet. Wenn nicht musst du sie halt
Moveentity korrigieren. Nimm auf keinen Fall Positionentity, denn dann würdest du auch hinter die Wand springen!!!
Anfänger Tut von mir:
http://www.blitzforum.de/forum...hp?t=26185

Foppele

BeitragSa, Dez 15, 2007 2:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich gaube da gibt's keine einfache Lösung, sonst würde es nicht so viele professionelle Spiele geben wo die Kamera mal in der Wand verschwindet oder andere blöde Positionen einnimmt.
Mit LinePick kann man immer gut testen ob irgendwas im Weg ist, drumherummanövrieren wird schwierig ohne Vektorberechnungen durchzuführen.

The_Nici

BeitragSa, Dez 15, 2007 2:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Pointentity.
Richtet ein Objekt auf ein anderes aus.

Foppele

BeitragSa, Dez 15, 2007 2:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Trotzdem geht der Würfel hinter der Wand lang.
 

DennY

Betreff: Ich habs gepackt!

BeitragSa, Dez 15, 2007 10:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
Durch eure Gedankenanstöße bin ich letztendlich zu einer brauchbaren Lösung gekommern!
Vielen Dank Jungs Exclamation Very Happy Very Happy

Ich poste einfach mal den Code meines verbesserten Programms, vielleicht nützt es irgendjemanden etwas.

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

; setzen der Kollisionstypen
type_character=1
type_objekte=2
type_camera=3
;--------------Variablen zur Positionierung der kamera-----------------

dx#=0.0
dy#=0.0
dz#=0.0


;--------LICHT_--------

AmbientLight 255, 255, 255


;-----------die kugel die man bewegt-----------

spieler=CreatePivot()
PositionEntity spieler,0,0,0
EntityType spieler,type_character
EntityRadius spieler,1
ResetEntity spieler


model=CreateSphere()
EntityParent model,spieler


;--------------- Die map----------
cube=  CreateCube()
EntityRadius cube,1
EntityType cube,type_objekte
PositionEntity cube,0,-15,0
EntityColor cube,127,0,0
ScaleEntity cube,10,10,10


cube2=  CreateCube()
EntityRadius cube2,1
EntityType cube2,type_objekte
PositionEntity cube2,0,-3,5
EntityColor cube2,127,127,0
ScaleEntity cube2,2,2,2



;-----------------------------------------Kamera!---------------
   camera=CreateCamera()
   
   target=CreatePivot( spieler )
   PositionEntity target,0,3,-5
   EntityType target,type_camera

   heading=CreatePivot( spieler )
   PositionEntity heading,0,0,20

;-----------------------Kollisionsabfrage----------------------------
Collisions type_character,type_objekte,2,2
Collisions type_camera,type_objekte,2,2
;-----------------------------------


PositionEntity spieler,0,10,0


;--------------------Hauptschleife:


Repeat

;--------------------------Bewegung--------------------

If KeyDown( 203 )=True Then TurnEntity spieler, 0, 1, 0      ; "LINKS" (im Raum drehen)
If KeyDown( 205 )=True Then TurnEntity spieler, 0, -1, 0      ; "Rechts" (im Raum drehen)

   If    KeyDown(30)      ;vor
         MoveEntity spieler,0,0,0.1

      Else If KeyDown(44)   ;zurück
         MoveEntity spieler,0,0,-0.1
   EndIf


;---------------Schwerkraft---------------------------------------------
MoveEntity spieler,0,-0.1,0
;------------------------------------------------------------------------


;----------------Das auf und Ab der Kamera
   If KeyDown(200)     ;"oben" ----> weiter nach vorn-unten schwenken
      TranslateEntity heading,0,-0.1,0
   Else If KeyDown(208) ;"unten ------> zurück schwenken
      TranslateEntity heading,0,+0.1,0
   EndIf
;------------------   



;------Die Kamera steht hinter dem Objekt, sie dreht sich immer so wie "Target" und schaut immer auf
;------"Heading"
   dx=EntityX(target,True)-EntityX(camera,True)
   dy=EntityY(target,True)-EntityY(camera,True)
   dz=EntityZ(target,True)-EntityZ(camera,True)
   
   TranslateEntity camera,dx*.1,dy*.1,dz*.1
   
   PointEntity camera,heading
      
   PositionEntity target,0,0,0
   ResetEntity target
   PositionEntity target,0,3,-10

;----------------------------------------------------



UpdateWorld
RenderWorld

Text 0,0,"Verwende 'A/Y' und 'Links/Rechts' um die Spielfigur (die weiße Kugel) zu bewegen!"
Text 0,10,"Beachte: Die Kamera zoomt an dedn Spieler heran wenn nicht genug Platz ist!


Flip
Until KeyHit(1)
End


Ich habe es schön beschriftet damit auch jeder durchsieht.
 

Honesch

Betreff: gut

BeitragSa, Dez 15, 2007 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
gute Lösung Wink

Honesch
Das Leben ist wie ein Computerspiel. Scheiß Handlung aber geile Grafik !

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group