Seite 1 von 1

KreisVertices

Verfasst: 31.08.2017, 11:41
von joggel
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: 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: 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ß

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.
schön.png