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

Вниз

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

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

Наверх




Память: 0.46 MB
Время: 0.011 c
15-1166688449
Slider007
2006-12-21 11:07
2007.01.14
С днем рождения ! 21 декабря


11-1143315416
Godness
2006-03-25 22:36
2007.01.14
Как избавится от мерцация формы при добавлении строк в Memo?


2-1166698756
Gerda
2006-12-21 13:59
2007.01.14
Форма всегда на экране


15-1166600761
infom
2006-12-20 10:46
2007.01.14
Сжатие картинок в документах MS Word


1-1164162906
KiloBait
2006-11-22 05:35
2007.01.14
StringGrid and Cross-tab





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский