Toon posts:

[c++/opengl] 2D objecten roteren

Pagina: 1
Acties:

Verwijderd

Topicstarter
Nu ik weer wat tijd over heb ik wil weer eens aan het programmeren gaan :). Ik heb zelf redelijk wat ervaring in het programmeren van games/VR dingetjes in java(java2d/java3d) enzovoorts. Maar, nu wil ik eens met c++ aan de gang.

Ik had bedacht eens te beginnen met een simpel 2d spelletje. Het eerste idee was om maar eens iets te ontwikkelen waarin je van bovenaf een auto of iets ziet en daarmee gewoon rondjes kunt rijden over het scherm.

Maar dan kom ik dus gelijk bij het eerste probleem. Ik wil natuurlijk dat autootje inladen vanuit een bestand, waarschijnlijk wordt het gewoon een plaatje(bitmapje, ofzo) en die wil ik dus inladen om zo de auto op beeld te toveren. Maar goed, dan komt het, als je stuurt moet het autootje dus draaien. Hoe gaan we dat doen? ;)

Ik heb al gezocht op GoT/Google en wat dingen gevonden over sprites enzo, maar volgens mij is dat niet wat ik zoek, sprites zijn namelijk meestal een X aantal plaatjes voor dus een vastgesteld aantal mogelijke rotaties van het auto(bijvoorbeeld 8, wat dus niet voldoende is :))

Bestaan er libraries voor c++/opengl om 2D objectjes te draaien onder elke gewenste hoek, of moet ik daar zelf iets voor schrijven?

edit: Ik weet dat het in java2d heel simpel is, je kunt gewoon tekenen op een canvas en vervolgens alles wat daarop staat draaien onder een bepaalde hoek en dan vervolgens dat op beeld tonen

[ Voor 9% gewijzigd door Verwijderd op 08-07-2004 12:00 ]


  • cenix
  • Registratie: September 2001
  • Laatst online: 22:40
Ik ben geen openGl guru maar kijk hier eens naar

http://www.parallab.uib.n..._html/ch05.html#id5544938

hierdoor kun je een bepaalde matrix wijzigen, waardoor een object te draaien is..
verder zijn er diverse tutorials te vinden (o.a. nehe.gamedev.net) waarop objecten kunnen draaien.

  • Timonv
  • Registratie: Mei 2004
  • Laatst online: 05-07-2024

Timonv

Eh?

No offense, maar heb je ueberhoud wel ervaring met C/C++? Direct games programmeren is in het algemeen sterk afgeraden. Ziazo kan je beter eerst beginnen met een tetris kloon oid. Daarbij komt ook nog eens dat je het basis proces van het programmeren van games in C goed moet kennen, en niet direct beginnen met pixelshaders en vertex shaders :p

Op http://www.gamedev.net/ staan een hoop goede tutorials en boek reviews. Mocht je meer ervaring hebben dan zou ik door gaan naar http://nehe.gamedev.net/, waar vrij diep het OpenGL library in C wordt toegeligt.

Bereid je maar voor op een hoop typwerk :)

Verwijderd

Het klinkt misschien raar, maar de makkelijkste manier om 2d objecten te roteren is door gebruik te maken van 3d. Je tekent je autootje als texture op een quad of op 2 triangles en roteert vervolgens dat 3d objectje. En als je dan toch al zo ver bent kan je net zo goed een 3d autootje gebruiken :) .

  • EfBe
  • Registratie: Januari 2000
  • Niet online
... en natuurlijk je view matrix in de 2D (orthogonal) projection zetten zodat je geen perspectief hebt. :)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
Timonv schreef op 08 juli 2004 @ 12:15:
No offense, maar heb je ueberhoud wel ervaring met C/C++? Direct games programmeren is in het algemeen sterk afgeraden. Ziazo kan je beter eerst beginnen met een tetris kloon oid. Daarbij komt ook nog eens dat je het basis proces van het programmeren van games in C goed moet kennen, en niet direct beginnen met pixelshaders en vertex shaders :p

Op http://www.gamedev.net/ staan een hoop goede tutorials en boek reviews. Mocht je meer ervaring hebben dan zou ik door gaan naar http://nehe.gamedev.net/, waar vrij diep het OpenGL library in C wordt toegeligt.

