Archiv verlassen und diese Seite im Standarddesign anzeigen : Loop Subdivision
MadMax@
2006-08-25, 16:18:16
Hi,
Ich habe folgendes Problem:
Ich versuche bereits seit mehreren Tagen den Loop Algo. in c++ zu implementieren allerdings will er nicht funktionieren zumindest nicht anständig.
Ich bekomme immer sehr unschön aussehende ergebnisse(Mein test Objekt ist ein einfacher würfel aus Dreiecken daraus sollte in 2-3 Schritten eine Kugel werden).
Meine Frage ist ob jemand so was schon mal implemetiert hat. Im Netz finde ich eigentlich nur beschreibungen des Algos. und keine implementierungen.
PS: Code wird heute abend nachgereicht.
MFG
Manuel
MadMax@
2006-08-26, 00:47:25
So hier mal der relevante Code evtl. sieht ja jemand einen Fehler:
int SubdivisionLoop::Subdivde()
{
int i;
float beta;
float betaSelf;
list<STRUCT_FACE_TRI>::iterator it;
list<STRUCT_FACE_TRI*>::iterator it_t;
list<STRUCT_VERTEX>::iterator it_v;
vec3 o[3];
vec3 opp1,opp2;
STRUCT_EDGE edge;
float angle;
this->vertex_temp_list.clear();
this->edge_temp_list.clear();
this->tri_temp_list.clear();
//Berechnung der ODD Vertex
for(it=this->tri_list.begin();it!=this->tri_list.end();++it){
//3 ODD Vertex Berechnen
for(i=0;i<3;i++)
{
edge = (*it._Ptr->_Myval.e[i]);
if(edge.tri.size() == 1)
o[i] = this->CalcODDBorder(edge.v1->pos,edge.v2->pos);
else if(edge.tri.size() == 2)
{
opp1 = this->GetOpp(edge.tri.front(),edge.v1->pos,edge.v2->pos);
opp2 = this->GetOpp(edge.tri.back(),edge.v1->pos,edge.v2->pos);
o[i] =this->CalcODD(edge.v1->pos,opp1,edge.v2->pos,opp2);
}
}
//Neue Dreiecke Berechnen
this->AddTriTemp(it._Ptr->_Myval.v[0]->pos,o[0],o[2],SUB_EVEN,SUB_ODD,SUB_ODD);
this->AddTriTemp(o[0],it._Ptr->_Myval.v[1]->pos,o[1],SUB_ODD,SUB_EVEN,SUB_ODD);
this->AddTriTemp(o[2],o[0],o[1],SUB_ODD,SUB_ODD,SUB_ODD);
this->AddTriTemp(o[2],o[1],it._Ptr->_Myval.v[2]->pos,SUB_ODD,SUB_ODD,SUB_EVEN);
}
//Berechnung der EVEN Vertex
for(it_v=this->vertex_temp_list.begin();it_v!=this->vertex_temp_list.end();++it_v)
{
it_v._Ptr->_Myval.newpos.x = 0;it_v._Ptr->_Myval.newpos.y = 0;it_v._Ptr->_Myval.newpos.z = 0;
it_v._Ptr->_Myval.t1.x = 0;it_v._Ptr->_Myval.t1.y = 0;it_v._Ptr->_Myval.t1.z = 0;
it_v._Ptr->_Myval.t2.x = 0;it_v._Ptr->_Myval.t2.y = 0;it_v._Ptr->_Myval.t2.z = 0;
if(it_v._Ptr->_Myval.type == SUB_EVEN)
{
if(it_v._Ptr->_Myval.valenz == 6)
{
beta = 1.0/16.0;
betaSelf = 10.0/16.0;
}
/*else if(it_v._Ptr->_Myval.valenz == 1)
{
beta = 0.0;
betaSelf = 1.0;
}*/
else
{
if(it_v._Ptr->_Myval.valenz>3)
beta = 3.0/(8.0*(float)it_v._Ptr->_Myval.valenz);
else
beta = 3.0/16.0;
angle = 2.0*3.14159265 / (float)it_v._Ptr->_Myval.valenz;
if(abs(angle) < 0.0001)
angle = 0;
beta = (1.0/(float)it_v._Ptr->_Myval.valenz) * (5.0/8.0-pow(3.0/8.0+1.0/4.0*cos(angle),2));
betaSelf = 1-(float)it_v._Ptr->_Myval.valenz*beta;
}
it_v._Ptr->_Myval.newpos = this->AddVec3(it_v._Ptr->_Myval.newpos,this->ScaleVec3(it_v._Ptr->_Myval.pos,betaSelf));
this->valenz_list.clear();
for(it_t=it_v._Ptr->_Myval.tri.begin();it_t!=it_v._Ptr->_Myval.tri.end();++it_t)
{
for(i =0;i<3;i++)
if(!this->Equal(it_v._Ptr->_Myval.pos,it_t._Ptr->_Myval->v[i]->pos))
if(!this->IsIn(it_t._Ptr->_Myval->v[i]->pos))
this->valenz_list.push_back(it_t._Ptr->_Myval->v[i]->pos);
}
for(i=0;i<this->valenz_list.size();i++)
{
it_v._Ptr->_Myval.newpos = this->AddVec3(it_v._Ptr->_Myval.newpos,this->ScaleVec3(this->valenz_list[i],beta));
}
}
else
{
it_v._Ptr->_Myval.newpos = it_v._Ptr->_Myval.pos;
}
}
//Poisiton updaten
for(it_v=this->vertex_temp_list.begin();it_v!=this->vertex_temp_list.end();++it_v)
it_v._Ptr->_Myval.pos = it_v._Ptr->_Myval.newpos;
//Kopieren der Vertexe
this->vertex_list.clear();
this->edge_list.clear();
this->tri_list.clear();
for(it=this->tri_temp_list.begin();it!=this->tri_temp_list.end();++it)
this->AddTri(it._Ptr->_Myval.v[0]->pos,it._Ptr->_Myval.v[1]->pos,it._Ptr->_Myval.v[2]->pos);
return 0;
}
Mir ist klar das das recht viel zu lesen ist aber ich bin langsam aber sicher am verzweifeln warum das net funktioniert.
MadMax@
2006-08-29, 00:01:53
push hat den noch niemand so was mal implementiert und kan mir helfen ?
Nein aber was soll das explizite this-> vor jeder Membervariablen?
push hat den noch niemand so was mal implementiert und kan mir helfen ?
Doch, im Prinzip hab ich sowas, zumindest rein vom Algorithmus her, implementiert. War allerdings auf C#-Basis.
Vielleicht find ich ich das Zeug noch irgendwo, dann könnt ichs ggf. mal schicken.
MadMax@
2006-08-30, 00:48:57
Nein aber was soll das explizite this-> vor jeder Membervariablen?
habe ich mir so angewöhnt finde ich übersichtlicher.
Doch, im Prinzip hab ich sowas, zumindest rein vom Algorithmus her, implementiert. War allerdings auf C#-Basis.
Vielleicht find ich ich das Zeug noch irgendwo, dann könnt ichs ggf. mal schicken.
Das wäre echt nice wen du das noch findest
MadMax@
2006-09-02, 15:20:27
:-( immer noch am warten auf eine Lösung mag sich dne niemand erbarmen und da mal rüberschauen?
MadMax@
2006-09-08, 19:34:26
http://www.bilder-hochladen.net/files/thumbs/13dt-1.jpg (http://www.bilder-hochladen.net/files/13dt-1-jpg.html)
Hier mal ein ein pic wie die Fehler aussehen
Du willst ne Kugel? Dann solltest du die Positionsvektoren der Vertices natürlich normalisieren und danach wieder mit der Länge multiplizieren. Das Mesh sieht ja sonst gut aus soweit.
"mit der Länge multiplizieren" -> "mit der gewünschten Kugelgröße" natürlich. srykthx.
MadMax@
2006-09-08, 20:50:47
Danke dir das scheint zu funktionieren komisch ich habe in keinem Paper gelesen das man die Vektoren normalisieren muss.
Vielleicht irgendwo || in ner Formel übersehen? ;)
vBulletin®, Copyright ©2000-2024, Jelsoft Enterprises Ltd.