Главная страница
    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.013 c
15-1167023057
vajo
2006-12-25 08:04
2007.01.14
Может у кого есть принтер Canon LBP-3200


15-1166510583
Fredy314
2006-12-19 09:43
2007.01.14
Интернет через ТВ кабель, как сделать.


2-1167004641
Святослав
2006-12-25 02:57
2007.01.14
mdb файлы в Delphi


15-1166734558
tesseract
2006-12-21 23:55
2007.01.14
все благодарности - Павлу, плакалъ :-)


2-1167060580
jjj
2006-12-25 18:29
2007.01.14
Вопрос по StringGrid`у





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