EntityPitch / RotateEntity Problem

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

ToeB

Betreff: EntityPitch / RotateEntity Problem

BeitragSo, Feb 22, 2009 19:18
Antworten mit Zitat
Benutzer-Profile anzeigen
In dem folgenden Code :
Code: [AUSKLAPPEN]
Global GRWidth = 1024
Global GRHeight = 768

Include "Data\Draw3D.bb"

Graphics3D GRWidth,GRHeight,16,2
SetBuffer BackBuffer()
SeedRnd MilliSecs()

HidePointer()

Global Camera = CreateCamera()
   CameraViewport Camera,0,0,GraphicsWidth(),GraphicsHeight()
   CameraRange Camera,0.1,1000
   
Global Beine = LoadAnimMesh("Data\Mod\Beine.b3d")
   Global BeineSTEH = ExtractAnimSeq(Beine,0,1)
   Global BeineLAUF = ExtractAnimSeq(Beine,1,5)
   ScaleEntity Beine,0.04,0.04,0.04
   HideEntity Beine
   
Global Torso = LoadAnimMesh("Data\Mod\Torso.b3d")   
   Global TorsoSTEH = ExtractAnimSeq(Torso,0,1)
   Global TorsoLAUF = ExtractAnimSeq(Torso,1,5)
   NameEntity(Torso,"Torso")
   PositionEntity Torso,0,0,0,1
   ScaleEntity Torso,0.04,0.04,0.04,1
   HideEntity Torso
   
Global Map = LoadMap("TestMap")
   
   
Global Player = CopyEntity(Beine)
Global PlayerT= CopyEntity(Torso)
Global PlayerX= FindChild(PlayerT,"PUNKT")
EntityParent PlayerT,FindChild(Player,"PUNKT")

Global CameraPiv = CreatePivot(PlayerX)
   PositionEntity CameraPiv,0,1.5,-2,1;0.25,-0.75,1
Global ShowPiv = CreatePivot(PlayerX)
   PositionEntity ShowPiv,0,1.5,0,1
Global ShootPiv = CreateCone(5,1,PlayerX)
;   ScaleEntity ShootPiv,5,5,5
   PositionEntity ShootPiv,0,0.75,0,1
   RotateEntity ShootPiv,-90,0,0
Global TPiv = CreatePivot(ShootPiv)
   PositionEntity TPiv,0,0,1

   
Global CamPiv=CameraPiv,CamObj=ShowPiv,CamPick=PickPiv
Global MXSpeed#,MYSpeed#,MX#,MY#

DrawInit3D(Camera)

Global Pointer = LoadImage3D("Data\Gfx\Pointer.png",2,2,0)
Global Font = LoadFont3D("Data\Gfx\Font.png")


Repeat
   ;Player
   MXSpeed = MouseXSpeed()
   MYSpeed = MouseYSpeed()
   If MXSpeed < - 18 MXSpeed = -18
   If MXSpeed > + 18 MXSpeed = +18   
   MoveMouse GRWidth / 2,GRHeight / 2
   TurnEntity Player,0,-MXSpeed/3.0,0,1
   TurnEntity PlayerX,MYSpeed/3.0,0,0
   pt# = EntityPitch(PlayerX,1)
   pt = pt + (MYSpeed / 3.0)
   If pt < 45 pt = 45
   ;RotateEntity PlayerX,pt,0,0
   Moving = 0
   If KeyDown(17) MoveEntity Player,0,0,0.1 : Moving = 1
   If Moving = 1
      If AnimSeq(Player) <> BeineLAUF Animate(Player,1,0.1,BeineLAUF)
   Else
      If AnimSeq(Player) <> BeineSTEH Animate(Player,3,0.1,BeineSTEH)
   EndIf
   If KeyDown(2) WireFrame 1 Else WireFrame 0
   ;Camera
   If 1 = 1
      dx# = -(EntityX(Camera) - EntityX(CamPiv,1)) * 0.075
      dy# = -(EntityY(Camera) - EntityY(CamPiv,1)) * 0.075
      dz# = -(EntityZ(Camera) - EntityZ(CamPiv,1)) * 0.075
      TranslateEntity Camera,dx,dy,dz
      PointEntity Camera,CamObj
      pick = EntityPick(ShootPiv,1000)
      If pick
         CameraProject(Camera,PickedX(),PickedY(),PickedZ())
         MX = ProjectedX() - GRWidth/2
         MY = -1*(ProjectedY() - GRHeight/2)
      Else
         CameraProject(Camera,EntityX(Tpiv,1),EntityY(Tpiv,1),EntityZ(Tpiv,1))
         MX = ProjectedX() - GRWidth/2
         MY = -1*(ProjectedY() - GRHeight/2)
      EndIf
   EndIf
   DrawImage3D(Pointer,MX,MY,0,0,0.4)
   UpdateWorld()
   RenderWorld()
   Clear3D()
   Text 0,0,pt+";"+(MYSpeed/3.0);Pick+";"+PickedX()+","+PickedY()+","+PickedZ()
   Flip
Until KeyHit(1)
End

Function LoadMap(Name$)
   Map = LoadMesh("Data\Map\"+Name$+".b3d")
   EntityPickMode Map,2
   If Map = 0
      Map = LoadMesh("Data\Map\"+Name$+".x")
      If Map = 0 RuntimeError "Map ''"+Name$+"'' does not exist !"
   EndIf
   Return map
End Function


wollte ich die Lego figur nur bis zu einem bestimmten winkel drehen lassen. Die figur (PlayerX) ist im normalzustand auf winkel 90, dann komischer weise wird es nach vorne und nach hinten kleiner (egal welche richtung)

Was ist das Problem ? Weil wenn ich RotateEntity PlayerX,pt,0,0 den kommentar wegmache und TurnEntity auskommentiere, dann geht zwar alles nach hinten gut, also wenn die figur sich nach hinten lehnt, aber will ich mich nach vorne lehnen, dann hört der bei 90 (normal) auf...

Ich habs sehr doof erklärt, wers sich mal angucken will :
Download

mfg ToeB
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Mr.Keks

BeitragMo, Feb 23, 2009 20:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Lösung wird so oder so klapprig... Speichere doch einfach die Oberkörperdrehung in einer extra Variable. Das erspart dir das Problem und du hast mehr Kontrolle ^^. Und übrigens hätten die drei relevanten Zeilen es auch getan.

Ansonsten, denk mal über Folgendes nach: Das ganze Pitch/Yaw-System ist ja im Prinzip dasselbe wie die Längen- und Breitengrade auf der Erde. Jetzt nimm die mal deinen Globus zur Hand. Wenn dein Spieler anfangs bei 90 Grad ist, dann entspricht das 90° Nördlicher Breite. Was ist da? Oha, der Nordpol. Du versuchst jetzt eins hinzuzuaddieren. Such mal auf deinem Globus den 91. Breitengrad! Du willst nördlicher als der Nordpol sein. Blitz löst das vermutlich so, dass es sagt: OK, also jenseits vom Nordpol - das bedeutet auf dem entgegengesetzten Längengrad und um einen Breitengrad runter. Also 89°NB auf der anderen Seite des Globus. Da du dann aber im nächsten Frame wieder eins hinzuaddierst, springste wieder auf den Nordpol und wieder rüber und wieder zurück etc. Darum kann dein toller Plan nicht funktionieren.
MrKeks.net

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group