Главная страница
    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.014 c
11-1143547021
В13
2006-03-28 15:57
2007.01.14
JpegObj - kol ?


2-1166728259
HITMAN
2006-12-21 22:10
2007.01.14
Image1 Каким образом загрузить картинку с сайта???


15-1166818691
Petr V. Abramov
2006-12-22 23:18
2007.01.14
теория очередей


15-1166599709
Хэй
2006-12-20 10:28
2007.01.14
Application


2-1166520745
KyRo
2006-12-19 12:32
2007.01.14
Расскажите как объявлять вункции из dll





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