Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.24;
Скачать: CL | DM;

Вниз

Collision Detection   Найти похожие ветки 

 
@!!ex ©   (2007-01-02 09:31) [0]

Пишу Col Detect на базе вот этой статьи:
http://www.gamedev.ru/articles/?id=30123

Наверно все ее не раз читали.

Все замечательно...
Но стоит подойти к краю полигона на расстояни меньше чем Radius
и InsidePolygon начинает возвращать False.....
Никак не могу понятЬ. почему.
function InsidePolygon(const Intersection:vector; const P:TColPolygon): Boolean;
var
   Angle: Single;
   vA, vB: vector;
begin
 Angle:=0;

 vA := SubVector(P.V1, Intersection);
 vB := SubVector(P.V2, Intersection);
 Angle := Angle + AngleBetweenVectors(vA, vB);

 vA := SubVector(P.V2, Intersection);
 vB := SubVector(P.V3, Intersection);
 Angle := Angle + AngleBetweenVectors(vA, vB);

 vA := SubVector(P.V3, Intersection);
 vB := SubVector(P.V1, Intersection);
 Angle := Angle + AngleBetweenVectors(vA, vB);

 if Angle >= (MATCH_FACTOR * (2.0 * PI)) then
 begin
  Result := True;
  Exit;
 end;

 Result := False;
end;


 
@!!ex ©   (2007-01-02 11:06) [1]

Вс нашел, все исправил.
Народ, кто будет в дальнейшем пользоваться этой статьей:
MATCH_FACTOR = 0.9 слишком большая величина.
Я поставил 0.99999 и все сразу стало значительно лучше.


 
ors_archangel ©   (2007-01-03 04:28) [2]

Код [0] дважды вычисляет длину каждого вектора :( Лучше так:

function InsideTri(const tri: TTri; const pt: TVertex): boolean;
var
 a,b,c: TVector;
 alen,blen,clen: single;
 angle, sum: single;
begin
 a := vdiff(tri[0],pt);
 b := vdiff(tri[1],pt);
 c := vdiff(tri[2],pt);
 alen := sqrt(a.x*a.x + a.y*a.y + a.z*a.z);
 blen := sqrt(b.x*b.x + b.y*b.y + b.z*b.z);
 clen := sqrt(c.x*c.x + c.y*c.y + c.z*c.z);
 angle := arccos((a.x*b.x + a.y*b.y + a.z*b.z) / (alen*blen));
 if isnan(angle) then sum := 0 else sum := angle;
 angle := arccos((b.x*c.x + b.y*c.y + b.z*c.z) / (blen*clen));
 if not isnan(angle) then sum := sum + angle;
 angle := arccos((c.x*a.x + c.y*a.y + c.z*a.z) / (clen*alen));
 if not isnan(angle) then sum := sum + angle;
 result := (sum >= 0.9999 * 2.0*pi);
end;


 
@!!ex ©   (2007-01-03 09:26) [3]


> ors_archangel ©   (03.01.07 04:28) [2]

Согласен.
Но Сейчас пока не до оптимизации.
ИМХО оптимизировать надо полностью работающий код. :))



Страницы: 1 вся ветка

Текущий архив: 2008.02.24;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.019 c
9-1166065606
GameDev
2006-12-14 06:06
2008.02.24
Что случилось с Animiks ?


2-1201798008
batya-x
2008-01-31 19:46
2008.02.24
дождаться нажатия клавиши


2-1201664984
mrFreeman2007
2008-01-30 06:49
2008.02.24
Отлов нажатия клавиши


2-1201517882
tomkat
2008-01-28 13:58
2008.02.24
данные фильтра


2-1201856974
operator
2008-02-01 12:09
2008.02.24
О создании и удалении компонентов.