Привет, ребята, просто пытаюсь написать функцию отбраковки задних граней в Matlab, но это довольно сложно, так как я не совсем уверен, как лучше получить список полигонов.
Я хочу иметь возможность начатьс матрицей вершин и матриц лица и каким-то образом получить структуру, где у меня есть список, как объект, который содержит многоугольники, которые я могу перебирать.Ниже мой очень наивный подход для конкретных известных матриц V и F.
%Vertices Matrix
V = [0.5,-0.86,0.36,-0.5;
-0.5,-0.36,0.86,0.05;
10.71,9.65,9.65,10.71;];
% Faces Matrix
F = [1,2,3;
2,4,3;
3,4,1;
1,4,2;];
% Camera Position
P = [1,1,2]';
% Getting Size of F to inform us of the number of polygons
% Currently useless as the program is very specific
[n,m] = size(F);
% Defining Polygons from Faces and vertices
Poly1 = [V(:,1),V(:,2),V(:,3)];
Poly2 = [V(:,2),V(:,4),V(:,3)];
Poly3 = [V(:,3),V(:,4),V(:,1)];
Poly4 = [V(:,1),V(:,4),V(:,2)];
% Trying to create some sort of polygon list not sure how to automate
% this from just V and F.
Polygons = [];
Polygons(:,:,1) = Poly1;
Polygons(:,:,2) = Poly2;
Polygons(:,:,3) = Poly3;
Polygons(:,:,4) = Poly4;
% Call Function
BackFaceCull(Polygons,P,n)
function F = BackFaceCull(Polygons,P,n)
% Front Facing Polygons
F = [];
% So we can label Polygons A-Z (Though in practise we would not use
% However for my use will be very simple set ups with less than 25
% Objects
k = 65;
for i = 1:n
% Create each point on polygon
Polygon = Polygons(:,:,i);
P1 = Polygon(:,1);
P2 = Polygon(:,2);
P3 = Polygon(:,3);
% Find the Normal for this polygon
N = cross((P2 -P1),(P3-P2));
% Find the centre of the polygon ( Triangle) What if it's not a
% triangle?
C = Centroid(P1,P2,P3);
% Apply Test for if forward facing if so add associated polygon
%letter to Front list
if dot((C-P),N) < 0
F = [F char(k)];
end
% update k
k = k+1;
end
end
function C = Centroid(p1,p2,p3)
P1 = (p1(1)+p2(1)+p3(1))/3;
P2 = (p1(2)+p2(2)+p3(2))/3;
P3 = (p1(3)+p2(3)+p3(3))/3;
C = [P1,P2,P3]';
end
TLDR: Как мне реализовать алгоритм отбраковки задней поверхности в Matlab с учетом матрицы V, которая содержит все вершины иматрица F, которая содержит вершины, которые рисуют грань.