KreisVertices

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.

KreisVertices

Beitragvon joggel » 31.08.2017, 11:41

Hallo Leute,

ich beschäftige mich nebenbei mal wieder etwas mit Programmierung-aus-Spass-an-der-Freude^^.
Es soll mal ein Musikvisualizer werden.
Ich benutze dazu OpenScenegraph, wobei die Arbeit damit wirklich sehr angenehm ist!!

Ich möchte erstmal was ganz einfaches machen.
2 Halbkreise. Ergibt ein Kreis. Der 2te Halbkreis ist eine Spiegelung des ersten!
Die Vertices des Halbkreises sollen sich in Abhängikeit von Amplituden von Frequenzen ändern.
Mal ein Beispiel:
kreis1.png


Frage 1:
Als erstes wundert mich, dass es unten eine Lücke zwischen den beiden Halbkreisen gibt.

Hier mal der Code, der den Halbkreis erstellt:
Code: Ansicht erweitern :: Alles auswählen

void Circle::makeCircle(float x, float y, float rad)
{
        mCircleVertices = new osg::Vec3Array;
        mCircleGeometryRefPtr = new osg::Geometry();

        float intervalGrad = 180.0f/(float)mNodes;

        float z = 0;
        // *********** Vertices ***********
        float circleRad = rad;
        for (int circleCount = 0; circleCount < 2; ++circleCount)
        {
                for (int step = 0; step < mNodes; ++step)
                {
                        float winkelRad = (PI*((float)step*intervalGrad)) / (float)180;

                        float x = circleRad * cos(winkelRad);
                        float y = circleRad * sin(winkelRad);

                        osg::Vec3 vec(x, y, z);
                        mCircleVertices->push_back(vec);
                }
                circleRad = circleRad - 0.2f;
        }
        mCircleGeometryRefPtr->setVertexArray(mCircleVertices.get());
        // *********** Vertices - Ende ***********

        // *********** Faces-Idizes ***********
        for (int face = 0; face < mNodes-1; ++face)
        {
                int index0 = face + 0;
                int index1 = face + 1;
                int index2 = (face + mNodes) + 1;
                int index3 = (face + mNodes) + 0;

                osg::DrawElementsUInt* gridFace = new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0);
                gridFace->push_back(index0);
                gridFace->push_back(index1);
                gridFace->push_back(index2);
                gridFace->push_back(index3);

                mCircleGeometryRefPtr->addPrimitiveSet(gridFace);
        }
        // *********** Faces-Idizes - Ende ***********


        //******* 1. Kreis transformieren
        {
                osg::Matrix matrix = osg::Matrix::identity();
                matrix(1, 1) = -1;
                matrix = matrix *  osg::Matrix::rotate(osg::Quat(osg::DegreesToRadians(90.0), osg::Vec3(0, 0, 1)));
                osg::MatrixTransform* matrixTransform = new osg::MatrixTransform(matrix);

                matrixTransform->addChild(mCircleGeometryRefPtr.get());
                osg::StateSet* state = matrixTransform->getOrCreateStateSet();
                this->addChild(matrixTransform);
        }
        //******* 1. Kreis transformieren - ENDE

        //******* 2. Kreis transformieren
        {
                osg::Matrix matrix2 = osg::Matrix::identity();
                matrix2 = matrix2 *  osg::Matrix::rotate(osg::Quat(osg::DegreesToRadians(90.0), osg::Vec3(0, 0, 1)));
                osg::MatrixTransform* matrixTransform2 = new osg::MatrixTransform(matrix2);

                matrixTransform2->addChild(mCircleGeometryRefPtr.get());
                this->addChild(matrixTransform2);
        }
        //******* 1. Kreis transformieren - ENDE
       
        mCircleGeometryRefPtr->setUseDisplayList(false);
}
 


Frage 2:
Was mich aber noch mehr wundert ist, dass es NUR im Release-Mode zu folgendem "Fehler" kommt:
Und zwar erst, wenn ich auf die Audiodaten reagiere.
kreis2.png


Und dieser Fehler tritt nur(!!) beim Ändern der letzte 3 Vertices auf...

Hier mal der Code, der auf die Audiosignale reagiert:
Code: Ansicht erweitern :: Alles auswählen

