[C# / D3D] Render mesh voor camera

Pagina: 1
Acties:

  • Vambier
  • Registratie: Augustus 2004
  • Laatst online: 21-04 14:15
Ik weet 't, 't is een beetje 'n vreemde titel, maar waar 't om draait is 't volgende :

We zijn met 4 man bezig voor school met een schooter, maar er is 1 ding wat maar niet wil lukken.

We werken met Direct3D en willen hiermee een wapen renderen voor de camera. Hierdoor lijkt het dus net(net als bij andere shooters) of je het wapen vast hebt.

Ik heb al van alles geprobeerd om dit wapen voor de camera te krijgen, maar het beste wat er uit gekomen is is dat het wapen op een vaste plaats in de wereld gerenderd wordt ten opzichte van de speler. Maar dit was dus niet echt de bedoeling, hij moet dus met de camera mee bewegen.

We werken met managed directx met c#.

Als er iemand is die me kan helpen... graag!! :)

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

http://pluralsight.com/wi...ctX.Direct3DTutorialIndex
http://www.gamedev.net/reference/list.asp?categoryid=24

op deze 2 links heb ik m'n tutorial managed D3D geleerd.

je hebt 3 transformatie matrices, en voor zover ik weet past wat jij wilt daar niet in, tenzij:
je kan ook rechtstreeks tov de view renderen als je met TransFormedColor punten werkt (of zoiets)
dit is wsch wat je nodig hebt.

ASSUME makes an ASS out of U and ME


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Of je moet zorgen dat je wapen dezelfde transform matrix gebruikt als die van je camera. Je camera heeft tenslotte ook een matrix voor zijn locatie en orientatie.
Volgens mij kan je het dan ook zo oplossen door de goede matrixen te gebruiken.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Vambier
  • Registratie: Augustus 2004
  • Laatst online: 21-04 14:15
thnx, ik zal inderdaad eens gaan kijken of ik het met de matrix van de camera kan oplossen.

Als het gelukt is laat ik het wel even horen (als het niet lukt ook trouwens :9 )

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Volgens mij worden alle objecten eerst met zijn world matrix vermenigvuldigd en daarna met de view matrix en daarna met de projection matrix.

De view matrix is de matrix die de locatie van de camera bepaald. Ik weet niet helemaal hoe het in DirectX ( of opengl ) precies werkt. Als je de View matrix voor een enkel object los in kunt stellen kun je zorgen dat hij voor je wapen op een matrix staat die niks veranderd ( een identity matrix als ik me niet vergis ). Als dat niet mogenlijk is zou je ook je world matrix kunnen vermenigvuldigen met de inverse van de view matrix.

Verder moet je er dan alleen voor zorgen dat je world matrix goed staat ingesteld voor je geweer.

[disclaimer]
Ik zeg dit alleen uit de beperkte theorethische kennis die ik er van heb. Nog nooit echt zelf serieus mee bezig geweest.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

En wat nou als je een 2d afbeelding neemt van je wapen en die buiten je 3d engine rendert bovenop je 3d engine output? Weliswaar niet de netste manier maar wel de simpelste.

[ Voor 19% gewijzigd door Verwijderd op 18-10-2005 23:22 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op dinsdag 18 oktober 2005 @ 23:16:
En wat nou als je een 2d afbeelding neemt van je wapen en die buiten je 3d engine rendert bovenop je 3d engine output? Weliswaar niet de netste manier maar wel de simpelste.
Dat kan wel als je wapen nooit beweegt. Maar tegenwoordig wil je waarschijnlijk ook dat je wapen beweegt als je loopt of wil je ook dat de belichting op je wapen klopt. Daar kom je dan al snel mee in de problemen als je het als simpele texture renderd.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Vambier
  • Registratie: Augustus 2004
  • Laatst online: 21-04 14:15
Ja, heb er inderdaad over nagedacht om als laatste (tijdelijke) oplossing een sprite te gebruiken. Dit vooral door de tijdsdruk, en het blijft natuurlijk een project voor school. Dus is het belangrijkste dat het af is.
Maar het lieftst willen we gewoon een mesh die we altijd zo kunnen renderen dat hij voor de camera zit.

Ik heb nog geprobeerd om de mesh op de matrix van de camera te krijgen, maar dit was jammer genoeg zonder succes:(

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Heb je ook geprobeerd om voor dat object de world matrix te vermenigvuldigen met de inverse van de view matrix?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • roelboel
  • Registratie: Oktober 2005
  • Laatst online: 12-12-2025
Als je het object dat stil moet staan eerst transformeert met de inverse van je view matrix (maar dan zonder projectie, dus alleen het rotatie/translatie) en je transformeert 'm daarna net zoals je andere objecten die je wel om je heen wilt hebben zoals boompjes enzo, zal hij stil staan, maar wel correct geprojecteerd worden. De inverse van de view maal de view levert gewoon een identiteitsmatrix op, en daarna hoeft hij alleen nog geprojecteerd te worden. (disclaimer: dit is uit m'n blote hoofd ;) )

