[C# / Direct3D] Meerdere modellen transform. naar worldcoord

Pagina: 1
Acties:

  • VyperX
  • Registratie: Juni 2001
  • Laatst online: 16-02 16:12
Hoi,

Gisteren ben ik begonnen met mijn eerste stappen in C# en DirectX. Ik wil uiteindelijk gaan proberen om een Pong3D spel te maken. Ik kan vrij goed overweg met C en heb hiervoor ook al een keer gewerkt met Java3D.

Ik ben begonnen met de tutorial die ik heb gevonden op http://users.pandora.be/riemer/ en dit lukte me goed. Snapte ook redelijk goed wat ik aan het doen was enzo.

Ik heb nu echter een probleem omdat ik niet goed weet hoe ik nu verder moet. Het is namelijk zo dat in de tutorial maar op 1 plek een transformatie wordt toegepast op het _gehele_ wereld model.

Namelijk op deze manier:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    this.vertices = new CustomVertex.PositionColored[3];
    this.vertices2 = new CustomVertex.PositionColored[3];
    // code om de vertices te vullen en te kleuren.
...
    // vid_dev is een Direct3D.Device
    vid_dev.BeginScene();

    vid_dev.Transform.World = Matrix.RotationY(angle);

    vid_dev.VertexFormat = CustomVertex.PositionColored.Format;
    vid_dev.DrawUserPrimitives(PrimitiveType.TriangleList, 1, vertices);
    vid_dev.DrawUserPrimitives(PrimitiveType.TriangleList, 1, vertices2);

            vid_dev.EndScene();


Ik heb hier dus 2 vertex arrays, die beiden zijn opgebouw met modelcoordinaten. Ik wil deze 2 "modellen" nu ook op verschillende plekken toevoegen in mijn scene. Het probleem hierbij is dat ik niet heb kunnen vinden hoe ik een Translation/Rotation uitvoer op zo'n model (vertex array).

Bij Java3D kon je aan de base_node transformatie groepen vastmaken, die weer bepaalde modellen bevatte. Zo'n model kon vervolgens weer transformatie groepen bevatten, enz. Hiermee beschreef je dus de hele scene, waarbij alle modellen gewoon hun eigen coordinatenstelsels hadden.

Kan je deze methodiek (die ik zelf erg mooi/logisch vind) ook standaard gebruiken bij Direct3D?
Ik heb zelf al geprobeerd te zoeken in de MSDN Library, maar heb niks nuttigs kunnen vinden. (Misschien komt dit doordat ik niet ervaren ermee ben, maar goed...) Ook in andere tutorials die ik heb gevonden wordt alleen gebruik gemaakt van die "vid_dev.Transform.World".

Ik kan me evt voorstellen dat je wel zelf alle vertices moet samenvoegen tot 1 worldmodel en daar dan een transformatie op toepassen, maar dan vraag ik me dus af waar de functionaliteit is voor het transformeren en samenvoegen van de losse modellen.

[edit]
*zucht*
Misschien moet ik toch meer proberen te testen voordat ik domme vragen ga stellen.

Door een andere Transform.World door te geven voordat ik het tweede model Draw, kan je deze een andere transformatie geven...

Alsnog blijf ik de methode van Java3D handiger vinden... Daarbij kan je modellen aan elkaar vastmaken, waarbij de transformaties gewoon "bij elkaar optellen". Blijft alsnog de vraag of dat kan in Direct3D...

[ Voor 10% gewijzigd door VyperX op 08-02-2005 16:25 ]

My Dwarf Fortress ASCII Reward: ~~@~~####,.".D",.B""


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15-05 03:15

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik kan me evt voorstellen dat je wel zelf alle vertices moet samenvoegen tot 1 worldmodel en daar dan een transformatie op toepassen
Je kunt natuurlijk ook gewoon meerdere transformaties achter elkaar toepassen door transformatiematrices met elkaar te vermenigvuldigen.

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.


  • VyperX
  • Registratie: Juni 2001
  • Laatst online: 16-02 16:12
.oisyn schreef op dinsdag 08 februari 2005 @ 16:40:
[...]


Je kunt natuurlijk ook gewoon meerdere transformaties achter elkaar toepassen door transformatiematrices met elkaar te vermenigvuldigen.
Tuurlijk, maar dat was niet helemaal wat ik bedoelde.
Ik bedoelde eigenlijk dat je 1 World-model creeert door het samenvoegen van verschillende getransformeerde modellen (vertex arrays). In het World-model staan dan alle objecten al op hun goede plek in World-space, en worden daarna door een World- en View-transform klaargemaakt om te worden weergegeven. (De Projection-transform.)

Dit blijft natuurlijk nog steeds mogelijk, maar dan zit je in feite het wiel opnieuw uit te vinden... Er is voor zover ik heb kunnen vinden geen ingebouwde functionaliteit om model-coordinaten te kunnen transformeren met de aanwezige matrices.

Ik zou iets willen als:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    VertexGroup top_vertex = new VertexGroup();
    VertexGroup low_vertex = new VertexGroup();

    vertices = new CustomVertex.PositionColored[10];
    vertices2 = new CustomVertex.PositionColored[10];
    // vul vertices met posities en kleuren

    low_vertex.SetVertices(vertices);

    TransformGroup low_trans = new TransformGroup(low_vertex, Matrix.RotateZ(5.0f));
    top_vertex.SetVertices(vertices2);
    top_vertex.AddGroup(low_trans);

    device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, top_vertex);


Dit is zo'n beetje hoe het werkt in Java3D... Tis maar wat je gewend bent :)

My Dwarf Fortress ASCII Reward: ~~@~~####,.".D",.B""


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15-05 03:15

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ah, ik begreep je verkeerd. Ik dacht namelijk dat je zei dat je maar 1 matrix tot je beschikking had om vertices te transformeren, en ik had je edit even gemist :).

Ik vermoed overigens dat je aanpak verkeerd is. De worldmatrix is voor de transformatie van object naar world space. Verder heb je nog de view en projection matrix, die resp van world naar cameraspace naar canonical viewspace. In de viewmatrix stop je dus je "camera", en in de world matrix de orientaties van je modellen. En uiteraard kun je tussen drawprim calls altijd een andere matrix zetten ;)

Wat jij wil is een scenegraph, dat staat geheel los van een renderer. Direct3D biedt je alleen de mogelijkheid om polygonen te plotten (simpel gezegd). Daar bovenop kan weer een scenegraph liggen, maar die is niet impliciet gekoppeld aan een renderer. Je physics systeem moet er tenslotte ook gebruik van kunnen maken, om een voorbeeld te noemen.

Java3D biedt je echter alleen de scenegraph zelf met wat voorgedefinieerde features. Erg onhandig als je wat meer wil dan het renderen van een standaard 3d wereld. Maar goed, Java heeft er sowieso wel een handje van om zo groot mogelijke omwegen te creëren om iets te kunnen doen ;)

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.