2009-05-01 14 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.