평면에 점을 3D로 투영하려면 어떻게 해야 합니까?
3D 점(point_x, point_y, point_z)이 있는데, 3D 공간의 2D 평면에 투영하려고 합니다. 이 평면은 점 좌표(orig_x, orig_y, orig_z)와 단원 수직 벡터(normal_dx, normal_dz)로 정의됩니다.
떻게게 하면 ?? ???
의 1) ㄹ 수 있는 .orig
v = point-orig (in each dimension);
그 벡터 2)로 .n
:
dist = vx*nx + vy*ny + vz*nz;
= = "스칼라 거리"
3) 단위 법선 벡터에 거리를 곱하고, 그 벡터를 점으로부터 뺍니다.
projected_point = point - dist*normal;
을 조금당신의 사진을 조금 수정했습니다.은 간간 red red red red 。v
v
»normal
= 파란색 및 녹색 길이 (dist
( ) 참참참참주 。은 ★★★★★★★★★★★★★★.normal*dist
Green = blue * -1
: planner_xyz부터 point
녹색 벡터를 추가합니다.
이 답변은 두 가지 기존 답변에 추가된 것입니다.@tmpearce와 @bobobobo의 설명이 어떻게 같은 것으로 요약되는지를 보여주면서 동시에 자신의 상황에 가장 적합한 방정식을 베끼는 것에 관심이 있는 사람들에게 빠른 답변을 제공하는 것을 목표로 하고 있다.
정규 n 및 점 o에 의해 정의된 평면의 방법
이 방법은 @tmpearce의 답변에서 설명되었습니다.
평면에서 정상 n과 점 o를 갖는 평면의 점 정규 정의가 주어진 점 p'에 가장 가까운 평면상의 점 p'는 다음과 같이 구할 수 있다.
1) p' = p - (n µ (p - o)) * n
정규 n 및 스칼라 d로 정의된 평면의 방법
이 방법은 @bobobobo에서 설명했습니다.
정규 n과 스칼라 d에 의해 정의된 평면이 주어졌을 때, 주어진 점 p에 가장 가까운 평면의 점 p'는 다음과 같이 구할 수 있다.
2) p' = p - (n ⋅ p + d) * n
대신 평면의 점 정규 정의가 있는 경우(평면은 평면의 점 n과 점 o에 의해 정의됨) @bobobobo는 d를 찾을 것을 제안합니다.
3) d = -n ⋅ o
그리고 이것을 방정식 2에 삽입합니다.그 결과:
4) p' = p - (n ⋅ p - n ⋅ o) * n
차이에 대한 주의사항
방정식 1과 4를 자세히 살펴보세요.비교해보면 등식 1은 n ( (p - o)를 사용하고, 식 2는 n p p - n o를 사용한다는 것을 알 수 있습니다.같은 것을 쓰는 방법은 두 가지입니다.
5) n ⋅ (p - o) = n ⋅ p - n o o = n ⋅ p + d
따라서 스칼라 d를 '사전 계산'인 것처럼 해석할 수 있다.설명하겠습니다.평면의 n과 o가 알려져 있지만 o가 n ( (p - o)의 계산에만 사용되는 경우에는 평면을 n과 d로 정의하고 대신 n p p + d를 계산하는 것이 좋습니다. 왜냐하면 우리는 방금 같은 것을 보았기 때문입니다.
또한 d를 사용한 프로그래밍에는 두 가지 장점이 있습니다.
- 지금 p'를 찾는 것은 특히 컴퓨터의 경우 더 간단한 계산입니다.비교:
- n과 o 사용: 3 빼기 + 3 곱하기 + 2 더하기
- n과 d 사용: 0 빼기 + 3 곱하기 + 3 더하기
- d를 사용하면 평면 정의가 6(n의 경우 3 + d의 경우 1)이 아닌 4개의 실수(n의 경우 3 + 1)로만 제한됩니다.이것에 의해, 메모리가 절약됩니다.
돼요(여기서 만요.abbr|_
으로부터의 P
비행기까지, 그리고 나서 번역합니다. P
평면 법선 방향으로 수직 거리만큼 뒤로.그 결과는 번역된 것입니다.P
비행기 안에 앉는다.
간단한 예(검사를 통해 확인할 수 있음)를 예로 들어 보겠습니다.
n=(0,1,0) 및 P=(10,20,-5)를 설정합니다.
투영점은 (10,10,-5)이어야 합니다.검사 결과 Pproj는 평면에서 10단위 수직이며 평면에 있으면 y=10이 됩니다.
그럼 어떻게 분석하면 될까요?
평면 방정식은 Ax+By+Cz+d=0이다.이 방정식이 의미하는 것은 "점(x,y,z)이 평면에 있기 위해서는 Ax+By+Cz+d=0을 만족해야 한다"는 것이다.
위에 그려진 평면에 대한 Ax+By+Cz+d=0 방정식은 무엇입니까?
평면의 n=(0,1,0)이 정상입니다.d는 평면에 이미 있는 테스트 포인트를 사용하여 간단히 구할 수 있습니다.
(0)x + (1)y + (0)z + d = 0
점(0,10,0)은 평면에 있습니다.위에 플러그를 꽂으면 d=-10입니다.평면 방정식은 0x + 1y + 0z - 10 = 0입니다(단순화하면 y=10).
의 멋진 d
평면이 원점을 통과하기 위해 평면을 평면으로 변환해야 하는 수직 거리를 말합니다.
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★.d
다음 방정식으로 평면까지의 임의의 점의 |_ 거리를 구할 수 있습니다.
|_ 평면까지의 거리에 대해 3가지 가능한 결과 클래스가 있습니다.
- 0: 정확하게 (부동소수점 부정확성 문제로 인해 거의 발생하지 않음)
- +1: >0: 평면 전면(정상측)
- -1: <0: 평면 뒤(통상 반대쪽)
어쨌든,
위 다이어그램의 검사를 통해 올바른 것을 확인할 수 있습니다.
평면 원점과 정규 벡터만 제공하는 것은 충분하지 않습니다.이렇게 하면 3D 평면이 정의되지만 평면에서 좌표계가 정의되지는 않습니다.
원점과 관련하여 평면을 법선 벡터 중심으로 회전할 수 있다고 생각합니다(즉, 법선 벡터를 원점에 놓고 "회전").
그러나 원점까지의 투영 점의 거리(회전에는 불변함)를 찾을 수 있습니다.
3d 점에서 원점을 빼세요.그런 다음 정상적인 방향으로 교차곱을 합니다.정규 벡터가 정규화된 경우 결과 벡터의 길이는 필요한 값과 같습니다.
편집
완전한 답변을 얻으려면 추가 파라미터가 필요합니다.예를 들어, 평면에서 x축을 나타내는 벡터도 제공합니다.벡터 n과 x가 있습니다 정규화되었다고 가정합니다
원점은 O로 표시되고 3D 점은 p입니다.
그러면 다음과 같이 포인트가 투영됩니다.
x = (p - O) 점 x
y = (p - O) 점(n 십자 x)
V = (orig_x,orig_y,orig_z) - (point_x,point_y,point_z)
N = (normal_displaces, normal_dy, normal_dz)
d = V.dotproduct(N)로 하자.
투영 지점 P = V + d.n
비행기를 묘사하는 방식을 조금 바꿔야 할 것 같아요.실제로 평면을 기술하는 가장 좋은 방법은 벡터 n과 스칼라 c를 사용하는 것이다.
(x, n) = c
(의 절대값) 상수 c는 원점으로부터의 평면의 거리이며 (P, n)와 같습니다. 여기서 P는 평면의 임의의 지점입니다.
따라서, P를 원점으로 하고 A'를 새로운 점 A를 평면에 투영합니다.여러분이 해야 할 일은 A' = A*n이 평면의 방정식을 만족하는 a를 찾는 것이다.
(A - a*n, n) = (P, n)
a를 해결하면
a = (A, n) - (P, n) = (A, n) - c
그러면
A' = A - [(A, n) - c]n
당신의 이름을 사용해서 이렇게 적혀 있습니다.
c = orig_x*normal_dx + orig_y*normal_dy+orig_z*normal_dz;
a = point_x*normal_dx + point_y*normal_dy + point_z*normal_dz - c;
planar_x = point_x - a*normal_dx;
planar_y = point_y - a*normal_dy;
planar_z = point_z - a*normal_dz;
참고: 원점 P 대신 c=(P, n)를 저장하면 코드가 하나의 스칼라 제품을 저장할 수 있습니다. 즉, 기본적으로 각 투영에 대한 플롭이 25% 감소합니다(이 루틴이 코드에 여러 번 사용되는 경우).
r을 투영 포인트로 하고 p를 투영 결과물로 합니다.c를 평면의 임의의 점으로 하고 n을 평면에 대한 정규점(반드시 정규화되지 않음)으로 합니다.어떤 스칼라 m에 대해 p = r + m d라고 적습니다. 이 스칼라 m은 솔루션이 아닌 경우 결정되지 않은 것으로 나타납니다.평면의 모든 점이 이 제한을 충족하기 때문에 (p - c.n = 0이므로, 도트 곱(.)이 사용되는 경우 m = [(c - r.n)]/[d.n]이 됩니다.그러나 d.n = 0이면 해결 방법이 없습니다.예를 들어, d와 n이 서로 수직이면 솔루션을 사용할 수 없습니다.
언급URL : https://stackoverflow.com/questions/9605556/how-to-project-a-point-onto-a-plane-in-3d
'programing' 카테고리의 다른 글
java.lang 수정 방법UnsupportedClassVersionError:지원되지 않는 major.minor 버전 (0) | 2022.07.10 |
---|---|
필수 특성을 가진 vuejs-datepicker가 값 없이 전송됨 (0) | 2022.07.10 |
NuxtJS/VueJs: 페이지가 클라이언트 측에서만 렌더링되었는지 확인하는 방법 (0) | 2022.07.10 |
C에서 '콜백'이란 무엇이며 어떻게 구현됩니까? (0) | 2022.07.10 |
효율성: 어레이와 포인터 비교 (0) | 2022.07.10 |