Terrains



  • Hi!
    Ich lade mein Terrain mit folgendem Code (auf wesentliches konzentriert):

    for(y=0; y<heightMapHeight; y++)
        {
            for(x=0; x<heightMapWidth; x++)
            {
                m_vertexlist[(int)((y*heightMapHeight)+x)].vertex[0] =(float)x;
                m_vertexlist[(int)((y*heightMapHeight)+x)].vertex[1] = heightMap.data[((y *heightMapHeight)+x)*3]/m_divider;
                m_vertexlist[(int)((y*heightMapHeight)+x)].vertex[2] =(float)y;
    
                numver++;
            }   
        }
    

    und rendere es so:

    for(y=0;y<heightMapHeight-1;y++)
            {
                glBegin(GL_TRIANGLE_STRIP);
                for(x=0;x<heightMapWidth-1;x++)
                {
    
                    SetTextureCoord(x, y);
                    glVertex3fv(m_vertexlist[(int)((y*heightMapHeight)+x)].vertex);
    
                    SetTextureCoord(x+1, y);
                    glVertex3fv(m_vertexlist[(int)((y*heightMapHeight)+(x+1))].vertex);
    
                    SetTextureCoord(x, y+1);
                    glVertex3fv(m_vertexlist[(int)(((y+1)*heightMapHeight)+x)].vertex);
    
                    SetTextureCoord(x+1, y+1);
                    glVertex3fv(m_vertexlist[(int)(((y+1)*heightMapHeight)+(x+1))].vertex);
    
                }
                glEnd();
            }
    

    Ich möchte es jetzt aber nicht so umständlich rendern, sondern so in der Art:

    glBegin(GL_TRIANGLE_STRIP);
    for(int idx=0,idx<numver,idx++)
           glVertex3fv(m_vertexlist[idx].vertex);
    glEnd();
    

    ICh hab jetzt schon eine Zeitlang rumprobiert, schaffe es aber irgendwie nicht 😞 könnt ihr mir bitte helfen?!



  • Du solltest die Triangle-Strips in kleiner Vertex-"Packeten" abschicken und nich alle auf einmal



  • und wieso?! aus performance gründen oder weil die dreiecke sonst falsch verbunden werden??



  • Weil OpenGL möglicherweise eine Begrenzung in der Grösse eines Triangle Strip-"Geflechts" hat. War nur so ne Idee.



  • außerdem hab ich noch ein anderes problem:
    ich bekomme die höhe des terrains mit diesem code:

    int TERRAIN::getHeight(int X, int Y)
    {
        // Make sure we don't go past our array size
        int x = X % heightMapWidth;                 // Error check our x value
        int y = Y % heightMapHeight;                    // Error check our y value
    
        // Use the equation: index = (x + (y * arrayWidth) ) to find the current height
        return ((int)heightMap.data[(x + (y * (int)heightMapWidth))*3])/(int)m_divider; // Index into our height array and return the height
    }
    

    Das Problem ist, dass ich das Terrain mit glScalef( ... ) skaliere, deswegen stimmen die x und y werte ja nicht, also hab ich mir überlegt, dass ich die x und y werte einfach mit dem scale-faktor multipliziere ... aber irgendwie stimmt das trotzdem nicht ... also: wie komme ich an die höhe des terrains an einer beliebigen stelle??



  • achja: thx im vorraus!



  • freddy: Bist du dieser <Headhunter> der letztens diese tricky codes gepostet hat?



  • ?! nein... wieso?



  • Eh, möchtest du im 3D Level rausfinden wie hoch das Level an der Stelle ist ?



  • ich möchte dass sich die y position der camera dem terrain anpasst



  • Warum funktioniert das mit dem x&y Wert skalieren nicht ?

    Du könntest z.B. einen Ray nach unten schießen und dann checken ob der mit dem Terrain kollidiert, das ist das einzige was mit im moment so einfallen würde 🙂



  • Wenn sich das Terrain nicht verändert, dann solltest Du Vertex Arrays verwenden. Dadurch sparts Du Dir sehr viele Funktionsaufrufe und die Schleifen.



  • @headhunter:
    wenn ich die x und y koordinaten einfach mit dem scalefaktor multiplieziere kommen trotzdem nicht die richtigen werte raus:

    terrain.getHeight( x * terrain.scale.v[0],
                       y * terrain.scale.v[2]);
    

    musste doch eigentlich stimmen oder?!

    @simon:
    ich wills erst später optimieren...



  • Jo, der Code müsste stimmen. Was klappt denn nicht ? Kleine Ungenauigkeiten, oder komplett falsch ?



  • hatte einen fehler (hab das terrain auf y koordinate ausgerichtet und das nicht berücksichtigt)
    aber jetzt ist das problem immer noch nicht richtig gelöst:
    bei dem objekt das ich verschiebe ändert sich die y koordinate nicht schön langsam, sondern springt auf und ab...



  • Ist ja auch klar, denn das Terrain hat ja nur eine bestimmte "Auflösung". Du musst zwischen den vier nächsten Kontrollpunkten interpolieren, so wie es auch bei Textur-Filtern gemacht wird.
    Hier ist ein Stück Code von einem meiner Programme, das ein Bild linear filtert:

    /*******************************************************************/
    // Funktion zum Abfragen eines gefilterten Pixelwerts
    tbColor CBitmap::GetFilteredPixel(float x,
                                      float y)
    {
        float fx = x - (float)((int)(x));
        float fy = y - (float)((int)(y));
    
        // Bilinearer Filter
        return (tbColor)((1.0f - fx) * ((1.0f - fy) * GetPixel((int)(x), (int)(y)) +
                          fy * GetPixel((int)(x), (int)(y) + 1)) +
                          fx * ((1.0f - fy) * GetPixel((int)(x) + 1, (int)(y)) +
                          fy * GetPixel((int)(x) + 1, (int)(y) + 1)));
    }
    

    Das dürfte sich gut für Dein Terrain verwenden lassen! Anstelle von tbColor hast Du halt floats und GetPixel muss bei Dir die Höhe an einer bestimmten Stelle liefern (hast Du ja schon).



  • Original erstellt von Headhunter:
    Du könntest z.B. einen Ray nach unten schießen und dann checken ob der mit dem Terrain kollidiert, das ist das einzige was mit im moment so einfallen würde

    Das ist nicht unbedingt sinnvoll, da der Ray sowieso mit dem Terrain kollidiert solange man sich in dem Rechteck( Quadrat ) über dem Terrain befindet. Also etwas zuviel Aufwand 😉

    Original erstellt von TomasRiker:
    **Ist ja auch klar, denn das Terrain hat ja nur eine bestimmte "Auflösung". Du musst zwischen den vier nächsten Kontrollpunkten interpolieren, so wie es auch bei Textur-Filtern gemacht wird.
    Hier ist ein Stück Code von einem meiner Programme, das ein Bild linear filtert:
    **

    Das ist eigentlich nicht genau das, was man braucht, da hier immer aus 3 Punkten ein Dreick aufgespannt wird. Man muss die 3 Punkte finden und eine Ebene durch sie aufspannen, dann kommt man zu dem gesuchten Punkt im Dreieck.



  • Mit der Interpolation müsste es aber auch funktionieren.



  • Original erstellt von TomasRiker:
    Mit der Interpolation müsste es aber auch funktionieren.

    Ja, es ist auch eine Annäherung, für den gesuchten Wert. Er ist aber eben nicht genau. Gerade bei LOD und wenn Quads stark "geknickt" sind, gibt es hohe Abweichungen.



  • danke! das mit dem interpolieren funktioniert wunderbar!!

    @TGGC wie würdest du das dann machen?!



  • Original erstellt von <freddy>:
    @TGGC wie würdest du das dann machen?!

    Augen auf bitte, bzw. lesen lernen. 😉


Anmelden zum Antworten