Autor Wątek: Kolizja z trojkatem  (Przeczytany 4288 razy)

Offline Oti

  • Użytkownik

# Czerwiec 09, 2007, 16:27:32
Witam.

nie jestem pewien czy wybralem dobry dzial ale chcialem sie zapytac jak sie robi kolizje z trojkatem(nie smiac sie :P ja tego jeszcze niestety na matmie nie mialem i nie wiem :/) poniewaz bede ich potrzebowal. help plx jak zly dzial to prosze o przeniesienie

Pozdro  ::)

@edit
tak, trudno. nic nie znalazlem. twoj post nic nie wnosi do tematu.
« Ostatnia zmiana: Czerwiec 09, 2007, 16:39:31 wysłana przez Oti »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline gunstar

  • Użytkownik

# Czerwiec 09, 2007, 17:00:11
Wpadlem na to przez przypadek, czy to nie bynajmniej to?

http://codemaker.ovh.org/show.php?kategoria=games&id=51

Offline k_b

  • Użytkownik
    • Blog

# Czerwiec 09, 2007, 17:00:40
tak, trudno. nic nie znalazlem. twoj post nic nie wnosi do tematu.
To poszukaj po angielsku, a nie po polsku. Tak BTW Oti - CapsLock palca nikomu jeszcze nie odgryzł.

Offline Oti

  • Użytkownik

# Czerwiec 09, 2007, 17:20:23
Gunstar : chyba nie.
k_b : oco ci chodzi?

Offline Kurak

  • Użytkownik

# Czerwiec 09, 2007, 17:25:58
Takie jedno pytanie - kolizja czego z trójkątem? Odcinka, drugiego trójkąta, punktu, czy może krowy? Sprecyzuj...

Cytuj
k_b : oco ci chodzi?
Taka podstawowa zasada: zdania zaczynamy z wielkiej litery, w ogóle, lepiej się czyta coś, co jest napisane na podstawowym poziomie, jeśli chodzi o interpunkcję/ortografię/itp.
« Ostatnia zmiana: Czerwiec 09, 2007, 17:27:48 wysłana przez Kurak »

RageX

  • Gość
# Czerwiec 09, 2007, 17:34:50
Niech ktoś zrobi z tym porządek. :/ Jeszcze trochę i zaczną się pojawiać posty w stylu: "Nie umiem dodać dwóch liczb. Pomóżcie!!!!" Po co jest Linkowisko? :/

Żeby nie było: Linkowisko -> Fizyka, matematyka i grafika -> http://www.softsurfer.com/algorithm_archive.htm -> Intersections of Rays, Segments, Planes and Triangles in 3D
« Ostatnia zmiana: Czerwiec 09, 2007, 17:37:05 wysłana przez junglist »

RageX

  • Gość
# Czerwiec 09, 2007, 18:11:12
Cytuj
ja tego jeszcze niestety na matmie nie mialem i nie wiem :/
Zapomnij ze w ogole kiedys bedziesz mial cos takiego na matmie ^^. A zeby dojsc do czegos musisz najpierw jakies podstawy matmy (algebra liniowa, geom. analityczna) zalapac a dopiero potem brac sie za kolizje

Offline Oti

  • Użytkownik

# Czerwiec 09, 2007, 18:14:15
aha czyli zalapac algebry i geom. analityczne a potem zaczac programowac? no to dzieki bardzo , wole bez.
 

chodzi o kolizje kwadratu z trojkatem.

Offline Areal

  • Użytkownik

# Czerwiec 09, 2007, 19:10:24
Cytuj
aha czyli zalapac algebry i geom. analityczne a potem zaczac programowac? no to dzieki bardzo , wole bez.

"wole" to mają ptaki.
Skoro Cię nie interesuje matematyka to po co się bierzesz za takie rzeczy? Bez zrozumienia podstaw matematyki to co najwyżej możesz trochę obrazków i tekstu na ekranie wyświetlić... A jak Cię nagle zainteresuje kolizja z okręgiem to też będziesz nowy temat zakładać?!

Ja rozumiem, że tego nie miałeś, ale nie wykazujesz najmniejszych chęci do odrobiny wysiłku i samodzielnej nauki.

RageX

  • Gość
# Czerwiec 09, 2007, 19:20:55
Cytuj
aha czyli zalapac algebry i geom. analityczne a potem zaczac programowac? no to dzieki bardzo , wole bez.
A co stoi na przeszkodzie zeby robic jedno i drugie w jednym czasie? No chyba ze chcesz byc primus inter pares i tak bardzo kochasz szkole ze z kazdego przedmiotu chcesz miec "piatke" - wtedy to faktycznie moze czasu zabraknac ;)

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Czerwiec 10, 2007, 11:55:45
Nie. Programować możesz bez zaawansowanej matematyki, ale pisać gier już nie. Ucz się języka programowania, ucz się biblioteki graficznej, ale chcąc skodzić coś ciekawego i fajnie wyglądającego nie obejdzie się bez znajomości wektorów, macierzy itp. tematów. To nie jest wcale takie trudne. Tego nie nauczą w szkole (ani nawet na studiach!) - na pewno nie dokładnie tego i dokładnie tak, jak jest tutaj potrzebne - ale za to możesz się tego nauczyć z dowolnej książki o programowaniu gier, podstawach DirectX czy OpenGL i jest to zwykle opisane bardzo przystępnie, nie tak jak w jakiejś mądrej książce szkolnej :)

Wracając do tematu - brakuje jeszcze tylko info czy to jest 2D czy 3D. Domyślam się, że 2D. Kolizja kwadratu z trójkątem... Ciężka sprawa :/ Chyba będziesz musiał poszukać algorytmu na kolizję dwóch dowolnych wielokątów w 2D i taki zastosować.

Offline ziomber

  • Użytkownik

  • Zbanowany
# Czerwiec 10, 2007, 13:01:30
To jest fnkcja obliczajaca nowa pozycje kuli wzgledem jakiegos tam polygona (np. trojakata) wazne jest zeby tesotwany wielokat byl wypukły nie wklęsły. Njagorsze jest to, że musisz wyliczyć normalne boków wszystkich wielokątów na scenie (ale to raz)

function SPHERE_INTERSECT_POLYGON(
punkt : t3dpoint;sphere_radius: single; model : tglarrayselectionmodel;
var FACE_INTERSECTIONPOINT : t3dpoint; face_index: integer;
var vRESULT : t3dpoint): boolean;
var
wektor : t3dpoint;
i : integer;
face_arr :  boolean;
cnt:integer;
base_side : integer;
BASE_DISTANCE : single;
BASE_DVOLUME_INDEX : single;
k:integer;
DYSTANS_WIERZCHOLKI : array of single;
NAJBLIZSZY_WIERZCHOLEK : integer;   tnW : single;
NAJBLIZSZY_BOK : integer;                         tnb:single;
DYSTANS_BOKI        : array of single;
uber_point :array of t3dpoint;
BY_VERTEX : BOOLEAN; //jak true to wtedy odbijamy sie od wierzcholka nie od boku
ODLEGLOSC_VERTEX : single;
ODLEGLOSC_BOK : single;
ODLEGLOSC_VOLUME : single;
begin
k:=-1;

BASE_DISTANCE := 1000000000000;
cnt:= -1;
result := false;
face_arr:=false;
tnW := 1000000000000;
tnb := 1000000000000;

if classifyapointagainstaplane(punkt,model.FACE_NORMAL[face_index],model.face_distance[face_index]) = isBACK then  exit;
JESTEM_W_OBSZARZE_T := true;


wektor.x := -100000*model.face_normal[face_index].x;
wektor.y := -100000*model.face_normal[face_index].y;
wektor.z := -100000*model.face_normal[face_index].z;

if  IntersectedPolygon(model.colarrays[face_index],
[punkt,vectors_add(punkt,wektor)],model.facelength[face_index]) = true then begin
//face_dist := n3ddistance(punkt,temp_intersect_v);
FACE_INTERSECTIONPOINT  := temp_intersect_v;
vRESULT :=normalize(vectorAB(FACE_INTERSECTIONPOINT,punkt));

if n3ddistance(FACE_INTERSECTIONPOINT,punkt) <= sphere_radius then begin
result:=true;
end else result:=false;
end else result:=false;