Bereid je maar voor op een hoop typwerk :)
Ik heb wel ervaring C/C++ ja, en nehe is me ook niet geheel onbekend. Ik heb wel her en der wat van die tutorials bekeken. Overigens heb ik ook al een keer voor een school opdracht(Inf, Hogeschool Enschede) een 3D wereldje gebouwd, om bekend te raken met opengl.
Verwijderd schreef op 08 juli 2004 @ 12:42:
Het klinkt misschien raar, maar de makkelijkste manier om 2d objecten te roteren is door gebruik te maken van 3d. Je tekent je autootje als texture op een quad of op 2 triangles en roteert vervolgens dat 3d objectje. En als je dan toch al zo ver bent kan je net zo goed een 3d autootje gebruiken :) .
Dat is wel een briljante idee :), gewoon een 3D vlak maken met de texture erop en dat vlak draaien...

Dus in principe is het idee gewoon dat je het exact hetzelfde programmeerd als een 3D wereldje maar dan van bovenaf gezien in orthogonal projection?
Dan kun je dus ook meteen wat diepte aanbrengen bij de objecten. Daarmee bedoel ik dat je zo heel makkelijk ervoor kunt zorgen dat de weg altijd onder de auto ligt, en een brug op een niveau daarboven, enzovoorts

Je bent een held, ik ga eens even aan de slag :) (eerst maar eens een window tevoorschijn toveren met sdl :))

Verwijderd

roteren van een punt is vrij simpel. je moet het punt van platte coordinaten converteren naar poolcoordinaten (niet perse nodig, als het al in poolcoordinaten is), draaien, en weer terugconverteren.

je kunt dit pixel voor pixel doen, of op vertex niveau. dat laatste is het efficientste (snelste, minste werk).

stel je hebt een 2d vector v dan kun je hem zo roteren over hoek phi in vector q:

q.x = v.x * cos(phi) + v.y * sin(phi)
q.y = v.y * cos(phi) - v.x * sin(phi)

waarschijnlijk heb ik wat +'jes en minnetjes verwisseld, maar in iedergeval zie je dat wanneer phi 0 is, cos(phi) 1 is en sin(phi) 0 is, waardoor q.x = v.x * 1 en q.y = v.y * 1, wat betekent dat hij bij phi=0 niet gedraaid wordt (simpele check).

met deze simpele gonio kun je dus vertices en pixels roteren. (ze worden nu om punt 0,0 gedraaid).

edit:


overigens moet je wanneer je per pixel gaat roteren, het target pixel voor pixel afgaan (van xmin ... xmax en ymin... ymax), en de punten geroteerd uit je bron plaatje halen. dit voorkomt dat er pixels wegvallen door afrondingsfouten. het is intuitiver om het andersom te doen, van de bron alle x'jes en y'tjes af te gaan en ze geroteerd te tekenen, zoals ik het de 1e keer ook deed, maar dan zie je van het resultaat niet echt blij wordt...

[ Voor 23% gewijzigd door Verwijderd op 08-07-2004 14:00 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hoezo inefficient ;)
Als je echt zelf sprites pixel voor pixel geroteerd wilt tekenen, dan kun je beter gewoon een bounding box om de geroteerde sprite heen zetten, en dan bepalen welke texel hoort bij de linkerbovenhoek. Vervolgens bereken je een right en een down vector, wat de verschillen zijn van de x- en y-coordinaten in het plaatje als je op het scherm 1 pixel naar rechts of naar onderen zou bewegen. Vervolgens is het een kwestie van de bounding box op het scherm afscannen van links naar rechts, van boven naar onder, door simpele optellingen.

Een nog beter methode is gewoon het bovenste hoekpunt van de geroteerde sprite op het scherm te bepalen, right en down vectors voor op het scherm te berekenen, evenals die voor in image space, en dan effectief alle scanlines af te gaan, eveneens door simpele optellingen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

klopt helemaal, maar aangezien ruuddie al erg blij was met het idee van tekenen op- en roteren van triangles/quads vond ik het niet relevant al te diep in te gaan op optimalisaties van handmatige texturemapping, ik vermeldde slechts het ongeoptimaliseerde handmatig pixelen voor de volledigheid en omdat het aansloot bij het handmatig roteren van vertices met behulp van wat gonio. ahum.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
oisyn legt mooi uit hoe een rotozoomer werkt :) ah.. the good old days.. :)

[ Voor 28% gewijzigd door EfBe op 08-07-2004 20:35 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

glRotate() ????
8)7
Pagina: 1