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

Patrick

Alter Hase

  • »Patrick« ist der Autor dieses Themas

Beiträge: 1 264

Wohnort: Düren

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

1

04.08.2003, 18:01

Eure Schäbbigsten Klassen/Funktionen und co.

Hi,

was sind eure schäbbigsten Klassen/Funktionen die ihr im code habt und kommt einfach (aus unerdenklichen Gründen natürlich ;D) nicht dazu diese Funktionen zu verschönern und zu optimieren ;D

Hier sind 3 meiner schlimmsten fälle :D

Quellcode

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
bool testBBColl (CBoundingBox &box1, CBoundingBox &box2) 
{
    if (box1.getType() == BOX_TYPE_AABB || box2.getType() == BOX_TYPE_AABB)
    {
        CBoundingBox tempBox1 (box1);
        CBoundingBox tempBox2 (box2);

        //Verschiebung der Box berechnen, sonst klappt das NUR wenn
        //die Box auf 0,0,0 ist

        // Box 1
        tempBox1.Min.x += box1.Pos.x;
        tempBox1.Min.y += box1.Pos.y;
        tempBox1.Min.z += box1.Pos.z;

        tempBox1.Max.x += box1.Pos.x;
        tempBox1.Max.y += box1.Pos.y;
        tempBox1.Max.z += box1.Pos.z;

        // Box 2
        tempBox2.Min.x += box2.Pos.x;
        tempBox2.Min.y += box2.Pos.y;
        tempBox2.Min.z += box2.Pos.z;

        tempBox2.Max.x += box2.Pos.x;
        tempBox2.Max.y += box2.Pos.y;
        tempBox2.Max.z += box2.Pos.z;

        if (tempBox1.Max.x < tempBox2.Min.x || tempBox2.Max.x < tempBox1.Min.x) return false;
        if (tempBox1.Max.y < tempBox2.Min.y || tempBox2.Max.y < tempBox1.Min.y) return false;
        if (tempBox1.Max.z < tempBox2.Min.z || tempBox2.Max.z < tempBox1.Min.z) return false;
        return true;
    }
    else
    {
        // Nee das erspare ich euch :D
    }

    return false;
}


bool PtInBox (CBoundingBox& box, D3DXVECTOR3& point, float f)
{
    CBoundingBox temp(box);

    //Verschiebung der Box berechnen, sonst klappt das NUR wenn
    //die Box auf 0,0,0 ist
    temp.Min.x += box.Pos.x;
    temp.Min.y += box.Pos.y;
    temp.Min.z += box.Pos.z;

    temp.Max.x += box.Pos.x;
    temp.Max.y += box.Pos.y;
    temp.Max.z += box.Pos.z;


    return ((point.x <= temp.Max.x +f&&
             point.y <= temp.Max.y +f&&
             point.z <= temp.Max.z +f&&
 
             point.x >= temp.Min.x -f&&
             point.y >= temp.Min.y -f&&
             point.z >= temp.Min.z -f));
}

    inline void exCreateBoundingBox(const std::vector <MODELVERTEX> &Vertexliste,int NumVertices, SBoundingBox& xBox) 
{
   float  fMax_x, fMax_y, fMax_z,
          fMin_x, fMin_y, fMin_z;

   // Startwerte beliebig wählen
   fMax_x = fMin_x = Vertexliste[0].m_vecPos.x;
   fMax_y = fMin_y = Vertexliste[0].m_vecPos.y;
   fMax_z = fMin_z = Vertexliste[0].m_vecPos.z;

   for (int j=0; j<NumVertices; j++) 
   {
      // Nach neuem Maximalwert suchen
      fMax_x = max(fMax_x, Vertexliste[j].m_vecPos.x);
      fMax_y = max(fMax_y, Vertexliste[j].m_vecPos.y);
      fMax_z = max(fMax_z, Vertexliste[j].m_vecPos.z);
      
      // Nach neuem Minimalwert suchen
      fMin_x = min(fMin_x, Vertexliste[j].m_vecPos.x);
      fMin_y = min(fMin_y, Vertexliste[j].m_vecPos.y);
      fMin_z = min(fMin_z, Vertexliste[j].m_vecPos.z);
   } // for [Verts]

   // Ausdehnung der Box speichern
   xBox.Max = D3DXVECTOR3(fMax_x, fMax_y, fMax_z);
   xBox.Min = D3DXVECTOR3(fMin_x, fMin_y, fMin_z);

   // Mittelpunkt berechnen
   xBox.MiddlePoint = D3DXVECTOR3((fMax_x+fMin_x)/2,
                                   (fMax_y+fMin_y)/2,
                                   (fMax_z+fMin_z)/2);
   return ;
}