if result = true then exit;
//jak mamy koolizje sfera - wierzcholek
//NAJPIERW POBIERAMY WSZYSTKIE ODELGLOSCI OD TROJAKATA CZY TAM FACE"A
setlength(DYSTANS_WIERZCHOLKI,model.facelength[face_index]);// : array of single;
setlength(DYSTANS_BOKI,model.facelength[face_index]);
setlength(uber_point,model.facelength[face_index]);

for i:=0 to high(model.arrays[face_index]) do  begin
DYSTANS_WIERZCHOLKI[i] := n3ddistance(model.arrays[face_index][i].vertex3f,punkt);// <= sphere_radius then   begin

if i <> high(model.arrays[face_index]) then     begin
uber_point[i] := ClosestPointOnLine(model.arrays[face_index][i].vertex3f,model.arrays[face_index][i+1].vertex3f,punkt);
DYSTANS_BOKI[i] :=  n3ddistance(punkt,uber_point[i])  end else begin

uber_point[i] := ClosestPointOnLine(model.arrays[face_index][i].vertex3f,model.arrays[face_index][0].vertex3f,punkt);
DYSTANS_BOKI[i] :=  n3ddistance(punkt,uber_point[i]); end;

end;

for i:=0 to high(model.arrays[face_index]) do   begin


if DYSTANS_WIERZCHOLKI[i] < tnw then begin
tnw := DYSTANS_WIERZCHOLKI[i];
NAJBLIZSZY_WIERZCHOLEK := i;
end;


if DYSTANS_BOKI[i] < tnb then begin
tnb := DYSTANS_BOKI[i];
NAJBLIZSZY_BOK := i;
end;
                              end;
ODLEGLOSC_VERTEX := n3ddistance(punkt,model.arrays[face_index][NAJBLIZSZY_WIERZCHOLEK].vertex3f);
ODLEGLOSC_BOK := n3ddistance(punkt,uber_point[NAJBLIZSZY_BOK]);
if  ODLEGLOSC_VERTEX <= sphere_radius then begin
result := true;  end;

if  ODLEGLOSC_BOK <= sphere_radius then begin
result := true;    end;


if odleglosc_vertex <= odleglosc_bok then
BY_VERTEX := true else BY_VERTEX := false;





if BY_VERTEX then begin                   
FACE_INTERSECTIONPOINT := model.arrays[face_index][NAJBLIZSZY_WIERZCHOLEK].vertex3f;
vRESULT :=normalize(vectorAB(FACE_INTERSECTIONPOINT,punkt));
//face_dist := n3ddistance(punkt,temp_intersect_v);
end else begin
FACE_INTERSECTIONPOINT   := uber_point[NAJBLIZSZY_BOK];
vRESULT :=normalize(vectorAB(FACE_INTERSECTIONPOINT,punkt));
end;

end;

Offline Demon

  • Użytkownik

# Czerwiec 10, 2007, 20:24:09
Ale co ma kolidować z tym trójkątem? Promień jak w raytracingu czy drugi trójkąt, a może kula lub elipsoida ? Jeżeli elipsoida z trójkątem ( w sumie najczęściej chyba używane do kolizji gracza ze światem ) to nie znam lepszego artykułu niż ten:
http://www.peroxide.dk/papers/collision/collision.pdf

RageX

  • Gość
# Czerwiec 10, 2007, 21:13:17
Support dla ostatnich 5 postów.
Oraz... już dawałem te linki gdzieś, pewnie wtajemniczeni i tak bez mojego dawania linka, znają.

Cały program studiów informatycznych opracowany przez Jegielonke, UW, polibude warszawską i poznanską za pieniądze unijne...
sam się uczę ekonomii, a "skądś" "tą" wiedze musze czerpać - polecam.  ;)

http://wazniak.mimuw.edu.pl/index.php?title=Strona_g%C5%82%C3%B3wna

algebra liniowa, geometria analityczna, oraz grafika komputerowa i wizualizacja. MUS.
Z reszty, wedle potrzeb (najlepiej powoli i ostrożnie).

Offline ziomber

  • Użytkownik

  • Zbanowany
# Czerwiec 10, 2007, 23:37:23
jak ten tutorial jest do dupy, nie mozna zczaic o co chodzi temu gosciowi Nawet kodu na implementacje rekursywy :S i w ogole to co to jest te sliding plane, jak u mnie to przestalo istniec zeby stawiac jakis warunek ze jak sie slizga to cos tam :0