warscheinlich problem mit runden bei turnentity

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

Scope

Betreff: warscheinlich problem mit runden bei turnentity

BeitragDi, Jul 03, 2007 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
hab folgendes problem.
ich drehe meine kamera (cam) mit turnentity mit jeder schleife um 0.5.
allerdings dreht er nicht wirklich um die 0,5 sondern um recht schiefe werte, was dazu führt, dass ich nach z.b 100 schleifendurchgängen nicht 50grad sondern sonstwas gedreht bin.
ist das normal? kann man das abstellen? oder bin ich einfach zu doof.

mfg Scope

the FR3AK

BeitragDi, Jul 03, 2007 22:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Gib mal den Code...dann wird es leichter für uns zu antworten Wink
 

Scope

BeitragDi, Jul 03, 2007 22:13
Antworten mit Zitat
Benutzer-Profile anzeigen
meinst DU Wink

wenn man auf die beiden kästchen oben rechts drückt sieht man den effekt und das was ich mein ganz gut

Code: [AUSKLAPPEN]

Global HUD_ActCount=0
Global cam

Const MAX_HUD_Act=50

Dim HUD_Act(MAX_HUD_Act,4)

;0=ID, 1=X, 2=Y, 3=Breite, 4=Höhe

Graphics3D 800,600,32,0
SetBuffer BackBuffer()

InitEnv()
While Not KeyHit (1)
   
   
   UpdateWorld
   RenderWorld   
   HUD_Draw()
   HUD_Click()
      
      
   Text 10,10,EntityPitch(cam)
   Text 10,30,EntityY(cam)
   
   Flip
Wend

Function InitEnv()
   Local light,brett
   Local pic
   
   cam=CreateCamera()
   PositionEntity cam,0,-20,-50
   RotateEntity cam,-20,0,0
   
   light=CreateLight()
   PositionEntity light,0,0,-50

   brett=CreateCube()
   ScaleEntity brett,50,50,1
   
   
   bg=LoadTexture("pic/bg.jpg")
   EntityTexture brett,bg
   

   
   HUD_Init()

End Function

Function HUD_Init()
   HUD_NewAct(GraphicsWidth()-(GraphicsWidth()/10),(GraphicsHeight()/10),GraphicsWidth()/20,GraphicsHeight()/20)
   HUD_NewAct(GraphicsWidth()-(GraphicsWidth()/10),(GraphicsHeight()/6),GraphicsWidth()/20,GraphicsHeight()/20)
End Function

Function HUD_Draw()
   ;Debug
   Local caunt
   For caunt=0 To HUD_ActCount-1
      Rect HUD_Act(caunt,1),HUD_Act(caunt,2),HUD_Act(caunt,3),HUD_Act(caunt,4)
   Next
   
End Function

Function HUD_NewAct(x,y,b,h)
   HUD_ActCount=HUD_ActCount+1
   
   HUD_Act(HUD_ActCount-1,0)=HUD_ActCount-1
   HUD_Act(HUD_ActCount-1,1)=x
   HUD_Act(HUD_ActCount-1,2)=y
   HUD_Act(HUD_ActCount-1,3)=b
   HUD_Act(HUD_ActCount-1,4)=h
End Function

Function HUD_ActColl(id)
   If MouseX()>HUD_Act(id,1) And MouseX()<HUD_Act(id,1)+HUD_Act(id,3) And MouseY()>HUD_Act(id,2) And MouseY()<HUD_Act(id,2)+HUD_Act(id,4) Then Return 1
   Return 0
End Function

Function HUD_ActCollID()
   Local caunt
   For caunt=0 To HUD_ActCount
      If HUD_ActColl(caunt)=1 Then Return caunt
   Next
   Return -1
End Function

Function HUD_Click()
   If MouseDown(1)
      Select HUD_ActCollID()
         Case 0
            If EntityY(cam)<0 Then MoveEntity cam,0,0.5,0 Else PositionEntity(cam),EntityX(cam),0,EntityZ(cam)
            If EntityPitch(cam)<0 Then TurnEntity cam,0.5,0,0 Else RotateEntity(cam),0,EntityYaw(cam),EntityRoll(cam)
         Case 1
            If EntityY(cam)>-20 Then MoveEntity cam,0,-0.5,0 Else PositionEntity(cam),EntityX(cam),-20,EntityZ(cam)
            If EntityPitch(cam)>-20 Then TurnEntity cam,-0.5,0,0 Else RotateEntity(cam),-20,EntityYaw(cam),EntityRoll(cam)
      End Select
   End If
End Function


edit: in der 5. und 6. sowie 8. und 9. zeile von unten ist die stelle die ich mein
  • Zuletzt bearbeitet von Scope am Di, Jul 03, 2007 22:15, insgesamt einmal bearbeitet

Lunatix

BeitragDi, Jul 03, 2007 22:14
Antworten mit Zitat
Benutzer-Profile anzeigen
was wohl daran liegt das Turnentity nicht auf 360° basiert ...
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...
 

Scope

BeitragDi, Jul 03, 2007 22:16
Antworten mit Zitat
Benutzer-Profile anzeigen
ja keine ahnung,
aber sollte nicht der wert, den man mit entitypitch() ausliest dem wert gleich sein, den man vorher mit turnentity eingestellt hat?
(mit gleich mein ich entsprechend.

Lunatix

BeitragDi, Jul 03, 2007 22:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Turnentity dreht das Entity nur weiter... steht alles in der OH
RotateEntity dreht auf die angegebenen werte, Turnentity addiert sie nur
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen...
 

Scope

BeitragDi, Jul 03, 2007 23:59
Antworten mit Zitat
Benutzer-Profile anzeigen
yo.
das ist mir auch klar.
aber die addierten werte stimmen nicht.
und sie weichen nicht nur (wie ab und an normal ^^) ein wenig ab, sondern gravierend ->im beispiel sieht mans ganz gut. das entity cam wird gedreht (relativ) um 0.5 und verschoben (relativ) um 0.5. das ganze in einer schleife.
beim verschieben klappts gut, beim drehen weichen die werte (meiner meinung nach) extrem ab. mir etwas zu viel Wink
und meine frage ist eben wieso das und ob man das ändern kann / oder ich was vollkommen falsch mache/verstehe

mfg scope

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Jul 04, 2007 0:19
Antworten mit Zitat
Benutzer-Profile anzeigen
RotateEntity setzt bestimmte Winkel der drei Achsen. Da gibt es nicht dran zu rütteln.

TurnEntity dreht relativ um ein Winkel, was automatisch bedeutet, dass es nicht nur sein kann sondern komplett auch ein Unterschied ist, ob man nun zuerst X und dann Y dreht, oder zuerst Y und dann X, da die Drehung relativ statt findet und zwar relativ vom Objekt aus gesehen.

Da dein Code so in der Form für mich nicht lauffähig ist, gebe ich dir so mal ein Tipp. Für viele Sachen kann es vom Vorteil sein, zuerst Mit RotateEntity nur eine Achse zu setzen und dann mit TurnEntity die nächste Achse zu drehen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Scope

BeitragMi, Jul 04, 2007 6:51
Antworten mit Zitat
Benutzer-Profile anzeigen
hi, danke erstmal für die tips.
sorry wegen dem code. habe ihn jetzt mal "lauffähig" gemacht hoffentlich.
Code: [AUSKLAPPEN]

Global HUD_ActCount=0
Global cam

Const MAX_HUD_Act=50

Dim HUD_Act(MAX_HUD_Act,4)

;0=ID, 1=X, 2=Y, 3=Breite, 4=Höhe

Graphics3D 800,600,32,0
SetBuffer BackBuffer()

InitEnv()
While Not KeyHit (1)
   
   
   UpdateWorld
   RenderWorld   
   HUD_Draw()
   HUD_Click()
      
      
   Text 10,10,EntityPitch(cam)
   Text 10,30,EntityY(cam)
   
   Flip
Wend

Function InitEnv()
   Local light,brett
   Local pic
   
   cam=CreateCamera()
   PositionEntity cam,0,-60,-50
   RotateEntity cam,-60,0,0
   
   light=CreateLight()
   PositionEntity light,0,0,-50

   brett=CreateCube()
   ScaleEntity brett,50,50,1
   
   
   ;bg=LoadTexture("pic/bg.jpg")
   ;EntityTexture brett,bg
   

   
   HUD_Init()

End Function

Function HUD_Init()
   HUD_NewAct(GraphicsWidth()-(GraphicsWidth()/10),(GraphicsHeight()/10),GraphicsWidth()/20,GraphicsHeight()/20)
   HUD_NewAct(GraphicsWidth()-(GraphicsWidth()/10),(GraphicsHeight()/6),GraphicsWidth()/20,GraphicsHeight()/20)
End Function

Function HUD_Draw()
   ;Debug
   Color 50,50,50
   Local caunt
   For caunt=0 To HUD_ActCount-1
      Rect HUD_Act(caunt,1),HUD_Act(caunt,2),HUD_Act(caunt,3),HUD_Act(caunt,4)
   Next
   
End Function

Function HUD_NewAct(x,y,b,h)
   HUD_ActCount=HUD_ActCount+1
   
   HUD_Act(HUD_ActCount-1,0)=HUD_ActCount-1
   HUD_Act(HUD_ActCount-1,1)=x
   HUD_Act(HUD_ActCount-1,2)=y
   HUD_Act(HUD_ActCount-1,3)=b
   HUD_Act(HUD_ActCount-1,4)=h
End Function

Function HUD_ActColl(id)
   If MouseX()>HUD_Act(id,1) And MouseX()<HUD_Act(id,1)+HUD_Act(id,3) And MouseY()>HUD_Act(id,2) And MouseY()<HUD_Act(id,2)+HUD_Act(id,4) Then Return 1
   Return 0
End Function

Function HUD_ActCollID()
   Local caunt
   For caunt=0 To HUD_ActCount
      If HUD_ActColl(caunt)=1 Then Return caunt
   Next
   Return -1
End Function

Function HUD_Click()
   If MouseDown(1)
      Select HUD_ActCollID()
         Case 0
            If EntityY(cam)<0 Then MoveEntity cam,0,0.5,0
            If EntityPitch(cam)<0 Then TurnEntity cam,0.5,0,0
         Case 1
            If EntityY(cam)>-60 Then MoveEntity cam,0,-0.5,0
            If EntityPitch(cam)>-60 Then TurnEntity cam,-0.5,0,0
      End Select
   End If
End Function


ich drehe ansich nur eine achse der cam.
entscheident sind die letzten zeilen.
die select abfrage prüft nur welches der beiden buttons (kästchen oben rechts) gedrückt ist.



Code: [AUSKLAPPEN]

Case 0
            If EntityY(cam)<0 Then MoveEntity cam,0,0.5,0
            If EntityPitch(cam)<0 Then TurnEntity cam,0.5,0,0
         Case 1
            If EntityY(cam)>-60 Then MoveEntity cam,0,-0.5,0
            If EntityPitch(cam)>-60 Then TurnEntity cam,-0.5,0,0


(die y position der cam sowie der entitypitch der cam sind am anfang gleich, siehe code weiter oben (nämlich -60))
nun wird bei case 0 (das obere button ist gedrückt)
sowohl der pitch als auch das entityy um jeweils 0.5 (einheiten was auch immer verschoben) und zwar solange bis es ca 0 ist.

Code: [AUSKLAPPEN]

If EntityY(cam)<0
If EntityPitch(cam)<0


das gleiche dann bei case 1, blos wieder zurück nach -60.
klappt soweit auch. problem ist, das jeweils (entityy und pitch) den gleichen startwert haben die gleiche abbruchbedingung haben und trotzdem das drehen schneller "fertig" ist, als das verschieben.

hoffe mein problem ist jetzt etwas durchsichtiger geworden Wink

mfg Scope

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Jul 04, 2007 10:50
Antworten mit Zitat
Benutzer-Profile anzeigen
OK, ich hab nun ein bisschen gebraucht, bis ich wusste (das denke ich jetzt so zumindest), was du genau willst. Ich kann nur das eine sagen, was ich bereits beschrieben habe. Bei relativen Angaben macht es ein Unterschied, was zuerst ausgeführt wird. Beispiel: Nimm dazu dein Handy oder sowas in die Hand (das ist nun deine Kamera (oder egal was)). Bewege nun das Handy zuerst 10cm (relativ vom Handy) nach oben und drehe es dann um 90° und merke dir wo du bist und welche Stellung das Handy hat. Nun der zweite Versuch mit gleicher Ausgangsposition. Drehe dein Handy erst (in der gleiche Achse) um 90° und bewege nun relativ vom Handy wiederrum nach oben und stelle fest, dass die Position komplet wo anders ist. Das gleiche ''Phänomen'' tritt auch auf, wenn man nur Mit TurnEntity arbeitet und die Reihenfolge der einzelnen Turns unterschiedlich macht. Wink

Ich kann dir also nur ein paar Tipps dazu geben:

- Berechne Position und Drehwinkel mit Absolutangaben (PositionEntity und RotateEntity). Diese Methode eignet sich allerdings nicht so gut, wenn die Kamera auch an anderen Orten sein kann. Es ist nur gut, wenn Kamera immer die ''gleiche'' Position hat und sich nur das zu beobachtende wechselt usw...

- Verschiebe wie gewohnt deine Kamera aber korrigiere nach jedem Schleifendurchlauf die Entfernung der Kamera zum Objekt. Dann noch mit PointEntity die Kamera auf Objekt richten. Bei dieser Methode benötigst du kein TurnEntity mehr. Alles was du prüfen musst ist, ob der Winkel <> den Sollwinkel erreicht hat. So lange dieser Winkel nicht stimmt, bewegst du die Kamera bei Knopfdruck.

edit1: TurnEntity und MoveEntity und der gleichen sind schon sehr genau. Also keine so gravierende Rechenfehler. Wink
 

Scope

BeitragMi, Jul 04, 2007 14:04
Antworten mit Zitat
Benutzer-Profile anzeigen
ok danke Smile
jetzt denke ich hab ich es.
ich dachte wenn ich die kamera "nach oben" (also y achse) bewege, sind damit die koordinatenachsen des systems gemeint. jedoch ist es relativ zur blickrichtung.
das war mein fehler.
hab es jetzt ausgeglichen, indem ich die cam vor jedem drehen in eine einheitliche richtung schauen lasse -.-
danke für die hilfe

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Jul 04, 2007 18:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Für relatives Bewegen von Objekten mit Gloabeln Koordinaten gibt es ql:TranslateEntity
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group