2009-05-01 9 views

Odpowiedz

9

Zakładając, że twoje trimesh jest zamknięte (bez względu na to, czy jest wypukłe czy nie), istnieje sposób!

Dmckee zwraca uwagę, że ogólne podejście polega na budowaniu czworościanów z każdego trójkąta powierzchniowego, a następnie zastosowaniu oczywistej matematyki, aby sumować masy i momenty wkładów z każdego tet. Sztuczka pojawia się, gdy powierzchnia ciała ma wklęsłości, które tworzą wewnętrzne kieszenie oglądane z dowolnego punktu odniesienia.

Tak więc, aby rozpocząć, wybierz punkt odniesienia (początek współrzędnych modelu działa dobrze), nawet nie musi znajdować się w ciele. Dla każdego trójkąta połącz trzy punkty tego trójkąta z punktem odniesienia, tworząc czworościan. Oto sztuczka: używaj normalnej powierzchni trójkąta, aby dowiedzieć się, czy trójkąt jest skierowany w stronę punktu odniesienia, czy też z dala od niego (co można znaleźć, patrząc na znak iloczynu punktowego normalnego i wektor wskazujący na centroid centroid trójkąta). Jeśli trójkąt jest odwrócony od punktu odniesienia, traktuj jego masę i moment normalnie, ale jeśli jest skierowany w stronę punktu odniesienia (sugerując, że istnieje otwarta przestrzeń między punktem odniesienia a ciałem stałym), zaneguj wyniki dla tego punktu odniesienia .

Skutecznie to, co to robi, to przeliczyć objętość objętości, a następnie skorygować, gdy okazuje się, że te obszary nie są częścią ciała stałego. Jeśli ciało ma dużo grubych kołnierzy i groteskowych fałd (ma ten obraz?), Konkretna objętość może być przeliczona przez potężny czynnik, ale zostanie odjęta tyle razy, aby ją anulować, jeśli twoja siatka jest Zamknięte. Pracując w ten sposób, możesz nawet obsługiwać wewnętrzne bąbelki przestrzeni w twoich obiektach (zakładając, że wartości normalne są ustawione poprawnie). Co więcej, każdy trójkąt może być obsługiwany niezależnie, dzięki czemu można równolegle do woli. Cieszyć się!

Po zastanowieniu: możesz się zastanawiać, co się dzieje, gdy produkt ten daje wartość równą zeru lub zbliżoną do zera. Dzieje się tak tylko wtedy, gdy powierzchnia trójkąta jest równoległa (normalna jest prostopadła) w kierunku do punktu odniesienia - co zdarza się tylko w przypadku zdegenerowanych tet o małym lub zerowym polu. Innymi słowy, decyzja o dodaniu lub odjęciu wkładu tet jest wątpliwa tylko wtedy, gdy tet i tak nie będzie wnosić wkładu.

+2

Nice. Powinienem to zobaczyć. Jest to przedłużenie starego podejścia "liczenia skrzyżowań" do uczenia się, jeśli punkt jest wewnątrz lub na zewnątrz do kształtu. – dmckee

1

Chciałbym rzucić okiem na vtkMassProperties. Jest to dość solidny algorytm do obliczenia tego, biorąc pod uwagę powierzchnię otaczającą objętość.

1

Rozwiń swój obiekt na zbiór tetrahedrons wokół wybranego wnętrza. (To jest bryła przy użyciu każdego trójkątnego elementu twarzy i wybranego środka.)

Powinieneś być w stanie sprawdzić objętość każdego elementu. Model moment of inertia powinien być również dostępny.

To raczej problem, jeśli powierzchnia nie jest wypukła.


Wydaje mi się, że zapomniałem o nomenklaturze, a pochylenie nie jest przymiotnikiem, którego chciałem. Mam na myśli nieregularne.

+0

Jeśli obiekt nie jest wypukły (a czasami nawet jeśli jest), to tesselacja w sieci jest znacznie bardziej skomplikowana niż bezpośrednie obliczanie masy. –

+0

@Reed Copsey: Wezmę na słowo. Oferowane przeze mnie rozwiązanie jest na pewno naiwne. – dmckee

1

Jeśli twój polydedron jest skomplikowany, rozważ użycie integracji Monte Carlo, która jest często używana do wielowymiarowych całek.Będziesz potrzebował hipersześcianu i będziesz musiał sprawdzić, czy dany punkt znajduje się wewnątrz wielościanu, czy poza nim. Musisz być cierpliwy, ponieważ integracja z Monte Carlo jest powolna.

Rozpocząć jak zwykle w Wikipedii, a następnie postępować zgodnie ze stronami linków zewnętrznych w celu dalszego czytania.

(Dla osób niezaznajomionych z integracją Monte Carlo, oto jak obliczyć masę. Wybierz punkt w zawierającego hipersześcianu. Dodaj do licznika point_total. Czy to w wielościan? Jeśli tak, dodaj do licznika point_internal. Czy to wiele (patrz zbieżność i błąd związany szacunki). Następnie

mass_polyhedron/mass_hypercube \approx points_internal/points_total.

przez moment bezwładności, to waga każdej liczby przez kwadrat odległości od punktu do osi odniesienia.

Najtrudniejszą częścią jest sprawdzenie, czy punkt jest w środku lub poza twoim wielościanem. Jestem pewien, że istnieją algorytmy geometrii obliczeniowej do tego.

1

Jest to opisane w książce "Gra Fizyka, drugie wydanie" D. Eberly'ego. Kod chapter 2.5.5 i przykładowy kod są dostępne online. (Po prostu go znalazłem, jeszcze go nie wypróbowałem.)

Należy również zauważyć, że wielościan nie musi być wypukły, aby formuły działały, musi to być tylko simple.

Powiązane problemy