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

1

08.10.2009, 00:04

D3DXIntersectTri() Funktion ohne Mesh

Hallo,

ich lese mich gerade in das Thema picking / Kollisionserkennung ein und bin auf die D3DXIntersectTri() Funktion gestoßen, die mir da ja weiter helfen sollte. Bei msdn ist sie unter Mesh Functions aufgeführt. Heisst das, dass ich unbedingt ein Mesh dafür brauche oder geht das auch wenn ich den Vertex / Indexbuffer "manuell" fülle? Wann ja wie komme ich an die Daten für die drei Vektoren ? Ich kann doch nicht jedes mal die Buffer Locken, das wäre doch sehr unperformant oder?

gibt es noch andere Lösungen ?

danke Ludwig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

08.10.2009, 09:00

Re: D3DXIntersectTri() Funktion ohne Mesh

Zitat von »"Ludwig"«

Heisst das, dass ich unbedingt ein Mesh dafür brauche oder geht das auch wenn ich den Vertex / Indexbuffer "manuell" fülle?


Siehst du in der Parameterliste der Funktion irgendwo ein Mesh? ;)

Zitat von »"Ludwig"«

Wann ja wie komme ich an die Daten für die drei Vektoren ? Ich kann doch nicht jedes mal die Buffer Locken, das wäre doch sehr unperformant oder?


Ja das wäre es. Wenn es um so Dinge wie Physik oder andre Berechnungen geht hält man sich normalerweise entsprechende Daten im RAM. In den Vertex/IndexBuffern steht was gezeichnet wird. Für Kollisionsabfragen werden z.B. Texturkoordinaten oder die Vertexfarbe sowieso irrelevant sein. Du kannst also auch eine zweite Version von deinem Modell mit reduzierter Dreiecksanzahl (Für Kollisionstests reicht meist wenn das "Physikmodell" in etwa gleiche Umrisse aber viel weniger Detail hat) und entsprechend für Kollisionstests aufbereitet (vielleicht in einer Datenstruktur die es erlaubt Schnittpunkte schneller zu finden: Octree, BSP-Tree, kd-Tree, BVH, ...) im RAM ablegen mit dem die CPU arbeitet...

3

10.10.2009, 14:34

ok, danke ich habe jetzt eine abgespeckte Version in RAM. Das nächste Problem ist, das das picking nicht 100 % funktioniert. Es ist "relativ" genau aber wenn ich meinen Würfel drehe kann es sein das er keine Schnittpunkte erkennt :( (der Würfel besteht aus 27 kleinen Würfeln). Habe ich noch etwas vergessen damit es klappt?

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
36
37
38
39
40
41
42
43
44
45
46
// Viewport holen

    D3DVIEWPORT9 vp;
    if(FAILED(g_pD3DDevice->GetViewport(&vp)))
        std::cout << "GetViewport : FEHLER";

    //Mauskoordinaten umrechnen

    int x = (vp.Width - g_currentMousePositionX) - (vp.Width / 2);
    int y = (vp.Height - g_currentMousePositionY) - (vp.Height / 2);

    //die Koordinaten in 1 bis -1 umrechnen

    double xNorm = double(x) / double(vp.Width / 2);
    double yNorm = double(y) / double(vp.Height / 2);

    D3DXVECTOR3 rayStart(xNorm, yNorm, 0.0f);
    D3DXVECTOR3 rayDirection(0.0f, 0.0f, 1.0f);
    D3DXVECTOR3 rayTransformed(0.0f, 0.0f, 0.0f);

    D3DXVECTOR3 vector4, vector5, vector6;

    float u = NULL;
    float v = NULL;
    float dist = NULL;

    for(int j = 0; j < g_numOfObjects; j++) {

        //Strahl in die Weltkordinaten transformieren

        D3DXVec3Unproject(&rayTransformed, &rayDirection, &vp, &g_mProj, &g_mView, &g_object[j].getObjectMatrix());

        for (int i = 0; i < g_countOfIndices / 3; i += 3) {

            //die drei Punkte für ein Primitive

            D3DXVECTOR3 vector1(g_ramVertex[g_ramIndex[i]].x, g_ramVertex[g_ramIndex[i]].y, g_ramVertex[g_ramIndex[i]].z);
            D3DXVECTOR3 vector2(g_ramVertex[g_ramIndex[i + 1]].x, g_ramVertex[g_ramIndex[i + 1]].y, g_ramVertex[g_ramIndex[i + 1]].z);
            D3DXVECTOR3 vector3(g_ramVertex[g_ramIndex[i + 2]].x, g_ramVertex[g_ramIndex[i + 2]].y, g_ramVertex[g_ramIndex[i + 2]].z);
            
            //die Punkte transformieren

            D3DXVec3TransformCoord(&vector4, &vector1, &g_object[j].getObjectMatrix());
            D3DXVec3TransformCoord(&vector5, &vector2, &g_object[j].getObjectMatrix());
            D3DXVec3TransformCoord(&vector6, &vector3, &g_object[j].getObjectMatrix());

            //testen ob sich der Strahl mit dem Primitve schneiden

            if(D3DXIntersectTri(&vector4, &vector5, &vector6, &rayStart, &rayDirection, &u, &v, &dist)) {
                std::cout << "HIT" << std::endl;
            }
        }
    }

Crush

Alter Hase

Beiträge: 383

Wohnort: Stuttgart

Beruf: Softwareentwickler

  • Private Nachricht senden

4

10.10.2009, 14:52

Mal ne Frage zum Picking: Ab wann wäre es schneller beim Picking zuerst alle Objekte in einer zweiten Surface mit einer "Nummerierung" parallel zum Sichbild zu zeichnen? Dann benötigt man nur noch die Pixelposition aus diesem Bildschirm und sieht sofort pixelgenau, welches Objekt gepickt wurde.

Werbeanzeige