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

Вниз

Помогите найти отличия ?   Найти похожие ветки 

 
Affine   (2006-12-21 01:35) [0]

Две функции работающие по разному:

function RayCastTriangleIntersectCulling(const rayStart, rayVector :
TVector;
                                  const p1, p2, p3 : TAffineVector;
                                  intersectPoint : PVector = nil;
                                  intersectNormal : PVector = nil) :
Boolean;
var
   pvec : TAffineVector;
   v1, v2, qvec, tvec : TVector;
   t, u, v, det : Single;
begin
   VectorSubtract(p2, p1, v1);
   VectorSubtract(p3, p1, v2);
   VectorCrossProduct(rayVector, v2, pvec);
   det:=VectorDotProduct(v1, pvec);
   if (det<EPSILON2) then begin // vector is parallel to triangle"s plane
      Result:=False;
      Exit;
   end;
   VectorSubtract(rayStart, p1, tvec);
   u:=VectorDotProduct(tvec, pvec);
   if (u<0) or (u>det) then
      Result:=False
   else begin
      qvec:=VectorCrossProduct(tvec, v1);
      v:=VectorDotProduct(rayVector, qvec);
      Result:=(v>=0) and (u+v<=det);
      if Result then begin
         t:= VectorDotProduct(v2, qvec) / det;
         if t>0 then begin
            if intersectPoint<>nil then
               VectorCombine(rayStart, rayVector, t, intersectPoint^);
            if intersectNormal<>nil then
               VectorCrossProduct(v1, v2, intersectNormal^);
         end else Result:=False;
      end;
   end;
end;


и

function RayCastTriangleIntersect(const rayStart, rayVector : TVector;
                                 const p1, p2, p3 : TAffineVector;
                                 intersectPoint : PVector = nil;
                                 intersectNormal : PVector = nil) : Boolean;
var
  pvec : TAffineVector;
  v1, v2, qvec, tvec : TVector;
  t, u, v, det, invDet : Single;
begin
  VectorSubtract(p2, p1, v1);
  VectorSubtract(p3, p1, v2);
  VectorCrossProduct(rayVector, v2, pvec);
  det:=VectorDotProduct(v1, pvec);
  if ((det<EPSILON2) and (det>-EPSILON2)) then begin // vector is parallel to triangle"s plane
     Result:=False;
     Exit;
  end;
  invDet:=cOne/det;
  VectorSubtract(rayStart, p1, tvec);
  u:=VectorDotProduct(tvec, pvec)*invDet;
  if (u<0) or (u>1) then
     Result:=False
  else begin
     qvec:=VectorCrossProduct(tvec, v1);
     v:=VectorDotProduct(rayVector, qvec)*invDet;
     Result:=(v>=0) and (u+v<=1);
     if Result then begin
        t:=VectorDotProduct(v2, qvec)*invDet;
        if t>0 then begin
           if intersectPoint<>nil then
              VectorCombine(rayStart, rayVector, t, intersectPoint^);
           if intersectNormal<>nil then
              VectorCrossProduct(v1, v2, intersectNormal^);
        end else Result:=False;
     end;
  end;
end;


Это из GLScene.

Вроде бы тут только оптимизация? Или я чего-то не замечаю?


 
Affine   (2006-12-22 03:10) [1]

Второй день мучусь.


 
Sapersky   (2006-12-22 12:40) [2]

Насколько я понял, RayCastTriangleIntersectCulling считает проверяемый треугольник "односторонним", т.е. если луч втыкается в него сзади - считается, что попадания нет. Точнее, если угол между нормалью треугольника и лучом отрицательный, проверка вообще не производится:
det := VectorDotProduct(v1, pvec);
if (det<EPSILON2) then Result:=False;
"Зад" или "перед" треугольника определяется порядком перечисления вершин, например, если  по часовой - перед, против - зад, или наоборот, не помню точно.
Большинство моделей в играх и 3D-приложениях делают для оптимизации именно "односторонними" - изнутри на них никто не смотрит.


 
Affine   (2006-12-24 04:04) [3]

Вах ! Понял ! Спасибо большое, дорогой ! Выручил !



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

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

Наверх




Память: 0.47 MB
Время: 0.073 c
1-1163854909
PAVEL315
2006-11-18 16:01
2007.01.14
ПОМОГИТЕ!!!


2-1167119206
Johny
2006-12-26 10:46
2007.01.14
DOS - приложения


15-1167024646
Gulnaz
2006-12-25 08:30
2007.01.14
Где можно найти учет пользователя Interbase?


15-1166631451
IMHO
2006-12-20 19:17
2007.01.14
"Война - войной, а обед - по расписанию"


2-1166683572
ssss
2006-12-21 09:46
2007.01.14
TWebBrowser-ссылка!