Image rotation

Tags:    java

Her er igen et spørgsmål angående rotation.

Jeg vil lave et system så jeg jeg kan styre en person fra oven(top down shooter) i alle retninger, ligesom her: http://www.youtube.com/watch?v=lPWidEITYxk

Jeg ved ikke rigtig hvordan jeg skal lave det. Jeg kunne måske godt finde ud af noget vis jeg vidste hvordan Graphics2D.rotate() virkede.

Vis man forestiller sig at Graphics2D er et person der sidder ved et bor og tegner, så for rotate(Math.toRadians(180)) ham til at gå om på den anden side af bordet og tegne vidre, uden hensyn til at han har flyttet sig.

Det der undre mig er, at det ser ud som om "øverste venstre hjørne" stadig er i øverste venstre hjørne, selvom jeg syntes det ville være mest logisk at "øverste venstre hjørne" burde være flyttet ned i nederste højre hjørne.

det er lidt svært at forklare hvad jeg mener. Prøv at tegne et rektangel på et stykke papir, også lav en prik i øverste venstre højrne (0,0) så vend papiret 180 grader, og går det samme, og vend så papiret tilbage igen.



Brug rotate(double theta, double x, double y) metoden i stedet. Så specificerer du centrum, som der skal roteres omkring.

Jeg kunne forestille mig, at rotate(double theta) er implementeret noget i stil med:

public void rotate(double theta) {
rotate(theta, 0, 0);
}



Brug rotate(double theta, double x, double y) metoden i stedet. Så specificerer du centrum, som der skal roteres omkring.

Jeg kunne forestille mig, at rotate(double theta) er implementeret noget i stil med:

public void rotate(double theta) {
rotate(theta, 0, 0);
}


Jeg bruger også rotate(theta, x, y)...

Det jeg undre mig over er hvordan det fungere siden det punkt man tegner fra stadig er øverste venstre hjørne efter det er blevet roteret...



Ellers vis i har nogle eksempler, måske et spil med source code kunne det også være nice (helst i java)



Har tænkt lidt på: Tror i
Fold kodeboks ind/udKode 

vil virke?




Indlæg senest redigeret d. 30.10.2008 19:11 af Bruger #13669
definer din velocity som en vector:

velocity=x,y

x=velocity
y=0


velocity i retning af direction
x' = x cos direction - y sin direction
y' = y cos direction + x sin direction

opdater position
pos_x=pos_x+x'
pos_y=pos_y+y'

det kan godt være at du skal bytte rundt på x og y så:
x=0
y=velocity

dette antager selvfølgelig at du kan ligge hele velocity til position, men hvis du har en velocity på 100km i timen og opdater hvert minut skal du selvfølgelig kun ligge 1/60 af velocity til, dette kan gøre bare ved at gange med 1/60 til at begynde med så:
x=0*1/60
y=velocity*1/60



Indlæg senest redigeret d. 30.10.2008 19:14 af Bruger #5620
definer din velocity som en vector:

velocity=x,y

x=velocity
y=0


velocity i retning af direction
x' = x cos direction - y sin direction
y' = y cos direction + x sin direction

opdater position
pos_x=pos_x+x'
pos_y=pos_y+y'

det kan godt være at du skal bytte rundt på x og y så:
x=0
y=velocity

dette antager selvfølgelig at du kan ligge hele velocity til position, men hvis du har en velocity på 100km i timen og opdater hvert minut skal du selvfølgelig kun ligge 1/60 af velocity til, dette kan gøre bare ved at gange med 1/60 til at begynde med så:
x=0*1/60
y=velocity*1/60


Forstår ikke helt hvad der foregår.

Og betyder: x' = x cos direction - y sin direction

x' = x * cos direction - y * sin direction?

.:EDIT:.
har kigget lidt mere på det, og kan se at du næsten gør det samme som mig da begge de steder du ganger med y vil det give 0.

der for kan man forkorte det til:

x' = x cos(direction)
y' = x sin(direction)

og vis man flytter x om på den anden side, og kalder den velocity istedet for, ligner det meget det jeg har lavet.

Jeg gør ud fra at grunden til du har gjort det andet, er at det på en eller andet måde er matematisk korrekt. Jeg kan bare ikke lige spotte hvordan?



Indlæg senest redigeret d. 30.10.2008 19:31 af Bruger #13669
Det jeg skrev passede hvis velocity vectoren havde en værdi i både x og y, men det er rigtigt at når den kun har en værdi i x kan du fjerne de led der har med y at gøre.

og x' er den nye værdi for x mens x er den gamle værdi for x.



Et simpelt eksempel:
Fold kodeboks ind/udKode 




forstår stadig ikke det med yvelocity, men det gør ikke så meget. Tilgængeld er jeg nu stødt ind i endu et problem. Jeg har en tank jeg styre rundt på et Canvas. pilende til siderne formindster og forøger vinklen, mens opad for den til at køre fremad.

Problemet er bare, at velocity skal være rimlig høj for at det ser godt ud, da velocity = 1 kun giver 8 vejs rotation(pga. der kun er otte pixels runde om en pixel).

Er der nogen måde at løse det problem på?



t