Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

28.05.2009, 19:07

Wie berechne ich jetzt die Box für ein Subset?

Ich lad ja immer das ganze Mesh (m_Mesh) welches die einzelnen Subsets enthält:

C-/C++-Quelltext

1
m_Mesh->LockVertexBuffer(D3DLOCK_READONLY, (LPVOID*)&pVertices); 


Und dann bekomm ich ja die Vertices von allen Subsets zurück.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

12

28.05.2009, 19:22

dazu gibt es die funktion GetAttributeTable() funktion eines Mesh. die füllt dir ein array D3DXATTRIBUTERANGE. das ist eine struktur, und die member VertexStart und VertexCount gibt dir nen jewieligen anfang im vertexbuffer und anzahl der vertices eines subsets an.

d. h. für jedes D3DXATTRIBUTERANGE betrachtest du die vertices im Vertexbuffer von VertexStart mit VertexCount Vertices an und berechnest jewiels davon mit min/max die boundingbox.

13

28.05.2009, 19:27

Okay Danke! Ich werds probieren =)

14

29.05.2009, 09:10

So, also nach langem suchen hab ich jetzt was zusammenbasteln können:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
meshSpaceship->Optimize(D3DXMESHOPT_ATTRSORT, NULL, NULL, NULL, NULL, &meshSpaceship);
    DWORD dwTableSize = 0;
    D3DXATTRIBUTERANGE *pAttribTable = new D3DXATTRIBUTERANGE [dwTableSize];
    if (FAILED (meshSpaceship->GetAttributeTable (pAttribTable, &dwTableSize)))
    {
        //assert (0==1);

    }

    void* pVertices = NULL;



    struct sboundbox
    {
        D3DXVECTOR3 MinBounds;
        D3DXVECTOR3 MaxBounds;
    };
    sboundbox boundbox[dwTableSize];

    meshSpaceship->LockVertexBuffer(D3DLOCK_READONLY, (LPVOID*)&pVertices);

    for(i = 0; i < dwTableSize; i++)
    {
        

    D3DXComputeBoundingBox( (D3DXVECTOR3*)pAttribTable[i].VertexStart,
                            pAttribTable[i].VertexCount,
                            D3DXGetFVFVertexSize(m_dwFVF),
                            &boundbox[i].MinBounds,
                            &boundbox[i].MaxBounds);

      
    }

    meshSpaceship->UnlockVertexBuffer();


Da sind aber immer noch kleine Fehler (vll auch größere?) drin.

Zum ersten hab ich das Problem mit der Größenzuweisung des Arrays:

C-/C++-Quelltext

1
sboundbox boundbox[dwTableSize];


Hier sagt er mir, dass ich einen konstanten Wert brauche. Wie umgehe ich das?

Dann weiß ich auch nicht genau was hier rein muss:


C-/C++-Quelltext

1
2
3
4
5
    D3DXComputeBoundingBox( (D3DXVECTOR3*)pAttribTable[i].VertexStart,
                            pAttribTable[i].VertexCount,
          ---->           D3DXGetFVFVertexSize(m_dwFVF),  <------
                            &boundbox[i].MinBounds,
                            &boundbox[i].MaxBounds);


Also ich weiß das hier die Größe der Bytes zwischen den Vertices rein muss, aber wo genau krieg ich die jetzt her?


Ist sonst alles korrekt? Hab öfters noch was von der Funktion "GetLocal() oder sowas gelesen, aber das scheint mir schon veraltet zu sein, oder?


Danke schonmal für eure Hilfe =)

Mfg

PatrickB

15

29.05.2009, 09:33

Ah ok, bei der BoundingBox-Funktion muss rein - korrigiert mich wenn ich falsch liege:

Zitat

sizeof(sboundbox)



Edit:

Und bei

C-/C++-Quelltext

1
sboundbox boundbox[dwTableSize];


geht das wohl nur mit einem dynamischen Array, so wie ich das weiter oben schon habe, oder?



So siehts jetzt aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    meshSpaceship->Optimize(D3DXMESHOPT_ATTRSORT, NULL, NULL, NULL, NULL, &meshSpaceship);
    DWORD dwTableSize = 0;
    D3DXATTRIBUTERANGE *pAttribTable = new D3DXATTRIBUTERANGE [dwTableSize];
    if (FAILED (meshSpaceship->GetAttributeTable (pAttribTable, &dwTableSize)))
    {
        //assert (0==1);

    }


    meshSpaceship->LockVertexBuffer(D3DLOCK_READONLY, (LPVOID*)&pAttribTable);

    for(i = 0; i < dwTableSize; i++)
    {
        

    D3DXComputeBoundingBox( (D3DXVECTOR3*)pAttribTable[i].VertexStart,
                            pAttribTable[i].VertexCount,
                            sizeof(sboundbox),
                            &boundbox[i].MinBounds,
                            &boundbox[i].MaxBounds);

      
    }

    meshSpaceship->UnlockVertexBuffer(); 


Die Struktur hab ich zu Testzwecken global definiert mit einer festen Größe (ich weiß ja wieviele Subsets mein aktuelles Mesh hat).

Wenn ich das jetzt so habe stürzt das Programm ab.

16

29.05.2009, 17:19

