KreisVertices

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

KreisVertices

Beitrag 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ß
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: KreisVertices

Beitrag 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
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
joggel

Re: KreisVertices

Beitrag 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...
joeydee
Establishment
Beiträge: 1039
Registriert: 23.04.2003, 15:29
Kontaktdaten:

Re: KreisVertices

Beitrag 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.
joggel

Re: KreisVertices

Beitrag von joggel »

Stimmt. Ich kann ja mal loggen was der da macht...
joggel

Re: KreisVertices

Beitrag 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...
joggel

Re: KreisVertices

Beitrag 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
Antworten