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:
Frage 1:
Als erstes wundert mich, dass es unten eine Lücke zwischen den beiden Halbkreisen gibt.
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.
Und dieser Fehler tritt nur(!!) beim Ändern der letzte 3 Vertices auf...
Hier mal der Code, der auf die Audiosignale reagiert:
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ß
Re: KreisVertices
Verfasst: 01.09.2017, 10:36
von xq
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
Re: KreisVertices
Verfasst: 01.09.2017, 11:06
von joggel
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...
Re: KreisVertices
Verfasst: 01.09.2017, 15:19
von joeydee
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.
Re: KreisVertices
Verfasst: 01.09.2017, 22:43
von joggel
Stimmt. Ich kann ja mal loggen was der da macht...
Re: KreisVertices
Verfasst: 02.09.2017, 13:40
von joggel
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...
Re: KreisVertices
Verfasst: 03.09.2017, 10:29
von joggel
Kurzer Statusbericht:
Es verhält sich jetzt (fast) so wie ich es mir wünsche^^.
Durch das loggen hatte ich einen besseren Überblick bekommen.