So weit bin ich jetzt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    meshSpaceship->Optimize(D3DXMESHOPT_ATTRSORT, NULL, NULL, NULL, NULL, &meshSpaceship);
    
    //meshSpaceship->GetAttributeTable(0, &dwTableSize);

    D3DXATTRIBUTERANGE *pAttribTable = new D3DXATTRIBUTERANGE [dwTableSize];
    if (FAILED (meshSpaceship->GetAttributeTable(pAttribTable, &dwTableSize)))
    {
        assert (0==1);
    }
    VOID* pvoid; 
    test = pAttribTable[0].VertexStart;

    meshSpaceship->LockVertexBuffer(D3DLOCK_READONLY, (LPVOID*)&pvoid);

    for(i = 0; i < dwTableSize; i++)
    {
        
    
D3DXComputeBoundingBox((D3DXVECTOR3*)pvoid,
                            pAttribTable[i].VertexCount,
                            meshSpaceship->GetFVF(),
                            &boundbox[i].MinBounds,
                            &boundbox[i].MaxBounds);

      
    }

    meshSpaceship->UnlockVertexBuffer(); 


Für den Z-Wert ber boundbox bekomm ich jetzt schonmal den richtigen Wert (6.0) aber für den X und Y Wert bekomm ich irgendwas mit 728*10^20 oder sowas, jedenfalls sollte der Wert eigentlich auch zwischen 0 und 20 liegen.

Irgendwie liefert mir VertexStart immer 0 zurück, egal für welche pAttribTable...

17

30.05.2009, 10:59

Ok, habs jetzt doch eeeeeeeeeeeeeeendlich hinbekommen.

Jetzt will ich die Werte der 8 Eckpunkte des Quaders ausrechnen mit einer Funktion:

C-/C++-Quelltext

1
2
3
4
5
void GetBoundingBoxValues(D3DXVECTOR3 *array[8], D3DXVECTOR3 minBounds, D3DXVECTOR3 maxBounds)
{
    // We have min and max values, use these to get the 8 corners of the bounding box

    *array[0] = D3DXVECTOR3( minBounds.x, minBounds.y, minBounds.z ); // xyz

.....



Dazu rufe ich die Funktion so auf:

C-/C++-Quelltext

1
GetBoundingBoxValues(&boundboxlines, boundbox[0].MinBounds, boundbox[0].MaxBounds);


Mit:

C-/C++-Quelltext

1
D3DXVECTOR3 boundboxlines[8];


Und jetzt sagt er mir, dass:

Zitat

GetBoundingBoxValues' : Konvertierung des Parameters 1 von 'struct D3DXVECTOR3 (*)[8]' in 'struct D3DXVECTOR3 *[]' nicht moeglich


Was muss ich jetzt genau ändern? Kenne mich mit Arrays als Zeiger noch nicht so aus. Gegoogelt hab ich schon, aber nix passendes gefunden.

Danke schonmal.

18

30.05.2009, 14:49

Zitat von »"PatrickB"«

Was muss ich jetzt genau ändern? Kenne mich mit Arrays als Zeiger noch nicht so aus. Gegoogelt hab ich schon, aber nix passendes gefunden.

Hm, ohne die nötigen Grundlagen schon mit 3D Sachen anzufangen halte ich für keine gute Idee. Wirklich nicht.
Eigentlich musst du auch nur die Arrays übergeben, denn das sind immer Zeiger auf das jeweils erste Element im Arrays. Vielleicht sind es aber auch wirklich Doppelzeiger, ich hab zu GetBoundingBoxValues spontan nix gefunden.

Aber wie gesagt: Bevor die Grundlagen nicht sitzen, hat es keinen Sinn, komplexe Dinge zu machen. Wenn man für jede zweite Zeile im Code im Forum nachfragen muss, kommt man ja auch kaum voran.
Lieber dumm fragen, als dumm bleiben!

19

30.05.2009, 16:16

Ok, andere Frage.

Wenn ich in DirectX Lighting auf FALSE schalte, sieht man ja die Farben der Verices die ich mit dem FVF erstelle. Wenn ich Lighting auf TRUE schalte seh ich meine Meshes farbig. Wie kann ich beide Sachen gleichzeitg mit Farbe sehen? Also die Vertices nehmen immer die Farbe an des zuletzt geladenen Modells.

Danke schonmal

20

01.06.2009, 23:31

So, habe wieder ein Problem, bzw. habe ich bis dato ein Problem nicht richtig gelöst.

Und zwar geht es wieder um die BoundingBox.

Hier erstmal der Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
meshModel->GetAttributeTable(pAttribTable, &dwTableSize);

    VOID* pvoid; 
    boundbox = new sboundbox[dwTableSize];

    meshModel->LockVertexBuffer(D3DLOCK_READONLY, (LPVOID*)&pvoid);

    for(i = 0; i < dwTableSize; i++)
    {
    
    D3DXComputeBoundingBox((D3DXVECTOR3*)pvoid,
                            pAttribTable[i].VertexCount,
                            D3DXGetFVFVertexSize(meshModel->GetFVF()),
                            &boundbox[i].MinBounds,
                            &boundbox[i].MaxBounds);
}

    meshModel->UnlockVertexBuffer();


Der erste Parameter von D3DXComputeBoundingBox erwartet einen D3DXVECTOR3 Pointer der angibt, wo angefangen werden soll nach Maximum und Minimum zu suchen. VertexCount gibt die Länge des Subsets an.

Mein Problem ist jetzt, dass der Anfangswert eines Vertices ja nicht immer 0 ist bzw. pvoid. Also würd ich jetzt mit VertexStart angeben wollen, wo angefangen werden soll nach Minimum und Maximum zu suchen. Aber pAttribTable.VertexStart ist vom Typ DWORD.

Also weiß ich jetzt nicht wie ich der Funktion sagen kann wo sie anfangen soll :-/

Vielleicht könnt ihr mir ja helfen.


Mfg Patrick

Edit:

Hab mal bezüglich dessen etwas noch gefunden:

http://www.gamedev.net/community/forums/topic.asp?topic_id=341218

Er scheint annähernd die gleiche Problematik zu haben wie ich, hat aber keine Antwort auf seine Frage bekommen.

Werbeanzeige