Und was sind nun eure? *g* 8)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

04.08.2003, 18:17

Mich würde mal die vollständige Funktion zum Testen der Kollision zwischen zwei Bounding-Boxes interessieren... nämlich für zwei Boxen, die NICHT an den Achsen ausgerichtet sind. Mir ist da ja nur eine Sub-Sampling-Methode eingefallen...

Hier ist was aus meinem Code für Pharao 4...
Sieht nicht so schön aus, aber funktioniert wunderbar.
Wie Ihr wohl bemerkt, hat sich meine Code-Schreibweise verändert :)
Ich benutze jetzt keine ungarische Notation mehr (außer "p_" für Pointer) und beginne alle Variablen mit kleinen Buchstaben.

Quellcode

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
// Sterne aus Szene erstellen
int Stars::initFromScene(SCENE* p_scene)
{
    if(!p_scene) return 1;

    // Sternenhelferobjekt suchen
    PH4OBJECT* p_stars = p_scene->findHelper("PH4 Stars");
    if(!p_stars) return 0;

    // Parameter lesen
    numStars = p_stars->getInt("NumStars");
    minBr = p_stars->getFloat("MinBrightness");
    maxBr = p_stars->getFloat("MaxBrightness");

    // Vertex-Buffer erstellen
    LPDIRECT3DDEVICE9 p_d3dDevice = Game::inst().getD3DDevice();
    HRESULT r = p_d3dDevice->CreateVertexBuffer(numStars * sizeof(STARVERTEX), D3DUSAGE_WRITEONLY,
                                                D3DFVF_XYZ | D3DFVF_DIFFUSE, D3DPOOL_DEFAULT, &p_vb, 0);
    if(FAILED(r)) return 1;

    // Vertex-Buffer sperren
    STARVERTEX* p_vertexData;
    p_vb->Lock(0, 0, (void**)(&p_vertexData), D3DLOCK_NOSYSLOCK);

    // Sterne einfüllen
    for(int i = 0; i < numStars; i++)
    {
        p_vertexData->pos = vec3Random() * 500.0f;
        if(p_vertexData->pos.y < 0.0f) p_vertexData->pos.y *= -1.0f;
        p_vertexData->pos.y += 50.0f;
        float br = floatRandom(minBr, maxBr);
        p_vertexData->color = D3DXCOLOR(br + floatRandom(-0.1f, 0.1f), br + floatRandom(-0.1f, 0.1f), br + floatRandom(-0.1f, 0.1f), 1.0f);
        p_vertexData++;
    }

    p_vb->Unlock();

    return 0;
}

3

04.08.2003, 19:54

@Pat:

Hast du zufällig auch ne Line2BB Pick Funktion ? Sowas könnt ich gebrauchen, wenn nicht isses nich so schlimm.

Ach ja, ich hab auch sowas einfaches in meinem Code, sieht nich schön aus aber erfüllt seinen Zweck und läuft. Also warum soll ich deswegen was neues Kryptisches einbauen wo ich nichma weiss was es macht und wie ? :)

cya

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

04.08.2003, 20:07

Willst Du die Funktion für 2D oder für 3D?
Die Grundlagen lernst Du in meinen Tutorials hier auf der Seite...

5

04.08.2003, 21:02

3D :(

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

04.08.2003, 21:05

Das ist nicht so schwer. Du musst nur den Schnittpunkt der Linie mit den sechs Ebenen der Bounding-Box bestimmen. Sobald einer der Schnittpunkte in der Box liegt, hast Du eine Kollision.

7

04.08.2003, 21:58

Ich weiss das es nicht schwer ist, bin nur zu faul aus vMin und vMax die ganzen Dreiecke zu basteln :D

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

04.08.2003, 22:59

Keine Dreiecke, sondern nur Ebenen. Das reicht schon. 6 Ebenen.

9

05.08.2003, 00:37

Und was sind Ebenen ? genau 2 Dreiecke :)

Tobiking

1x Rätselkönig

  • Private Nachricht senden

10

05.08.2003, 01:03

In dem Fall weiß ich auch grad nicht was genau gemeint ist sind diese Ebenen gemeint die unendlich weit gehen oder einfach nur eine Rechteckige Fläche. Wobei glaube ich beides nicht das Problem sind zu errechnen. Wobei man ja nicht unbedingt errechnen sagen sollte. Es sind 8 Punkte

Punkt 1: vMin.x und vMin.y und vMin.z
Punkt 2: vMin.x und vMax.y und vMin.z
...

usw durch bis man alle Ecken hat. Sollte so schwer nicht sein. Außerdem braucht man ja nicht 2 Dreiecke sondern wirklich nur das Rechteck.

Werbeanzeige