void Circle::updateWithAudioData(Spectrum spectrum)
{
        osg::Vec3Array* vertices = static_cast<osg::Vec3Array*>(mCircleVertices.get());

        float intervalGrad = 180.0f / (float)mNodes;

        for (int index = 0; index < spectrum.mCount; ++index)
        {
                int nodeIndex = ((float)mNodes) / (float)spectrum.mCount*(float)index;
                float val = spectrum.mSpectrum[index];

                float winkelRad = (PI*((float)nodeIndex*intervalGrad)) / (float)180;

                float x = (mRad + val * 5) * cos(winkelRad);
                float y = (mRad + val * 5) * sin(winkelRad);

                osg::Vec3 vec = (*vertices)[nodeIndex];
                (*vertices)[nodeIndex].set(x, y, vec.z());
        }
        mCircleVertices->dirty();
}
 



Kann mir jemand sagen, warum der Kreis nicht geschlossen ist und im Release-modus so ein "Fehler" auftaucht?

Gruß
...
Benutzeravatar
joggel
 
Beiträge: 1172
Registriert: 06.11.2007, 19:06
Wohnort: Dresden

Re: KreisVertices

Beitragvon MasterQ32 » 01.09.2017, 10:36

Ich würde spontan sagen, dass du da auf Speicher zugreifst, der nicht initialisiert wurde (bzw. out-of-range) ist und dann da halt Bullshit drinsteht
Duct tape is like the force. It has a light side, a dark side, and it holds the world together.
Benutzeravatar
MasterQ32
Felix Queißner
 
Beiträge: 938
Registriert: 07.10.2012, 14:56

Re: KreisVertices

Beitragvon joggel » 01.09.2017, 11:06

Ja, kann sein.
Nur frage ich mich wo?
Der Code ist ja soweit in Ordnung...

Was mich eben auch wundert, ist die Lücke zwischen den Halbkreisen. Die dürfte ja eigentlich nicht sein...

Falls ihr auch nicht wisst was da los ist werd ich das mal in dem OpenSceneGraph-Forum stellen...
...
Benutzeravatar
joggel
 
Beiträge: 1172
Registriert: 06.11.2007, 19:06
Wohnort: Dresden

Re: KreisVertices

Beitragvon joeydee » 01.09.2017, 15:19

joggel hat geschrieben:Der Code ist ja soweit in Ordnung...

Wenn er nicht das macht was er soll, ist er offensichtlich auch nicht in Ordnung ;)

joggel hat geschrieben:Nur frage ich mich wo?


Nur anhand vom Code will ich da jetzt nicht alle entstehenden Index-Möglichkeiten im Kopf prüfen müssen.
Suchstellen: in den Schleifen, Berechnung der Indizes. Welche Indizes werden tatsächlich beschrieben, fehlt evtl. einer, auf den später zugegriffen wird?
Lass mal bei einem Durchgang numerisch mitloggen, wann welcher Index mit welchem Wert beschrieben wird, und welche Indizes wann gelesen werden, evtl. wird da was sichtbar.
joeydee
 
Beiträge: 490
Registriert: 23.04.2003, 15:29

Re: KreisVertices

Beitragvon joggel » 01.09.2017, 22:43

Stimmt. Ich kann ja mal loggen was der da macht...
...
Benutzeravatar
joggel
 
Beiträge: 1172
Registriert: 06.11.2007, 19:06
Wohnort: Dresden

Re: KreisVertices

Beitragvon joggel » 02.09.2017, 13:40

Bissl doof bin ich schon^^

Beim Indizieren der Flächen läuft was nicht optimal.
Also in dem loop wird der letzte Vertex-index nicht erreicht. deswegen auch die lücke zwischen den beiden Halbkreisen...
...
Benutzeravatar
joggel
 
Beiträge: 1172
Registriert: 06.11.2007, 19:06
Wohnort: Dresden

Re: KreisVertices

Beitragvon joggel » 03.09.2017, 10:29

Kurzer Statusbericht:
Es verhält sich jetzt (fast) so wie ich es mir wünsche^^.
Durch das loggen hatte ich einen besseren Überblick bekommen.

schön.png
...
Benutzeravatar
joggel
 
Beiträge: 1172
Registriert: 06.11.2007, 19:06
Wohnort: Dresden


Zurück zu Grafikprogrammierung

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste