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:
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.
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...