PDA

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 ?

Gast
2006-08-29, 21:12:56
Nein aber was soll das explizite this-> vor jeder Membervariablen?

D4ve
2006-08-30, 00:00:44
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

Gast
2006-09-08, 20:25:24
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.

Gast
2006-09-08, 20:26:09
"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.

Gast
2006-09-08, 21:06:11
Vielleicht irgendwo || in ner Formel übersehen? ;)