mesh 'beschneiden'
-
Hi... habe mal wieder ein problem und bin zu blöd es selbst tu lösen
Wie kann ich teile eines mesh wegschneiden? Ich hab z.b ne 1.0x1.0 kugel ans possition 1,1,1 und möchte nun nun den ausschnitt sehen der in im bereich 0.5,0.5,0.5 ist.
Was ich bisher versucht habe ist ein subset zu erszeugen und dann nur diese zu rendern
IDirect3DVertexBuffer9 *pVB = NULL; IDirect3DIndexBuffer9 *pIB = NULL; m_pMesh->GetVertexBuffer(&pVB); m_pMesh->GetIndexBuffer(&pIB); if(pIB && pVB) { D3DXATTRIBUTERANGE currentAtr; DWORD dwSize=0; m_pMesh->GetAttributeTable(¤tAtr,&dwSize); currentAtr.AttribId = 1; currentAtr.FaceCount = 0; WORD *pIndices=NULL; D3DVECTOR *pVertices=NULL; pIB->Lock(0,0,(void**)&pIndices,D3DLOCK_READONLY); pVB->Lock(0,0,(void**)&pVertices,D3DLOCK_READONLY); for(DWORD iFace=0;iFace<m_pMesh3DText->GetNumFaces();iFace++) { FLOAT vx1 = pVertices[pIndices[3*iFace+0]].x; FLOAT vy1 = pVertices[pIndices[3*iFace+0]].y; FLOAT vx2 = pVertices[pIndices[3*iFace+1]].x; FLOAT vy2 = pVertices[pIndices[3*iFace+1]].y; FLOAT vx3 = pVertices[pIndices[3*iFace+2]].x; FLOAT vy3 = pVertices[pIndices[3*iFace+2]].y; if(vy3<cutatY || vy2<cutatY || vy1<cutatY) { // face ist im gewünschten bereich if(currentAtr.FaceCount==0) currentAtr.FaceStart = iFace; currentAtr.FaceCount++; } else { if(currentAtr.FaceCount) atrs.push_back(currentAtr); currentAtr.FaceCount = 0; } }
danach wir die neue attributes list mit SetAttributeTable gesetzt und ein DrawSubset(1) aufgerufen.
Klapt aber irgendwie nicht... ich seh entweder gar nix, oder den ganzen bereich.Gibts da irgend ne fertige DX funktion dafür? oder muss ich wirklich im index buffer per hand rumschreiben (was mich ich da falsch??? ).
-
D3DXConvertMeshSubsetToSingleStrip ?
-
Das ist doch aber gar kein Bereich, sondern ein einzelner Punkt? Und was wäre mit Polys, die zwar durch den Bereich gehen, aber ausserhalb beginnen?
Bye, TGGC (Pipe my World.)
-
Sgt. Nukem schrieb:
D3DXConvertMeshSubsetToSingleStrip ?
dazu brauch ich ja erst mal ein subset...
-
Das was ich dem code versuche ist alles von dem mesh das jensets einer gewissen y koordinate liegt weg zu schneide. Optimal wäre so ne atr 'boolean object' wie es z.b ins 3ds max eins gibt.
-
Da musst du aber auch die Polies zerschneiden, die auf der Plane liegen. Bedenke ausserdem: das Zeug ist innen hohl und die Innenwand unsichtbar...
Bye, TGGC (Pipe my World.)
-
Das innen hohl ist erst mal egal. An dem poly zuschneiden bastle ich grad. Bitte gebt mal info ob folgender ansatz grundsätzlich ok ist: alle faces die ganz ausserhalb liegen fallen erst mal ganz weg. Alles was ganz oder teilweise drinnen ist wandert ins subset. Von den halb-drinnen faces schiebe ich nun die vertices die ausserhalb liegen an die grenze. Ok? Oder falcher ansatz?
-
die verschobenen polies würden dann aber etwas komisch aussehen
//edit
dann doch lieber die grenzpolies zerschneiden:vorher
/\ / \ <---ab hier is das dreieck ausserhalb / \ /______\
nachher:
/\--/\ /__\/__\
-
Wie otze schon sagt, das klappt nicht.
Bye, TGGC (Pipe my World.)
-
dafür wurden clippingplanes erfunden, kann man aber auch wunderbar mit dem pixelshader emulieren. einfach den alphawert auf 0 setzen, wenn ein pixel außerhalb des gewünschten bereichs liegt.
würdest du das in 2d wollen, wäre natürlich ein scisor das einfachste.ansonsten kann man das nur mit mächtig viel z-buffer und stencilbuffer getrickse lösen. macht man z.b. bei volumefog manchmal, ich glaube bei nvidia war dazu mal ein paper. da mußte man dann aber das objekt im ganzen 6 oder 7 mal rendern soweit ich mich erinnern kann.
rapso->greets();
-
rapso schrieb:
da mußte man dann aber das objekt im ganzen 6 oder 7 mal rendern soweit ich mich erinnern kann.
-
Das stichwort clippingplanes hat mir soeben das leben gerettet
Thx!
-
de nada
rapso->greets();