Форум: "Прочее";
Текущий архив: 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