[ Voor 23% gewijzigd door roelboel op 19-10-2005 13:33 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Gewoon de viewmatrix op identity zetten zodra je het wapen gaat renderen. Het wapen staat dan op de locatie van de camera, dus waarschijnlijk wil je de object matrix van het wapen zo instellen dat hij iets naar voren, onderen en naar rechts oid staat.

.edit: overigens heeft d3d geen aparte projection matrix, die zit bij de viewmatrix in, dus je zult een neutrale viewmatrix met projection erin moeten instellen.

[ Voor 26% gewijzigd door .oisyn op 19-10-2005 13:58 ]

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.


  • Vambier
  • Registratie: Augustus 2004
  • Laatst online: 21-04 14:15
thnx!!!!! Ik heb inderdaad m'n object vermenigvuldigd met de inverse van de view matrix en 'm daarna in m'n world space gezet.... En 't werkte!!!!

Iedereen hardstikke bedankt voor de reacties!!!!

Als ons spel af is post ik wel een keer een url waar deze te downloaden is.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

[rml][ games] post hier je eigen brouwsel(s)..[/rml] ;)

Hoewel je huidige aanpak uiteraard werkt, is het nogal krom. In feite is je wapen een UI element, niet iets dat zich in de wereld bevindt. Het is daarom ook onlogisch om de huidige cameraopstelling daarvoor te gebruiken; je kunt beter met een nieuwe opstelling beginnen in dezelfde frame, waarin je dan tevens alle andere UI elementen gaat renderen

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.


  • Vambier
  • Registratie: Augustus 2004
  • Laatst online: 21-04 14:15
Ja 't is nog niet precies zoals 't zou moeten inderdaad, maar voorlopig is dit even goed genoeg.
Het wapen staat welliswaar in de wereld, maar voor de andere spelers wordt dit wapen dan ook niet gerenderd.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 26-04 10:16
.oisyn schreef op woensdag 19 oktober 2005 @ 14:00:
Hoewel je huidige aanpak uiteraard werkt, is het nogal krom. In feite is je wapen een UI element, niet iets dat zich in de wereld bevindt. Het is daarom ook onlogisch om de huidige cameraopstelling daarvoor te gebruiken; je kunt beter met een nieuwe opstelling beginnen in dezelfde frame, waarin je dan tevens alle andere UI elementen gaat renderen
Sorry hoor, maar in 3D engines wordt het wapen over het algemeen gewoon als onderdeel van de wereld gerendered, op min of meer de zelfde plaats als de camera, omdat de belichting e.d. ook moet kloppen. Als je onder een rooie lamp doorloopt wil je graag dat 't wapen ook rood wordt.

En als dit niet is wat jij bedoelt dan heb ik je verkeerd begrepen :)

https://niels.nu


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Geeft niets ;)
maar in 3D engines wordt het wapen over het algemeen gewoon als onderdeel van de wereld gerendered, op min of meer de zelfde plaats als de camera, omdat de belichting e.d. ook moet kloppen.
Valide punt idd. Máár: ten eerste wil je niet dat je wapen een schaduw cast op de wereld terwijl het wel selfshadowing doet, en ten tweede is je wapen over het algemeen een special case dat je graag wilt laten zien in een wat hogere resolutie en wat mooiere special effects. En het is bovendien vrij simpel om de lichten op te vragen die je wapen zouden beïnvloeden.

In de games die ik tot nu toe gemaakt heb (op professionele basis, Project: Snowblind is de meest recente met zo'n wapen, Tomb Raider 7 waar we nu aan werken is 3rd person dus geen wapen :P), en de games waar ik de internals best wel van ken, renderen het wapen als een aparte scene in een frame :)

Daarnaast is het natuurlijk gewoon dubbel-op: een inverse view-matrix berekenen en die vermenigvuldigen met de world matrix, zodat de vermenigvuldiging met de uiteindelijke viewmatrix weer weggestreept wordt: W * V-1 * V * P = W * P ;)

