Re: Suche nach Library: Schneiden von komplexen 3D-Objekten
- From: "Karsten Schulz" <kahnpost@xxxxxxxxxx>
- Date: Thu, 14 Feb 2008 17:22:23 +0100
Hi Holger
das machst du mit Schnittebenen, hier ist das Stichwort
FurstumCulling, aus der Einheitsmatrix die der Kamera entspricht
errechnet das Verfahren ob ein Vertex inerhalb oder nahe einer
gedachten Plane liegt, man kann entscheiden auf welcher Seite
sich der zu untersuchende Punkt befindet, und diesen ggf, mit
anderen neu verschmelzen. Frustumculling nutzt man um nur
die VerticeDaten zu rendern die inherhalb eines Stumpfen Pyramiden
stumpfes liegen. Dieser stellt ja das FieldOfView dar.
Die ebenen Gleichungen dieser Technik können auch zum
umbau von Meshes(VerticeNetze) verwendet werden.
hier ein psydocode:
void CGLmatrix::Extract() // Extracts The Current View Frustum Plane
Equations
{
register float *pro=m_pro.GetPtr();
register float *clp=m_clip.GetPtr();
register float *mod=GetPtr();
register float t; // Temporary Work Variable
Mult(mod, pro, clp);
// Extract the RIGHT clipping plane
frustum[0][0] = clp[ 3] - clp[ 0];
frustum[0][1] = clp[ 7] - clp[ 4];
frustum[0][2] = clp[11] - clp[ 8];
frustum[0][3] = clp[15] - clp[12];
// Normalize it
t = sqrtf( frustum[0][0] * frustum[0][0] + frustum[0][1] * frustum[0][1] +
frustum[0][2] * frustum[0][2] );
frustum[0][0] /= t;
frustum[0][1] /= t;
frustum[0][2] /= t;
frustum[0][3] /= t;
// Extract the LEFT clipping plane
frustum[1][0] = clp[ 3] + clp[ 0];
frustum[1][1] = clp[ 7] + clp[ 4];
frustum[1][2] = clp[11] + clp[ 8];
frustum[1][3] = clp[15] + clp[12];
// Normalize it
t = sqrtf( frustum[1][0] * frustum[1][0] + frustum[1][1] * frustum[1][1] +
frustum[1][2] * frustum[1][2] );
frustum[1][0] /= t;
frustum[1][1] /= t;
frustum[1][2] /= t;
frustum[1][3] /= t;
// Extract the BOTTOM clipping plane
frustum[2][0] = clp[ 3] + clp[ 1];
frustum[2][1] = clp[ 7] + clp[ 5];
frustum[2][2] = clp[11] + clp[ 9];
frustum[2][3] = clp[15] + clp[13];
// Normalize it
t = sqrtf( frustum[2][0] * frustum[2][0] + frustum[2][1] * frustum[2][1] +
frustum[2][2] * frustum[2][2] );
frustum[2][0] /= t;
frustum[2][1] /= t;
frustum[2][2] /= t;
frustum[2][3] /= t;
// Extract the TOP clipping plane
frustum[3][0] = clp[ 3] - clp[ 1];
frustum[3][1] = clp[ 7] - clp[ 5];
frustum[3][2] = clp[11] - clp[ 9];
frustum[3][3] = clp[15] - clp[13];
// Normalize it
t = sqrtf( frustum[3][0] * frustum[3][0] + frustum[3][1] * frustum[3][1] +
frustum[3][2] * frustum[3][2] );
frustum[3][0] /= t;
frustum[3][1] /= t;
frustum[3][2] /= t;
frustum[3][3] /= t;
// Extract the FAR clipping plane
frustum[4][0] = clp[ 3] - clp[ 2];
frustum[4][1] = clp[ 7] - clp[ 6];
frustum[4][2] = clp[11] - clp[10];
frustum[4][3] = clp[15] - clp[14];
// Normalize it
t = sqrtf( frustum[4][0] * frustum[4][0] + frustum[4][1] * frustum[4][1] +
frustum[4][2] * frustum[4][2] );
frustum[4][0] /= t;
frustum[4][1] /= t;
frustum[4][2] /= t;
frustum[4][3] /= t;
// Extract the NEAR clipping plane. This is last on purpose (see
pointinfrustum() for reason)
frustum[5][0] = clp[ 3] + clp[ 2];
frustum[5][1] = clp[ 7] + clp[ 6];
frustum[5][2] = clp[11] + clp[10];
frustum[5][3] = clp[15] + clp[14];
// Normalize it
t = sqrtf( frustum[5][0] * frustum[5][0] + frustum[5][1] * frustum[5][1] +
frustum[5][2] * frustum[5][2] );
frustum[5][0] /= t;
frustum[5][1] /= t;
frustum[5][2] /= t;
frustum[5][3] /= t;
}
// Test If A Point Is In The Frustum.
bool CGLmatrix::PointIn( CVertex a)
{
for( register int p = 0; p < 6; p++ )
if( frustum[p][0] * a.x + frustum[p][1] * a.y + frustum[p][2] * a.z +
frustum[p][3] <= 0 )
return false;
return true;
}
// Test If A Sphere Is In The Frustum
bool CGLmatrix::SphereIn( CVertex a, float radius )
{
for( register int p = 0; p < 6; p++ )
if( frustum[p][0] * a.x + frustum[p][1] * a.y + frustum[p][2] * a.z +
frustum[p][3] <= -radius )
return false;
return true;
}
// Test If A Cube tail Is In The Frustum
bool CGLmatrix::CubeIn( CVertex box, float size , bool ignore /*=false*/)
{
register int cnt=ignore?4:6;
for( register int p = 0; p < cnt; p++ )
{
if( (frustum[p][0] * (box.x - size)) + (frustum[p][1] * (box.y - size)) +
(frustum[p][2] * (box.z - size)) + frustum[p][3] > 0 )
continue;
if( (frustum[p][0] * (box.x + size)) + (frustum[p][1] * (box.y - size)) +
(frustum[p][2] * (box.z - size)) + frustum[p][3] > 0 )
continue;
if( (frustum[p][0] * (box.x - size)) + (frustum[p][1] * (box.y + size)) +
(frustum[p][2] * (box.z - size)) + frustum[p][3] > 0 )
continue;
if( (frustum[p][0] * (box.x + size)) + (frustum[p][1] * (box.y + size)) +
(frustum[p][2] * (box.z - size)) + frustum[p][3] > 0 )
continue;
if( (frustum[p][0] * (box.x - size)) + (frustum[p][1] * (box.y - size)) +
(frustum[p][2] * (box.z + size)) + frustum[p][3] > 0 )
continue;
if( (frustum[p][0] * (box.x + size)) + (frustum[p][1] * (box.y - size)) +
(frustum[p][2] * (box.z + size)) + frustum[p][3] > 0 )
continue;
if( (frustum[p][0] * (box.x - size)) + (frustum[p][1] * (box.y + size)) +
(frustum[p][2] * (box.z + size)) + frustum[p][3] > 0 )
continue;
if( (frustum[p][0] * (box.x + size)) + (frustum[p][1] * (box.y + size)) +
(frustum[p][2] * (box.z + size)) + frustum[p][3] > 0 )
continue;
return false;
}
return true;
}
// Test If A Cube tail Is In The Frustum
bool CGLmatrix::Draw(float size)
{
glBegin(GL_LINES);
for( register int p = 0; p < 6; p++ )
{
CVertex v(frustum[p][0]*size,frustum[p][1]*size,frustum[p][2]*size);
glVertex3fv((float *)&v);
}
glEnd();
return true;
}
Wenn du ein example zum frustumculling brauchst aus dem man
die Netzteilung herleiten kann würde ich Dir eines herrichten können.
grüße
Karsten Schulz
"Holger Gothan" <holger@xxxxxxxxxxxxxxxxxxxxxxxxx> schrieb im Newsbeitrag
news:61icguF1trvutU1@xxxxxxxxxxxxxxxxxxxxx
Hi,
mit einer Datenstruktur aus Punkten/Kanten/Flächen kann ich komplexere
3D-Objekte zusammenbasteln.
Jetzt möchte ich eines dieser 3D-Objekte bzgl. einer Schnittebene
in die Einzelteile stückeln. Oder ich habe 2 Objekte im Raum und
möchte diese verschmelzen, schneiden, ...
(Also so etwas wie der "Generic Polygon Clipper" von Alan Murta
in 2D)
Vermutlich bin ich nicht fähig, Google die richtigen Fragen zu stellen.
Ich finde immer nur die "normalen" Sachen wie Schneiden von Dreiecken,
Intersection-Tests Kugeln, Quader, ...
Vermutlich gibt es doch 3D-Objekt-Bibliotheken, die meine Aufgabenstellung
implementieren? Als Nebenbedingung hätte ich noch, dass zusätzliche
Eigenschaften, die ich den Elementen (Punkten, Kanten, Flächen) gebe,
erhalten bleiben. Man stelle sich ein Reihenhaus vor, aus dem ich die
tatsächliche "Wohneinheit" herausschneiden möchte. Natürlich bleibt eine
Mauer eine Mauer auch in den Teilgebäuden.
weiterführende Links herzlich willkommen.
Tschüß, Holger.
.
- References:
- Suche nach Library: Schneiden von komplexen 3D-Objekten
- From: Holger Gothan
- Suche nach Library: Schneiden von komplexen 3D-Objekten
- Prev by Date: Re: locale anpassen
- Next by Date: Re: Datei/CDocument ohne Views öffnen
- Previous by thread: Suche nach Library: Schneiden von komplexen 3D-Objekten
- Next by thread: Dienst soll Änderung der Systemzeit mit bekommen
- Index(es):
Relevant Pages
|
Loading