webForumDet fria alternativet

cos o sin. flytta en bil

Programmering

17 svar · 436 visningar · startad av Alpha II

Medlem sedan maj 20002 993 inlägg
Frågan#1

Hej!
Jag förstår inte riktigt funktionerna cos och sin.
I ett 2d spel jag tidigare gjort fungerade det att skriva:

player.xpos := player.xpos + sin(player.angle);
player.ypos := player.ypos + cos(player.angle);

För att få ut den nya positionen av spriten.

Nu försöker jag göra ett 3d bilspel i opengl. Av någon anledning fungerar inte samma kod som fungerade i 2d spelet. Bilen flyttas åt alla möjliga konstiga håll. Och nästan aldrig åt hållet den står riktad mot.

Hur ska jag göra? :q

Medlem sedan juni 200010 432 inlägg
#2

Är ingen guru på OpenGl... men eftersom det är 3D du snackar om så kanske det kan tänkas att du måste ta med Z och inte bara x och y?

Medlem sedan maj 20002 993 inlägg
#3

jo men det har jag gjort. det är x och z positionerna jag ändrar.

Medlem sedan juni 20001 257 inlägg
#4

Jag tycker det ser ut som att det är x- och y-positionerna du ändrar?

Medlem sedan maj 20018 027 inlägg
#5

Kan inte heller något om OpenGL, men jag fick en tanke om att det kanske är något skumt med vinklarna. Är du säker på att du använder vinkeln mot en axel i xy-planet? I en 3D-värld kan du ju även ha vinklar jämfört med xy-planet (alltså snett uppåt).

Medlem sedan maj 20002 993 inlägg
#6

Min kod:

procedure glDrawScene();
begin
  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();

  gluLookAt(0.0, 5.0, 20.0,
            0.0, 0.0, 0.0,
            0.0, 1.0, 0.0);

  glBindTexture(GL_TEXTURE_2D, texture[0]);
  glBegin(GL_QUADS);
    glTexCoord2f(20.0, 0.0); glVertex3f(10.0, 0.0, -10.0);
    glTexCoord2f(0.0, 0.0); glVertex3f(-10.0, 0.0, -10.0);
    glTexCoord2f(0.0, 20.0); glVertex3f(-10.0, 0.0, 10.0);
    glTexCoord2f(20.0, 20.0); glVertex3f(10.0, 0.0, 10.0);
  glEnd();

  glBindTexture(GL_TEXTURE_2D, texture[1]);
  glTranslatef(player.xpos, 0.2, player.zpos);
  glRotatef(Player.angle, 0.0, 1.0, 0.0);
  Car.Draw;
end;

Och i loopen

            glDrawScene();
            SwapBuffers(h_DC);

            if keys[VK_LEFT] then Player.angle := Player.angle + 1.0;
            if keys[VK_RIGHT] then Player.angle := Player.angle - 1.0;
            if keys[VK_UP] then begin
              player.xpos := player.xpos + sin(player.angle)/10;
              player.zpos := player.zpos + cos(player.angle)/10;
            end;
            if keys[VK_DOWN] then begin
              player.xpos := player.xpos - sin(player.angle)/10;
              player.zpos := player.zpos - cos(player.angle)/10;
            end;
Medlem sedan aug. 2001723 inlägg
#7

Vad är "angle" i ditt program? Vad jag kan förstå så är det samma vinkel som i 2D-spelet, dvs höjdled ingår inte. Rätta mig om jag har fel. Det betyder i så fall att koden ska se ut precis som den gjorde innan, dvs x och y ska ändras men inte z som du har gjort.

Medlem sedan juli 2002581 inlägg
#8

För 3D-programmering underlättar det starkt att läsa Linjär algebra på Universitetet eller läsa Matte F + Matte G på gymnasiet.

Medlem sedan maj 20002 993 inlägg
#9

Um... jag går i 9an ;)
Ingen som vet hur fan man räknar ut vart bilen kommer att flyttas med sin och cos? Kom på att jag använde cos256 och sin256 i mitt 2D spel... det var några special funktioner som följde med DelphiX, Men det borde väl gå att räkna ut det genom att använda samma formel som i en analog klock, fast man ändrar från 60 möjliga positioner till 360? :q

Medlem sedan maj 20002 993 inlägg
#10

Någon som vet hur man räknar ut positionerna i en analog klocka? jobbigt att söka eftersom man får mest svar om hur man gör det i javascript med google :p

Medlem sedan aug. 2000234 inlägg
#11

http://nehe.gamedev.net/ finns det tutorials skrivna i C++, men oftast portade till flera andra språk/utvecklingsmiljöer. Däribland delphi.

Medlem sedan maj 20002 993 inlägg
#12

Det vet jag... brukar surfa där ganska ofta. men jag hittar inget där om just det här :(

Medlem sedan maj 20018 027 inlägg
#13

Alpha II skrev:

Någon som vet hur man räknar ut positionerna i en analog klocka? jobbigt att söka eftersom man får mest svar om hur man gör det i javascript med google :p

Vad har analoga klockor med saken att göra?

Om det är enheten på vinkeln du är ute efter, då är frågan snarare om du har grader eller radianer. Det troliga är att sin och cos jobbar med radianer. I så fall får du relativt stora vridningar på din bil varje gång du trycker ner en piltangent (och därmed vrider bilen 1 radian). Du kanske skulle skala ner de vridningar av bilen som görs.

Medlem sedan maj 20002 993 inlägg
#14

Jaså, men hur gör jag det?
Anledningen till att jag tänkte på en analogklocka är ju att i en sån finns det ju 60 olika positioner pekarna kan vara på, tänkte om man kunde modifiera det till 360.... :OO

Medlem sedan maj 20018 027 inlägg
#15

Alpha II skrev:

Jaså, men hur gör jag det?

För att skala ner vinklarna, menar du? Om du vill veta hur stora vinklar du rör dig med, då gäller följande grundförutsättningar:

Ett varv =

  • 360 grader
  • 2*pi eller med andra ord ca 6,28 radianer.

När du ökade/minskade din vinkel med 1,0, då svängde du alltså bilen nästan 60 grader. Om du vill konvertera en vinkel i grader till samma i radianer, då får du räkna ut:

vinkelRadianer = vinkelGrader*6,28/360

Sedan kan du räkna med radianvinkeln i dina formler.

Medlem sedan maj 20002 993 inlägg
#16

Coolt, det ska jag testa :) Det var nått sånt jag ville åstakomma :)

Vad är radianer??

Medlem sedan maj 20018 027 inlägg
#17

Alpha II skrev:

Vad är radianer??

Det är ett speciellt vinkelmått som brukar användas mer eller mindre standardmässigt i alla sin- cos- och tan-funktioner. Du har 2*pi (ung. 6,28) radianer på ett varv. Måttet kan härledas till den så kallade enhetscirkeln. En enhetscirkel är en cirkel med radie=1. Utgår du från exakt samma längdenhet som när du mätte radien, kommer omkretsen på denna enhetscirkel vara 2*pi, dvs ungefär 6,28. Som du ser så är radian-vinkeln direkt kopplad till cirkelns egna mått. Skulle du utgå från grader (360 på ett varv), då skulle du behöva konvertera den där omkretsen för att få det rätt. Radianer skulle du alltså kunna betrakta som "det naturliga vinkelmåttet". Det är därför radianer används i så hög utsträckning.

Medlem sedan maj 20002 993 inlägg
#18

Yahoo! Det fungerade perfect :D
Tack UlfT!

Nu behöver jag nån kod så att kameran alltid följer bilen *svårt*

273 ms totalt · 2 externa anrop · v20260731065814-full.2ae45ccc
130 ms — hämta statistik (db)
140 ms — hämta tråd, inlägg och bilagor (db)