[ Voor 19% gewijzigd door .oisyn op 19-10-2005 17:05 ]

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.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
.oisyn schreef op woensdag 19 oktober 2005 @ 16:54:
[...]
Daarnaast is het natuurlijk gewoon dubbel-op: een inverse view-matrix berekenen en die vermenigvuldigen met de world matrix, zodat de vermenigvuldiging met de uiteindelijke viewmatrix weer weggestreept wordt: W * V-1 * V * P = W * P ;)
Dus wat ik eigenlijk al meteen zei :P
rwb schreef op dinsdag 18 oktober 2005 @ 15:01:
Als je de View matrix voor een enkel object los in kunt stellen kun je zorgen dat hij voor je wapen op een matrix staat die niks veranderd ( een identity matrix als ik me niet vergis ).

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Vambier
  • Registratie: Augustus 2004
  • Laatst online: 21-04 14:15
In de games die ik tot nu toe gemaakt heb (op professionele basis, Project: Snowblind is de meest recente met zo'n wapen, Tomb Raider 7 waar we nu aan werken is 3rd person dus geen wapen :P), en de games waar ik de internals best wel van ken, renderen het wapen als een aparte scene in een frame :)
Hoe kun je een wapen dan als een aparte scene in een frame renderen?

  • roelboel
  • Registratie: Oktober 2005
  • Laatst online: 12-12-2025
Waarschijnlijk is het het makkelijkste een aparte vertex shader te gebruiken die de vertices alleen projecteert. Dan doe je een aparte pass voor het wapen met deze vertex shader. Daar had ik in m'n vorige gepost nog niet over gepraat, ik nam ook maar aan dat jullie alleen de fixed function pipeline gebruiken.

  • Vambier
  • Registratie: Augustus 2004
  • Laatst online: 21-04 14:15
Hmm, we waren nog niet echt bij vertex shaders aanbeland :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Vambier schreef op woensdag 19 oktober 2005 @ 19:47:

Hoe kun je een wapen dan als een aparte scene in een frame renderen?
Een nieuwe scene beginnen is een kwestie van de zbuffer clearen. Alles wat je dan rendert komt over datgene wat er al staat.

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.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

roelboel schreef op woensdag 19 oktober 2005 @ 19:55:
Waarschijnlijk is het het makkelijkste een aparte vertex shader te gebruiken die de vertices alleen projecteert. Dan doe je een aparte pass voor het wapen met deze vertex shader. Daar had ik in m'n vorige gepost nog niet over gepraat, ik nam ook maar aan dat jullie alleen de fixed function pipeline gebruiken.
Waarom zou je een aparte vertex shader gebruiken als je simpelweg een matrix in kunt stellen?

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.


  • Vambier
  • Registratie: Augustus 2004
  • Laatst online: 21-04 14:15
Een nieuwe scene beginnen is een kwestie van de zbuffer clearen. Alles wat je dan rendert komt over datgene wat er al staat.
Maar dan wordt het wapen toch nog steeds als een onderdeel van de wereld gerendert?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Definieer "als onderdeel van de wereld gerenderd worden". Als je een lege zbuffer hebt dan verschijnt het wapen dus ook niet achter andere dingen. Je moet je verdere scene-setup uiteraard ook doen (andere viewmatrix, render states, etc.)

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.


  • roelboel
  • Registratie: Oktober 2005
  • Laatst online: 12-12-2025
.oisyn schreef op donderdag 20 oktober 2005 @ 00:21:
[...]
Waarom zou je een aparte vertex shader gebruiken als je simpelweg een matrix in kunt stellen?
Een goede vraag, mijn opmerking valt bij nader inzien onder de categorie "brainfarts". :) Geen aparte v. shader gebruiken dus.

[ Voor 8% gewijzigd door roelboel op 20-10-2005 13:36 ]


  • Vambier
  • Registratie: Augustus 2004
  • Laatst online: 21-04 14:15
.oisyn schreef op donderdag 20 oktober 2005 @ 13:25:
Definieer "als onderdeel van de wereld gerenderd worden". Als je een lege zbuffer hebt dan verschijnt het wapen dus ook niet achter andere dingen. Je moet je verdere scene-setup uiteraard ook doen (andere viewmatrix, render states, etc.)
Ach nou begrijp ik 'm. Dat is inderdaad nog niet zo'n gekke oplossing :) Ik zal eens kijken of ik dat in kan bouwen.
Pagina: 1