warscheinlich problem mit runden bei turnentity
Übersicht

ScopeBetreff: warscheinlich problem mit runden bei turnentity |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Gib mal den Code...dann wird es leichter für uns zu antworten ![]() |
||
Scope |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
meinst DU ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() und meine frage ist eben wieso das und ob man das ändern kann / oder ich was vollkommen falsch mache/verstehe mfg scope |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() mfg Scope |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() 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. ![]() |
||
Scope |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ok danke ![]() 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 |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group