Wie mache ich aus einem Strich eine Feder?



  • hallo wissende,

    Wühle mich durch verschiedene tut`s und habe eine gl anwendung gefunden die mir zusagt, jetzt würde ich gerne aus GL_LINES ein GL_SPRING oder GL_FEDER machen, hab mir auch schon die datei gl.h angeguckt finde auch coordinaten, aber ich kann sie nicht zu ordnen und will auch nix schrotten 😃

    /**************************
     * Includes
     *
     **************************/
    
    #include <windows.h>
    #include <gl/gl.h>
    
    /**************************
     * Function Declarations
     *
     **************************/
    
    LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
    WPARAM wParam, LPARAM lParam);
    void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC);
    void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);
    
    /**************************
     * WinMain
     *
     **************************/
    
    int WINAPI WinMain (HINSTANCE hInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine,
                        int iCmdShow)
    {
        WNDCLASS wc;
        HWND hWnd;
        HDC hDC;
        HGLRC hRC;        
        MSG msg;
        BOOL bQuit = FALSE;
        float theta = 0.0f;
    
        /* register window class */
        wc.style = CS_OWNDC;
        wc.lpfnWndProc = WndProc;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hInstance = hInstance;
        wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wc.hCursor = LoadCursor (NULL, IDC_ARROW);
        wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
        wc.lpszMenuName = NULL;
        wc.lpszClassName = "GLSample";
        RegisterClass (&wc);
    
        /* create main window */
        hWnd = CreateWindow (
          "GLSample", "OpenGL Sample", 
          WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
          0, 0, 256, 256,
          NULL, NULL, hInstance, NULL);
    
        /* enable OpenGL for the window */
        EnableOpenGL (hWnd, &hDC, &hRC);
    
        /* program main loop */
        while (!bQuit)
        {
            /* check for messages */
            if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
            {
                /* handle or dispatch messages */
                if (msg.message == WM_QUIT)
                {
                    bQuit = TRUE;
                }
                else
                {
                    TranslateMessage (&msg);
                    DispatchMessage (&msg);
                }
            }
            else
            {
                /* OpenGL animation code goes here */
    
                glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
                glClear (GL_COLOR_BUFFER_BIT);
    
                glPushMatrix ();
                glRotatef (theta, 0.0f, 1.0f, 0.0f);
                glBegin (GL_LINES);
                glColor3f (1.0f, 0.0f, 0.0f);   glVertex2f (0.0f, 0.5f);
                glColor3f (0.0f, 1.0f, 0.0f);   glVertex2f (0.87f, -0.9f);
                glColor3f (0.0f, 0.0f, 1.0f);   glVertex2f (-0.87f, -0.5f);
                glEnd ();
                glPopMatrix ();
    
                SwapBuffers (hDC);
    
                theta += 1.0f;
                Sleep (1);
            }
        }
    
        /* shutdown OpenGL */
        DisableOpenGL (hWnd, hDC, hRC);
    
        /* destroy the window explicitly */
        DestroyWindow (hWnd);
    
        return msg.wParam;
    }
    
    /********************
     * Window Procedure
     *
     ********************/
    
    LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
                              WPARAM wParam, LPARAM lParam)
    {
    
        switch (message)
        {
        case WM_CREATE:
            return 0;
        case WM_CLOSE:
            PostQuitMessage (0);
            return 0;
    
        case WM_DESTROY:
            return 0;
    
        case WM_KEYDOWN:
            switch (wParam)
            {
            case VK_ESCAPE:
                PostQuitMessage(0);
                return 0;
            }
            return 0;
    
        default:
            return DefWindowProc (hWnd, message, wParam, lParam);
        }
    }
    
    /*******************
     * Enable OpenGL
     *
     *******************/
    
    void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC)
    {
        PIXELFORMATDESCRIPTOR pfd;
        int iFormat;
    
        /* get the device context (DC) */
        *hDC = GetDC (hWnd);
    
        /* set the pixel format for the DC */
        ZeroMemory (&pfd, sizeof (pfd));
        pfd.nSize = sizeof (pfd);
        pfd.nVersion = 1;
        pfd.dwFlags = PFD_DRAW_TO_WINDOW | 
          PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
        pfd.iPixelType = PFD_TYPE_RGBA;
        pfd.cColorBits = 24;
        pfd.cDepthBits = 16;
        pfd.iLayerType = PFD_MAIN_PLANE;
        iFormat = ChoosePixelFormat (*hDC, &pfd);
        SetPixelFormat (*hDC, iFormat, &pfd);
    
        /* create and enable the render context (RC) */
        *hRC = wglCreateContext( *hDC );
        wglMakeCurrent( *hDC, *hRC );
    
    }
    
    /******************
     * Disable OpenGL
     *
     ******************/
    
    void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC)
    {
        wglMakeCurrent (NULL, NULL);
        wglDeleteContext (hRC);
        ReleaseDC (hWnd, hDC);
    }
    

    Ist das tut mit dem ich im moment arbeite, kann aber nur in diesem teil

    glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (0.0f, 0.5f);
    glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (0.87f, -0.9f);
    glColor3f (0.0f, 0.0f, 1.0f); glVertex2f (-0.87f, -0.5f);

    die Farbe bzw. die Art der Rotation ändern,
    wäre gut wenn jemand mit erfahrung mir kurz eine erklärung geben könnte,
    hab noch nicht die meiste erfahrung in c++ ,kenne gerade mal die Grundbegriffe (int ,void,cout,double,float, if ,else usw..für kleine tabellen und sowas reicht es 🙂 ..) denke das es für mich noch viel zu früh ist mich an opengl zu wagen :D.

    thanX for help 😉



  • Um rapso zu zitieren...

    -psy- schrieb:

    jetzt würde ich gerne aus GL_LINES ein GL_SPRING oder GL_FEDER machen,

    #define GL_SPRING GL_LINES
    

    Mehr fällt mir bei deiner Fragestellung leider nicht ein.



  • Guten morgen nochmal ,

    Jo das ist ja schonmal ein anfang , ich hatte vor den Strich zu einer Feder umzubauen , dafür muss ich ja radien bzw. die Durchmesser,der einzelnden Windungen vorgeben, ich suchte jetzt den befehl zum festlegen der Werte,

    Mein wunschergebniss wäre eine 3D ausgabe der Feder.

    Gibt es auch eine "einfachen" befehl um noch text einzufügen ?



  • also du nimmst dir nen Sinus und nen Kosinus, machst nen GL_LINES und malst einen Kreis.
    Immer wieder..
    Bei jedem Punkt steigst du um ein gaaanz kleines Stück an..

    openGL kannst du nutzen, um Punkte miteinander zu verbinden. Ähnlich wie diese tollen Rätsel für Kinder.
    Der Rest ist dann ein Ausfüllen der entstehenden Flächen..



  • zur info : ich verwende dev-cpp und kein VC++ , mit malen ist da nicht viel :D,

    der aufbau der Feder ist mir klar , hab ich ja ne lehre drüber gemacht ,hab auch cnc Fräsen gelernt. brauche nur den richtigen befehl unter c++ 😉

    Wo kann ich die befehle in meinem vorhandenem source hinzufügen?

    /* OpenGL animation code goes here */ 
    
                glClearColor (0.0f, 0.0f, 0.0f, 0.0f); 
                glClear (GL_COLOR_BUFFER_BIT); 
    
                glPushMatrix (); 
                glRotatef (theta, 0.0f, 1.0f, 0.0f); 
                glBegin (GL_LINES); 
                glColor3f (1.0f, 0.0f, 0.0f);   glVertex2f (0.0f, 0.5f); 
                glColor3f (0.0f, 1.0f, 0.0f);   glVertex2f (0.87f, -0.9f); 
                glColor3f (0.0f, 0.0f, 1.0f);   glVertex2f (-0.87f, -0.5f); 
                glEnd (); 
                glPopMatrix (); 
    
                SwapBuffers (hDC); 
    
                theta += 1.0f; 
                Sleep (1);
    

    <----denke mal hier oder?
    könnt ihr mir eine kurze hilfe erstellen , so als denkhilfe, hab im moment ein brett vor dem kopf 😕



  • glBegin (GL_LINES);
    for (wasweißich) {
    vertex = berechneVertexKoordinate();
    glVertex (vertex);
    }
    glEnd();



  • hat jemand die Formel für einen Helix?



  • ich habe mal probiert einen Kreis zu malen, aber siehr nicht wie einer aus...

    glBegin(GL_LINES);
    for(float a = 0; a <= 360; a += 30)
    glVertex3f(cos(a), sin(a), 0.0f);
    glEnd();

    --> ich will den Kreis über Winkel erzeugen, damit ich dann einen Helix machen kann(zb.: 14576°)



  • Junge, lies doch mal die Referenz. cos und sin fressen Bogenmaß, keine Grad.



  • stimmt....



  • jetzt habe ich es...

    float rad;
    	glBegin(GL_LINE_STRIP);
    		for(float a = 0; a <= 1000; a += 30)
    		{
    			rad = (3.15159f * a) / 180;
    			glVertex3f(cos(rad), sin(rad), a / 1000.0f);
    		}
    	glEnd();
    


  • Tc++H schrieb:

    rad = (3.15159f * a) / 180;
    

    Naja, nicht ganz... 😉



  • WoW, jo mit der letzten lösung komme ich prima zurecht super danke euch ,

    kleine frage noch , besteht die möglichkeit die dicke des striches zu definieren? der kommt nämlich nen bisschen schmalbrüstig um die ecke 😉
    undv wie kann ich den anfangs , mitten, und end Durchmesser (De1 ,De2, De3) definieren ?

    Und vielleicht noch die steigung der einzelnen Windungen .....ich bräuchte nur die ersten befehle (ersten 2 denke dürften reichen) weiter spinnen denke sollte selber klappen 😃

    würde das jetzt gerne weiter ausbauen 😃

    Ihr könnt ja nen nettes tut raus basteln 😉 erste schritte in opengl oder sowas 🙂

    Danke nochmal für eure antworten! 🤡





  • jupp, thx das problem mit der strichdicke ist aus der welt ! 👍

    das problem mit der steigung ist fast gelöst

    rad = (3.14159f * a) / [b]3800;[/b] //<----lässt sich hier einstellen aber gilt leider nur für alle windungen 
    und nicht speziell für eine bzw, der anzahl 
    windungen die ich vorgebe//
    

    zudem sehr interessant was bei Wiki steht !



  • sieht zwar nicht so schön aus, aber funzt...(lässt die Feder schwingen, sieht nur etwas blöd aus, da es linear ist)

    static float s = 1000.0f;
    static bool d = true;
    float step = 20; 
    
    if(d)
    {
    	if(s <= 1000.0f)
    		s += step;
    	else
    		d = false;
    }
    else
    {
    	if(s >= 500.0f)
    		s -= step;
    	else
    		d = true;
    }
    	float rad;
    glBegin(GL_LINE_STRIP);
    for(float a = 0.0f; a <= 2000.0f; a += 3.0f)
    {
    	glColor3f(1.0f/1000.0f*a + 0.5f, 0.0f, 0.0f);
    	rad = (3.15159f * a) / 180.0f;
    	glVertex3f(cos(rad), sin(rad), a / s);
    }
    glEnd();
    


  • rad = (3.14159f * a) / 3800; //<----lässt sich hier einstellen aber gilt leider nur für alle windungen
    und nicht speziell für eine bzw, der anzahl
    windungen die ich vorgebe//

    1 Windung = 360°
    Wo liegt das Problem?

    Hier noch was:

    for(float a = 0.0f; a <= angle; a += angle / cPoints)
    

    cPoints bestimmt, wie "eckig" der Helix ist



  • Wow nice work ! 👍

    rad = (3.15159f * a) / 180.0f;
    

    immer dieses pi :p 😉

    Das mit dem schwingen sieht echt klasse aus! So langsam aber sicher verstehe ich immer besser was es bei ,für euch "simplen", struktur veränderungen einer gl anwendung auf sich hat. Danköö nochmal, an dieser stelle, das ihr euch die mühe macht und helft!

    glColor3f([b]1.0f[/b]/1000.0f*a + [b]0.5f[/b], 0.0f, 0.0f)
    

    Ist ja mal ne interessante sache , geht man bei 1.0 & 0.5f weiter runter wirkt die Feder transparent, und bei der 1000 kann man den berreich der windung definieren bis wo sie transparent wirkt!!! cooler effekt, wird bestimmt noch hilfreich sein!!!

    Hab gerade mal versucht die größe der angezeigten Feder etwas zu verkleinern, um die Windungen richtig anzeigen zu lassen, auch bei rotation, das hab ich mit dem befehl

    glScale(X,X,X);
    

    versucht, (für X natürlich ne zahl z.b; 1 verwendet)

    Jetzt bekomme ich die meldung das der befehl noch nicht deklariert ist ,hab alle dazu gehörigen gl files included.... wo drann kann das liegt,das er den befehl nicht erkennt?

    Hab auch drauf geachtet das der befehl nicht zwischen glBegin und glEnd liegt wie es auf wiki beschrieben steht! (auch nochmal thanx für die seite ,ist sehr interessant, wusste selber garnicht das sich wiki so "ausführlich" mit dem thema befasst!)

    Alle files die ich includiere

    #include <windows.h>
    #include <gl/gl.h>
    #include <cmath>
    #include <gl/glext.h>
    #include <gl/glu.h>
    

    Mehr gl header hab ich auch nicht im Ordner drin.

    Könnte die deklarierung so aussehen?

    glScale(x(y(z);
    

    Hab auch schon GL_MAX_TEXTURE_SIZE --- GL_TEXTURE_WIDTH --- GL_TEXTURE_HEIGHT
    versucht(aus der gl.h), wo ich aber die meldung bekomme das diese befehle keine funktion sind! Obwohl ich mal stark vermute , das man diese befehle nur dann brauch wenn man eigene Texturen verwendet/hinzufügen möchte, oder lieg ich da falsch?

    Kleines beispiel was ich versucht habe : "nicht lachen 😃 Newb@work 🤡 "

    glLineWidth (4.0);
                glPushMatrix ();
            // glScale(x(y(z); /*<----Bringt die fehler meldung das x,y,z nicht deklariert ist*/
            //  glScale (-1,-1,-1,) /*ums halt kleiner darzustellen wie im moment*/
                glRotatef (theta, 1.0f, 0.0f, 1.0f);
               // GL_MAX_TEXTURE_SIZE (640,480) /*bei einer Fenster größe von 800x600//Und compiler jammert das dieser befehl keine funktion ist*/
    

    Es wäre vielleicht von vorteil wenn man eine Liste bekommen könnte (in Deutsch , wie Wiki nur ausführlicher) in der die einzelnen Funtionen zu jedem befehl stehen + ausnahme regelungen , so eine noob version meine ich , wo man auch ohne groß zu raten erklärt bekommt was welcher befehl bewirkt und wie man ihn einbindet! Bisher hab ich mir die infos aus tuts besorgt. Was doch sehr mühsam ist und die daraus meistens resultierenden Fehlermeldungen des compilers eine newbie wie mich echt an seine grenzen stoßen lässt. (Das ist eines der größten mankos was mir als Einsteiger aufgefallen ist.Meistens kann ich die fehlermeldungen wegen mangelnder erfahrung nicht zuordnen oder halt sehr schwer!) 😡

    Hab begonnen selber so ein File anzulegen wo ich mir alle befehle reinkopiere die ich finden kann.Und bezeichnet habe so das ich auch keine probleme mehr nachher hab sie zu zuordnen. (also welche Dateien ich includieren muss , oder auf welche zeichen zuachten sind, an welcher stelle im code man den befehl einsetzten darf,nach klassen unterteilt also ob der befehl zur gl gehört oder für nen windoofs fenster gebraucht wird usw usw,halt schon mühe mit gemacht "es" zu verstehen ;)....halt nen "eigenes" newbie tutorial für holzköpfe 😉 )

    Hab auch in den programmen selber absolut alles bezeichnet und ihrgend welchen funktionen "die man am Bildschirm sieht,oder auch nicht aber wichtig sind" zugeordnent ,um immer wieder bei bedarf drauf zugreifen zu können!Da man sich gerade in der anfangsphase nicht alles merken kann ,da man mit neuen informationen überflutet wird.

    Bis sie aber newbie gerecht ist und ich die meisten befehle erklärt habe dürfte noch einiges an zeit (jahre) ins land ziehen...(ohne einfach copy + paste zu benutzen, da ich sie gerne mit eingenen worten erklären möchte. So gut es geht ohne "Fachchinesisch") 😃

    Denke das es sowas bestimmt schon gibt, kennt einer einen link ?

    ---------------------------------------------------------
    Zum tausentsten mal editiert 🙂

    float step = 20;    /*bestimmt die geschwindigkeit der Schwingung/ 20 default*/
    
    if(d) 
    { 
        if(s <= 1000.0f)  /*Hat was mit dem Schwingen der feder zu tun ,der Steigungsabstand wird mit definiert*/
            s += step; 
        else 
            d = false; 
    } 
    else 
    { 
        [b]if(s >= 500.0f)[/b]   /*Definitive bestimmt der befehl wie weit die feder zu schwingen hat! desto niedrieger die eingabe dersto größer schwingt sie*/
            [b]s -= step; 
        else 
            d = true; 
    } 
        float rad; 
    glBegin(GL_LINE_STRIP); 
    for(float a = 0.0f; a <= 2000.0f; a += 2.0f / 1)[/b]  /*Über die 2000 lasst sich der einzug einstellen(länge des striches o. Länge des 
    einzuziehende materials), 2.0 lassen sich kanten in der engine 
    entfernen, bei einer eingabe über 50 wird die Feder zum Stern! */  
    { 
        [b]glColor3f(1.0f/1000.0f*a + 0.5f, 0.0f, 0.0f); [/b]/* Sehr interessante Einstellung für die Farben der Feder, 1.0f bewirken eine 
    deutliche darstellung 
    der Feder während ein herabsetzen des befehles die feder transparent erscheinen lässt und bei 1000 die 
    länge des transparenten berreiches definiert wird*/
        [b]rad = (3.14159f * a) / 180.0f;[/b]                    /*Über diese funktion lässt dich der windungs abstand regulieren /180.0f original)*/
        [b]glVertex3f(cos(rad), sin(rad), a / s);[/b]
    

    Kann ich bei

    [b]if(s <= 1000.0f)[/b]  /*Hat was mit dem Schwingen der feder zu tun ,der Steigungsabstand wird mit definiert*/
            [b]s += step; 
        else 
            d = false;[/b]
    

    Nicht versuchen das mit

    [b]for(float a = 0.0f; a <= 2000.0f; a += 2.0f / 1)  [/b]/*Über die 2000 lasst sich der einzug 
    (länge des zu verwendenen materials) einstellen, 2.0 
    lassen sich kanten in der engine entfernen, bei einer 
    eingabe über 50 wird die Feder zum Stern! */
    

    zu kombienieren?

    Das ich im sagen kann das er bei 800 zb Steigungsabstand 20 in der Feder benutzt und ab dem punkt 800 bis 1000 dann 30 und ab 1000 - 2000 dann zb. 50 am besten auch mit defination für den durchmesser! .... dann könnte man den aufbau der Feder anders anzeigen lassen wie nur zylindrisch! Dann wäre sie ja schon mal konisch, mit veränderten durchmessern!

    Zur besseren lesbarkeit hab ich den code nachher fett anzeigen lassen.



  • Hallo ich nochmal, hab mich mal nen bisschen im forum umgesehen nach einer lösung zum "verkleinern" der feder , ich bin dabei auf den befehl

    glTranslatef( 0, 0,-6);
    

    gestoßen,

    wenn ich den anwende wird bei mir garnix mehr angezeigt, dh. die grafik ausgabe ist schwarz ....hab auch schon die parameter verändert , aber es bringt nur nen bisschen , die sicht scheint zu klein zu sein , die feder taucht einfach in den hintergrund ein und ist weg... wie kann ich die Sichtweite im opengl fenster vergrößern? muss ich jetzt auch mit zusätzlichen licht quellen arbeiten ?

    Nach dem eintauchen in die rückwnd kommt die feder auch nicht wieder ....hmm hatte den wert mal von -6 einfach auf -0.02 gesetzt.

    -------------------------------------------------------
    Edit :
    -------------------------------------------------------

    Ok das problem mit dem befehl konnte ich selber lösen, glaux.h gedownloadet und hinzugefügt, funnst gut, aber Feder verschwindet immer noch im hintergrund, jemand einen vorschlag?



  • glScalef(x, x, x); --> bis ja im Raum. und f für float.

    für glScale wird noch glEnable(GL_NORMALIZE); bgenötigt

    [hast du eine icq Nummer? dann können wir uns ja mal unterhalten?]


Anmelden zum Antworten