2013-08-30 2 views
0

다음 코드는 평면을 시각화하기 위해 법선 벡터와 반경을 정의합니다. 내 질문은 d 및 오프셋에 대한 것입니다. d은 비행기 방정식 Ax+By+Cz+D=0에서 D입니다 (d을 제공해야하므로 해당 코드가 하나도 없기 때문에)? 이 코드는 3D 점이 평면의 앞/뒤, 좌/우에 위/아래인지 정의하는 데 도움이됩니다. 이 점을 이해하는 데 도움이되는 피드백은 크게 감사하겠습니다.3d 점이있는 평면 작성

**function [fixture,n,min_radius] = planePointPoint(p1,p2,p3,q,d,varargin)** 

% p1, p2 and p3 -3d points that define an oriented plane. 
%q is the point that is tested against this plane 
% p1+offset is the fixture point for the plane. 
% d is the offset distance for the plane in the direction of n. 
% optional argument offset is a 3-vector denoting an offset to be added to the fixture point during min_radius calculation 
% 
% function returns sequence of fixture points and unit normals along with 
% minimum radii that make sense to visualize position of q in relation to the plane. 
offset = [0;0;0]; 
if (nargin>6) 
    offset = varargin{1}; 
end 
n = cross(p1 - p3,p2 - p3);%defines normal vector 
n = n./repmat(sqrt(sum(n.^2)),3,1);%normalise normal vector 
offset = repmat(offset,1,mot.nframes) - repmat(dot(n,repmat(offset,1,mot.nframes)),3,1).*n; 
%points = p1 + n*d; 
fixture = p1+offset + n*d; 
dist_q = dot(n,q-fixture); 
dist_p1 = dot(n,p1-fixture); 
dist_p2 = dot(n,p2-fixture); 
dist_p3 = dot(n,p3-fixture); 
q_proj = q - repmat(dist_q,3,1).*n; 
p1_proj = p1 - repmat(dist_p1,3,1).*n; 
p2_proj = p2 - repmat(dist_p2,3,1).*n; 
p3_proj = p3 - repmat(dist_p3,3,1).*n; 
radius_q = sqrt(sum((fixture-q_proj).^2)); 
radius_p1 = sqrt(sum((fixture-p1_proj).^2)); 
radius_p2 = sqrt(sum((fixture-p2_proj).^2)); 
radius_p3 = sqrt(sum((fixture-p3_proj).^2)); 
min_radius = max([radius_q; radius_p1; radius_p2; radius_p3]); 

답변

0

이 코드가 무엇을하는지 정확히 이해하지 못하고 있지만, (라인 fixture = p1+offset + n*d;에 사용되는) d는 원점과 세 점에 의해 정의 된면 사이에 서명 된 거리에 있어야한다는 보인다 . 귀하의 비행기를 방정식 Ax+By+Cz+D=0으로 나타내면 (A,B,C)은 코드에 설명 된 n 인 일반 단위 벡터이고 d = - D입니다. 단순히

d = dot(n,p1); 

이 실제 문제 (The code will help me define if a 3D point is above/down, in front/behind, left/right of a plane.)에 관하여 :이 올바른 경우

는, 다음이 다른 입력으로부터 계산 될 수 있기 때문에이 코드는 호출자에서 d 물어 특히 악 썼다 누구든지 이러한 두 개의 라인을 사용 h 다음 널

n = cross(p1 - p3,p2 - p3); 
h = dot(n,q-p1); 

경우 평면 위에 다음 긍정적이고, 그 다음 음수이면 그 미만이면 q는 평면에 속한다. 여기에서 "위"는 q에서 비행기를 보면 p1 ->p2 ->p3 -> 시퀀스가 ​​반 시계 방향으로 순환한다는 것을 의미합니다.

+0

응답을 주셔서 감사합니다. 내가 너무 믿습니다. 나는 사용자로부터 d를 묻는 이유를 이해할 수 없습니다. 기본적으로 코드는 비행기를 움직이기위한 것이므로, 최대 반경을 찾은 것으로 생각합니다. 비행기를 움직이기위한 디스크를 만드십시오. 저는 여러분의 동일한 코드를 사용하여 비행기와 관련하여 삼차원의 삼각형 포인트가 어디에 있는지 정의합니다. –

+0

정상 벡터가 정규화 된 경우 D가 원점에서 서명 된 거리라는 것을 알았습니다. 내가 골격 모션에 대한 코드를 사용하기 때문에 사용자가 정의한 코드에서 임계점으로 사용할 수 있습니까 ?? 예를 들어 해골의 d = 2 * 상완골 길이. 코드의 고정물은 평면의 한 점에서 원점을 전송한다는 것을 의미합니까 ?? 다시 고마워요. 보리스, 대답은 –

+0

안녕하세요. @ pap-00. 나는이 문제에 관해 당신을 도울 수 없을 것이라고 두려워합니다. 컨텍스트가 없으면 변수가 의미하는 바가 무엇인지 짐작할 수 없습니다. 어쨌든이 정보가 있더라도 시간이 많이 걸릴 수 있습니다 .--) 알아 내야 할 것입니다. 너 혼자서. 여전히 이해할 수없는 경우 라이브러리의 다른 사용자 또는 라이브러리 작성자에게 문의하십시오. – Boris

관련 문제