Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.037 c
2-1201686174
mrFreeman2007
2008-01-30 12:42
2008.02.24
Установка компонентов в новых версиях Дельфи


15-1201259913
Asker
2008-01-25 14:18
2008.02.24
Сетевая утилита командной строки чтобы отправить сообщение


15-1201165540
РВА
2008-01-24 12:05
2008.02.24
Формирование xml


15-1200926297
@!!ex
2008-01-21 17:38
2008.02.24
Помогите оплатить софтину через PayPal


2-1201628602
NeiL
2008-01-29 20:43
2008.02.24
Выбрать RadioButton





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский