1. Find a unit vector u in the direction of v = (3, 4). Find a unit vector w perpendicular to u.
벡터 v=(3,4)의 방향과 같은 단위벡터 를 구하시오. 그리고 u에 수직인 단위벡터 w도 구하시오.
개념
| 벡터 | 방향과 크기를 가진 화살표 |
| 노름(norm) | 벡터의 길이(크기), √(x² + y²) |
| 단위벡터 | 길이가 1인 벡터, (x ÷ 길이, y ÷ 길이) |
| 수직벡터 | (-y, x) 또는 (y, -x) 형태 |
단위벡터 u 구하기
벡터 v = (3, 4)의 크기(길이)를 먼저 구한다.
이걸 "벡터의 노름(norm)"이라고 부르며, 다음과 같이 계산한다.
벡터의 크기 = √(3² + 4²)
= √(9 + 16)
= √25
= 5
단위벡터 u는, 원래 벡터를 그 크기로 나눈 것:
단위벡터 u = (3 ÷ 5, 4 ÷ 5)
= (0.6, 0.8)


u에 수직인 단위벡터 w 구하기
2차원 평면에서 어떤 벡터 (x, y)에 수직인 벡터는 (-y, x) 또는 (y, -x)처럼 바꾼다.
즉, 방향을 90도 회전시킨다고 생각하면 된다.
단위벡터 u = (0.6, 0.8)
그에 수직인 벡터 w는
→ (-0.8, 0.6) 또는 (0.8, -0.6)
이 벡터들도 크기를 계산해보면 √(0.8² + 0.6²) = √(0.64 + 0.36) = √1 = 1
즉, 이들도 단위벡터이다.


정답
단위벡터 u = (0.6, 0.8)
수직 단위벡터 w = (-0.8, 0.6) 또는 (0.8, -0.6)
2. Find the unit vector in the directions of v = (3, 4). Choose vectors that make 0, 90, and 180 angles with v.
벡터 v = (3, 4)와 같은 방향의 단위벡터를 구하시오.
그리고 벡터 v와 이루는 각도가 0도, 90도, 180도인 벡터들을 각각 하나씩 고르시오.
개념
| 각도 | 두 벡터가 이루는 방향 차이(0: 방향 같음, 90: 서로 수직, 180: 정확히 반대) |
벡터 v의 단위벡터 구하기
벡터 v = (3, 4)의 단위벡터를 먼저 구한다.
벡터의 크기(norm)은 다음과 같이 계산한다.
벡터의 크기 = √(3² + 4²)
= √(9 + 16)
= √25
= 5

단위벡터 u는, 원래 벡터를 그 크기로 나눈 것:
단위벡터 u = (3 ÷ 5, 4 ÷ 5)
= (0.6, 0.8)

각도에 따른 벡터 고르기
1. 0도인 벡터 (같은 방향)
v와 방향이 같은 벡터는 단위벡터 u 자체이다.
→ 정답: (0.6, 0.8)
이 벡터는 v와 정확히 같은 방향이고, 길이는 1이기 때문에 단위벡터이다.

2. 180도인 벡터 (반대 방향)
벡터의 방향을 완전히 뒤집으려면, 단위벡터 u에 마이너스를 붙이면 된다.
→ 정답: (-0.6, -0.8)
이 벡터는 v와 정반대 방향을 가리키고, 역시 길이가 1이다.

3. 90도인 벡터 (수직)
벡터 (x, y)에 수직인 벡터는 (-y, x) 또는 (y, -x)이다.
단위벡터 u = (0.6, 0.8)이므로,
→ 수직 단위벡터 w는 (-0.8, 0.6) 또는 (0.8, -0.6)
이 벡터도 길이가 1이고, v와 직각(90도)을 이룬다.

or


정답
| 0도 | (0.6, 0.8) |
| 90도 | (-0.8, 0.6) 또는 (0.8, -0.6) |
| 180도 | (-0.6, -0.8) |
3. For any unit vectors v and w, find the dot products (actual numbers) of
(a) v and −v,
(b) v + w and v − w,
(c) v − 2w and v + 2w
단위벡터 v와 w에 대해 다음 내적(dot product)의 값을 구하시오. (숫자로 계산)
(a) 벡터 v와 -v의 내적
(b) 벡터 (v + w)와 (v − w)의 내적
(c) 벡터 (v − 2w)와 (v + 2w)의 내적
개념
| 내적 (dot product) | 두 벡터를 곱하는 연산. 값은 하나의 숫자가 됨 |
| 내적 공식 | (x₁, y₁) · (x₂, y₂) = x₁×x₂ + y₁×y₂ |
단위벡터 v, w는 다음 성질을 갖는다:
‖v‖ = 1, ‖w‖ = 1, v · v = 1, w · w = 1
(a) v · (−v)
v와 −v는 방향이 정확히 반대인 벡터이다.
벡터와 그 부호 반대 벡터의 내적은 항상 −1이다.
v · (−v) = −(v · v) = −1
(b) (v + w) · (v − w)
(v + w) · (v − w)
= v·v − v·w + w·v − w·w
v·v = 1, w·w = 1, v·w = w·v이므로 다음과 같이 된다:
= 1 − v·w + v·w − 1
= 1 − 1 = 0
(c) (v − 2w) · (v + 2w)
(v − 2w) · (v + 2w)
= v·v + 2v·w − 2w·v − 4w·w
v·v = 1, w·w = 1, v·w = w·v이므로:
= 1 + 2(v·w) − 2(v·w) − 4
= 1 − 4 = -3
정답
| (a) | −1 |
| (b) | 0 |
| (c) | −3 |
4. If ‖v‖ = 5 and ‖w‖ = 3, what are the smallest and largest values of ‖v − w‖?
What are the smallest and largest values of v · w?
벡터 v와 w의 크기가 각각 5, 3일 때,
벡터 (v − w)의 최소 크기와 최대 크기?
벡터 v · w의 최소 값과 최대 값?
개념
| 내적(dot product) | 두 벡터의 방향과 크기를 곱한 값. v · w = ‖v‖ × ‖w‖ × cosθ |
| θ(세타) | 두 벡터가 이루는 각도 (0도 ~ 180도) |
(1) ‖v − w‖의 최대값과 최소값
(v − w)의 크기
‖v − w‖² = ‖v‖² + ‖w‖² − 2 × ‖v‖ × ‖w‖ × cosθ
‖v‖ = 5, ‖w‖ = 3이므로
‖v − w‖² = 5² + 3² − 2 × 5 × 3 × cosθ
= 25 + 9 − 30 × cosθ
= 34 − 30 × cosθ
따라서,
‖v − w‖ = √(34 − 30 × cosθ)
최대값 (cosθ = −1)
‖v − w‖ = √(34 − 30 × (−1))
= √(34 + 30)
= √64
= 8
최소값 (cosθ = 1)
‖v − w‖ = √(34 − 30 × 1)
= √(34 − 30)
= √4
= 2
(2) v · w의 최대값과 최소값
내적 공식
v · w = ‖v‖ × ‖w‖ × cosθ
= 5 × 3 × cosθ
= 15 × cosθ
최대값 (cosθ = 1)
v · w = 15 × 1 = 15
최소값 (cosθ = −1)
v · w = 15 × (−1) = −15
정답
항목 최소값 최대값
| ‖v − w‖ | 2 | 8 |
| v · w | −15 | 15 |
5. Find the transformation matrix that rotates 60 degrees about x-axis centered at (2, 2, 1) and rotates 45 degrees about y-axis.
x축을 기준으로 60도 회전하고, 그 다음 y축을 기준으로 45도 회전하는 3차원 회전 변환 행렬을 구하시오.
단, 회전 중심은 (2, 2, 1)이다.
개념
| 변환 행렬 | 3D 공간에서 회전, 이동 등을 수학적으로 표현하는 행렬 |
| 회전 행렬 | 특정 축(x, y, z)을 기준으로 몇 도 회전할지를 나타내는 3×3 또는 4×4 행렬 |
| 중심 회전 | 회전이 원점이 아닌 점 (a, b, c)를 기준으로 일어날 때, 이동 → 회전 → 되돌리기 과정이 필요함 |
| 동차 좌표(homogeneous) | 3D 변환을 4×4 행렬로 통합 표현할 수 있는 방식. 이동도 함께 포함할 수 있음 |
회전 행렬 기본 공식
x축 기준 회전 (theta = θ도)
Rx(θ) =
[ 1 0 0 0
0 cosθ −sinθ 0
0 sinθ cosθ 0
0 0 0 1 ]
y축 기준 회전 (theta = θ도)
Ry(θ) =
[ cosθ 0 sinθ 0
0 1 0 0
−sinθ 0 cosθ 0
0 0 0 1 ]
풀이 순서 (회전 중심: (2, 2, 1))
회전 중심이 원점이 아니므로 다음 3단계를 적용한다
- 회전 중심을 원점으로 옮기기 (−2, −2, −1)
- 회전 행렬 적용 (x축 60도 → y축 45도)
- 다시 원래 자리로 되돌리기 (+2, +2, +1)
즉, 전체 변환 행렬은 다음과 같다:
T_total = T_back × Ry(45°) × Rx(60°) × T_to_origin
1단계: 이동 행렬 T_to_origin (회전 중심을 원점으로 이동)
T_to_origin =
[ 1 0 0 −2
0 1 0 −2
0 0 1 −1
0 0 0 1 ]
2단계: 회전 행렬
Rx(60°)
(cos60 = 0.5, sin60 = √3 / 2 ≈ 0.866)
Rx =
[ 1 0 0 0
0 0.5 −0.866 0
0 0.866 0.5 0
0 0 0 1 ]
Ry(45°)
(cos45 = √2 / 2 ≈ 0.707, sin45 = √2 / 2 ≈ 0.707)
Ry =
[ 0.707 0 0.707 0
0 1 0 0
−0.707 0 0.707 0
0 0 0 1 ]
3단계: 이동 행렬 T_back (되돌리기)
T_back =
[ 1 0 0 2
0 1 0 2
0 0 1 1
0 0 0 1 ]
정답 (변환 행렬의 구성)
T_total = T_back × Ry(45°) × Rx(60°) × T_to_origin
T_total ≈
[ 0.707 0.612 0.354 -1.478
0 0.500 -0.866 2.232
-0.707 0.612 0.354 1.154
0 0 0 1 ]
6. Write the transformation matrix that rotates 30 degrees about an arbitrary vector (1, 1, 1) passing through a point (3, 2, 5).
벡터 (1, 1, 1)을 축으로 하여 30도 회전하는 3차원 회전 변환 행렬을 구하시오.
단, 회전은 점 (3, 2, 5)를 중심으로 일어난다.
개념
| 임의의 회전축 | x, y, z 축이 아닌 벡터 (1, 1, 1)처럼 특정 방향을 나타내는 축 |
| 중심 회전 | 회전이 원점이 아닌 점 (3, 2, 5)에서 일어나므로 이동과 되돌리기가 필요함 |
| Rodrigues 공식 | 임의의 축을 기준으로 회전할 때 사용하는 수학적 회전 공식 |
Rodrigues 회전 공식
단위벡터 (x, y, z)를 기준으로 θ도 회전하는 3D 회전 행렬:
R = I × cosθ + (1 − cosθ) × (u uᵀ) + [u]_× × sinθ
이걸 4×4 행렬 형태로 정리하면 다음과 같은 고정된 형태로 바뀐다.
회전축 벡터 (1, 1, 1) 정규화
우선 (1, 1, 1)을 단위벡터로 만들어야 한다.
단위벡터 u = (1 / √3, 1 / √3, 1 / √3)
≈ (0.577, 0.577, 0.577)
회전 각도 30도
cos(30°) = √3 / 2 ≈ 0.866
sin(30°) = 1 / 2 = 0.5
Rodrigues 회전 행렬
임의의 축 (1, 1, 1)에 대해 30도 회전 행렬 R:
R ≈
[ 0.910 −0.244 0.333
0.333 0.910 −0.244
−0.244 0.333 0.910 ]
이동 행렬
T_to_origin =
[ 1 0 0 -3
0 1 0 -2
0 0 1 -5
0 0 0 1 ]
되돌리기 행렬
T_back =
[ 1 0 0 3
0 1 0 2
0 0 1 5
0 0 0 1 ]
Rodrigues 회전 행렬 R을 동차좌표 4×4로 확장
R_homo =
[ 0.910 −0.244 0.333 0
0.333 0.910 −0.244 0
−0.244 0.333 0.910 0
0 0 0 1 ]
전체 변환 행렬
아래 곱으로 구성:
T_total = T_back × R_homo × T_to_origin
정답
T_total ≈
[ 0.910 −0.244 0.333 t1
0.333 0.910 −0.244 t2
−0.244 0.333 0.910 t3
0 0 0 1 ]
t1, t2, t3 계산
T_total ≈
[ 0.910 −0.244 0.333 0.368
0.333 0.910 −0.244 0.671
−0.244 0.333 0.910 4.960
0 0 0 1 ]
7. (programming) Given a set of vertices, find a test to determine whether the polygon that they determine is planar.
주어진 꼭짓점(vertex) 집합이 이루는 다각형(혹은 다면체의 한 면)이 한 평면(plane) 위에 놓이는지 아닌지를 확인하는 방법을 프로그래밍적으로 제시하시오.
개념
| vertex (꼭짓점) | 3차원 공간에서의 점 (x, y, z) |
| 평면 방정식 | ax + by + cz + d = 0 형태의 방정식 |
| 법선 벡터(normal vector) | 평면에 수직인 방향 벡터 |
| 면의 평탄성(planarity) | 점들이 동일한 평면 위에 있는지 여부 |
| cross product | 두 벡터의 외적. 법선 벡터를 구할 때 사용됨 |
점이 3개만 있으면 항상 평면에 놓임 (세 점은 항상 하나의 평면을 정의함)
4개 이상의 점이 있는 경우에는
이 점들이 모두 하나의 평면 위에 있는지 확인해야 함.
1. 처음 3개의 점으로 평면을 정의한다.
예: A, B, C → 두 벡터 AB, AC 생성 → AB × AC를 통해 법선 벡터 n을 구함
2. 나머지 모든 점 D, E, …에 대해 이 점이 평면 위에 있는지 판단:
점 D가 평면 ABC 위에 있다면, AD 벡터는 평면의 법선 벡터와 수직이므로,
n · AD = 0
위 식을 만족하면 D는 평면 위에 있음.
3. 모든 점에 대해 위 테스트를 반복해서
하나라도 조건을 만족하지 않으면 비평면(polygons not planar).
| 3개 이하의 점 | 항상 평면 위에 있음 |
| 4개 이상의 점 | 첫 3개 점으로 정의된 평면의 법선 벡터 n을 구하고, 나머지 점들과의 벡터 내적(n · AD)이 0인지 확인 |
| 내적이 0이 아니면 | 해당 점은 평면 밖에 있으므로 비평면(polygons not planar) |
주어진 3차원 꼭짓점들이 한 평면 위에 있는지 판단하려면, 먼저 첫 세 점으로 평면을 정의하고 두 벡터의 외적을 통해 법선 벡터를 구한 뒤, 나머지 각 점에서 첫 점까지의 벡터와 법선 벡터의 내적을 계산한다. 이 내적이 0이면 해당 점이 평면 위에 있다는 의미이고, 하나라도 내적이 0이 아닌 점이 있다면 그 다각형은 평면이 아니다. 이 과정을 반복문과 조건문으로 구현하면 프로그래밍적으로 판단할 수 있다.
정답
import numpy as np
def is_planar(vertices):
if len(vertices) < 4:
return True # 3개 이하면 항상 평면
A = np.array(vertices[0])
B = np.array(vertices[1])
C = np.array(vertices[2])
AB = B - A
AC = C - A
normal = np.cross(AB, AC)
for D in vertices[3:]:
AD = np.array(D) - A
dot_product = np.dot(normal, AD)
if abs(dot_product) > 1e-6:
return False
return True
# 사용자 입력 받기
print("입력 형식: x y z (예: 1 2 3), 입력 종료 시 'end' 입력")
vertices = []
while True:
line = input("> ")
if line.strip().lower() == "end":
break
try:
x, y, z = map(float, line.strip().split())
vertices.append([x, y, z])
except:
print("입력 형식이 잘못되었습니다. 다시 입력해주세요.")
# 결과 출력
if is_planar(vertices):
print("→ 주어진 꼭짓점들은 하나의 평면 위에 있습니다.")
else:
print("→ 주어진 꼭짓점들은 하나의 평면 위에 있지 않습니다.")
8. (programming) Given two nonparallel, three-dimensional vectors u and v, how can we form an orthogonal coordinate system in which u is one of the basis vectors?
3차원 공간에서 평행하지 않은 벡터 u와 v가 주어졌을 때, 벡터 u를 기준축 중 하나로 사용하면서 직교하는 3개의 기준 벡터(x축, y축, z축)를 만드는 방법을 프로그래밍적으로 설명하시오.
개념
| 직교 좌표계 | 서로 수직인 3개의 축으로 구성된 좌표계 (x, y, z) |
| 벡터 u | 첫 번째 기준 벡터 (x축 역할) |
| 벡터 v | u와 평행하지 않은 벡터 (방향 보조용) |
| cross product (외적) | 두 벡터의 외적은 두 벡터에 모두 수직인 벡터를 생성함 |
| normalize | 벡터의 길이를 1로 맞추는 것 (단위 벡터로 만들기) |
목적
서로 수직인 단위 벡터 3개 → (x축, y축, z축)
u를 x축으로 사용
u와 v를 사용해 z축을 만든다 (외적)
u와 z축을 외적해서 y축을 만든다
절차
1. x축 단위 벡터 û = normalize(u)
2. 보조 벡터 v를 이용해, z축 단위 벡터 ŵ = normalize(u × v)
3. y축 단위 벡터 v̂ = normalize(ŵ × û) ← 외적 순서 중요함
이 세 벡터는 서로 직교하며, 오른손 좌표계(right-handed coordinate system)를 이룬다.
오른손 좌표계: 3차원 공간에서 기준 축(x, y, z)의 방향을 직관적으로 판단할 수 있게 해주는 기준
엄지 → x축 방향, 검지 → y축 방향, 중지(위로 굽혀서) → z축 방향
외적 방향을 직관적으로 확인할 수 있어 3D 그래픽스나 로봇 분야에서 표준으로 사용
| x축 | û = u / ‖u‖ |
| z축 | ŵ = normalize(u × v) |
| y축 | v̂ = normalize(ŵ × û) |
주어진 벡터 u와 v가 평행하지 않다면, 먼저 u를 정규화해 x축으로 사용하고, u와 v의 외적을 통해 u와 수직인 z축을 만든 뒤, 다시 z축과 u의 외적을 취해 y축을 만든다. 이렇게 얻은 x̂, ŷ, ẑ는 모두 서로 수직이며 단위벡터이므로 직교 좌표계를 형성한다. 외적을 두 번 활용하며, 벡터의 순서에 따라 좌표계 방향도 결정되므로 오른손 법칙을 따다.
정답
import numpy as np
def normalize(v):
return v / np.linalg.norm(v)
def orthonormal_basis(u, v):
u = normalize(u)
w = normalize(np.cross(u, v)) # z축
v = normalize(np.cross(w, u)) # y축
return u, v, w # x, y, z 축
# 예시 벡터
u = np.array([1, 2, 3])
v = np.array([4, 5, 6])
x_axis, y_axis, z_axis = orthonormal_basis(u, v)
print("x축 단위벡터:", x_axis)
print("y축 단위벡터:", y_axis)
print("z축 단위벡터:", z_axis)
9. (programming) Figure 1 shows the articulated robot that consists of the base, seg1, seg2, and seg3.
- 'base' is located at (0, 0, 0) with the h0 height.
- 'seg1' is located at the end of the base and rotated about (rx1, ry1, rz1) with respect to the base with the h1 height.
- 'seg2' is located at the end of the seg1 and rotated about (rx2, ry2, rz2) with respect to the base with the h2 height.
- 'seg3' is located at the end of the seg1 and rotated about (rx3, ry3, rz3) with respect to the base with the h3 height.
Find the location of the seg1, seg2, and seg3 with respect to the global coordinates.
관절형 로봇이 다음과 같이 구성되어 있다:
- base (기본 베이스): (0, 0, 0)에서 시작하며, 높이는 h0
- seg1: base의 끝에서 시작하며, (rx1, ry1, rz1)만큼 회전함. 높이는 h1
- seg2: seg1의 끝에서 시작하며, (rx2, ry2, rz2)만큼 회전함. 높이는 h2
- seg3: seg1의 끝에서 시작하며, (rx3, ry3, rz3)만큼 회전함. 높이는 h3
이때 각 segment가 global 좌표계 기준으로 어디에 위치하는지 구하시오.
개념
| articulated robot | 여러 개의 회전 가능한 관절(segment)로 이루어진 로봇 |
| global coordinate | 기준 원점 (0, 0, 0)을 기준으로 한 절대 좌표계 |
| local coordinate | 각 segment의 부모 기준으로 한 상대 좌표계 |
| 회전 행렬 | 각 축(x, y, z) 회전 정보를 포함하는 행렬 |
| 동차 좌표 (Homogeneous) | 이동 + 회전을 하나로 표현할 수 있는 4×4 행렬 |
문제 구조 시각화 (요약)
base (0,0,0) ──▶ seg1 ──▶ seg2 ──▶ seg3
회전(r1) 회전(r2) 회전(r3)
높이(h1) 높이(h2) 높이(h3)
seg2, seg3도 base에 대해 회전하지만, 위치는 seg1의 끝에서 출발
좌표 계산 방법
각각의 segment에 대해 다음을 적용해야 한다:
global_position = T_base × T_seg1 × T_seg2 × ... × base_tip
각 segment는 다음 순서로 정의
1. 회전: (rx, ry, rz)
2. 이동: (0, 0, height) → z축 방향으로 높이만큼 이동
각 Segment에 대해 필요한 행렬 구성
회전 행렬
축별 회전 정의
Rx = rotation about x-axis
Ry = rotation about y-axis
Rz = rotation about z-axis
각각 4×4 형태로 구성
이동 행렬 (높이만큼 이동)
예: z축 방향으로 h만큼 이동하는 행렬:
T_translate =
[1 0 0 0
0 1 0 0
0 0 1 h
0 0 0 1]
구현 순서
def get_segment_position(rx, ry, rz, h):
# 회전 행렬 계산 (x, y, z 순으로 회전)
Rx = rotation_matrix_x(rx)
Ry = rotation_matrix_y(ry)
Rz = rotation_matrix_z(rz)
R = Rz @ Ry @ Rx # 회전 조합
T = translation_matrix(0, 0, h)
return R @ T
전체 포지션
T_base = identity matrix
T1 = get_segment_position(rx1, ry1, rz1, h1)
T2 = get_segment_position(rx2, ry2, rz2, h2)
T3 = get_segment_position(rx3, ry3, rz3, h3)
pos1 = T_base @ T1
pos2 = T_base @ T1 @ T2
pos3 = T_base @ T1 @ T3
#@는 행렬 곱 연산
Segment 별 Global 위치 계산 방법
| seg1 | T_base × 회전(rx1,ry1,rz1) × 이동(h1) |
| seg2 | seg1 위치 × 회전(rx2,ry2,rz2) × 이동(h2) |
| seg3 | seg1 위치 × 회전(rx3,ry3,rz3) × 이동(h3) |
각 segment는 회전과 이동을 포함한 4×4 변환 행렬로 표현되며,
이전 segment의 위치에 누적 곱을 적용하여 global 위치를 계산한다.
모든 회전은 회전 행렬로, 높이 이동은 z축 이동 행렬로 표현하며
global 좌표계 기준 위치는 T = R × T로 구성다.
정답
import numpy as np
# 각 축 회전 행렬 (각도는 degree 단위)
def rotation_matrix_x(theta_deg):
theta = np.radians(theta_deg)
c, s = np.cos(theta), np.sin(theta)
return np.array([
[1, 0, 0, 0],
[0, c,-s, 0],
[0, s, c, 0],
[0, 0, 0, 1]
])
def rotation_matrix_y(theta_deg):
theta = np.radians(theta_deg)
c, s = np.cos(theta), np.sin(theta)
return np.array([
[ c, 0, s, 0],
[ 0, 1, 0, 0],
[-s, 0, c, 0],
[ 0, 0, 0, 1]
])
def rotation_matrix_z(theta_deg):
theta = np.radians(theta_deg)
c, s = np.cos(theta), np.sin(theta)
return np.array([
[c,-s, 0, 0],
[s, c, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]
])
# 이동 행렬 (z축 방향으로 h만큼)
def translation_matrix(h):
return np.array([
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, h],
[0, 0, 0, 1]
])
# 하나의 segment 변환 행렬 계산
def get_segment_transform(rx, ry, rz, h):
Rx = rotation_matrix_x(rx)
Ry = rotation_matrix_y(ry)
Rz = rotation_matrix_z(rz)
R = Rz @ Ry @ Rx
T = translation_matrix(h)
return R @ T
# 초기값: base는 원점 (0,0,0), 높이 무시
T_base = np.identity(4)
# 사용자 지정 입력값
# (rx, ry, rz, h)
seg1 = (30, 0, 0, 5) # 예: x축 30도 회전, 높이 5
seg2 = (0, 45, 0, 4) # 예: y축 45도 회전, 높이 4
seg3 = (0, 0, 60, 3) # 예: z축 60도 회전, 높이 3
# 각 변환 행렬 계산
T1 = get_segment_transform(*seg1)
T2 = get_segment_transform(*seg2)
T3 = get_segment_transform(*seg3)
# Global 위치 계산
P1 = T_base @ T1
P2 = P1 @ T2
P3 = P1 @ T3
# 각 segment의 끝 위치는 (0, 0, 0, 1)에 변환 행렬을 곱하면 구할 수 있음
tip = np.array([0, 0, 0, 1])
pos_seg1 = P1 @ tip
pos_seg2 = P2 @ tip
pos_seg3 = P3 @ tip
# 출력
print("seg1 global position:", pos_seg1[:3])
print("seg2 global position:", pos_seg2[:3])
print("seg3 global position:", pos_seg3[:3])
10. (programming)Convert the position of the object p in the world frame into the position in the camera frame. The camera is located at c with a basis vector u, v, w.
월드 좌표계(world frame)에서 주어진 어떤 점 p를, 카메라 좌표계(camera frame) 기준의 좌표로 변환하시오.
카메라는 위치 c에 있으며 방향을 나타내는 기준벡터로 u, v, w를 사용한다.
개념
| world frame | 절대 좌표계. 모든 위치의 기준 (예: 지도 기준) |
| camera frame | 카메라 중심으로 재설정된 좌표계 |
| p | 변환하고자 하는 물체의 위치 (월드 기준) |
| c | 카메라 위치 (월드 기준) |
| u, v, w | 카메라 좌표계의 기준 축 (x, y, z 역할) |
| 좌표 변환 | 기준점 이동 + 기준축 재정렬로 좌표를 다시 계산 |
카메라 기준 좌표계로 변환
1. 점 p에서 카메라 위치 c를 빼기
→ 기준점을 원점으로 옮기는 효과
2. 카메라 좌표계(u, v, w)를 기준으로 점을 재표현
→ 카메라의 좌표축을 기준으로 p − c를 다시 표현
변환식
p_camera = [uᵗ
vᵗ
wᵗ] × (p − c)
p − c : 물체가 카메라 기준으로 얼마나 떨어졌는지 (벡터)
uᵗ, vᵗ, wᵗ : 카메라 좌표축의 방향 (행으로 놓고 행렬 곱)
단계 설명
| 1. 점 p에서 카메라 위치 c를 뺌 | 기준점을 카메라로 이동 |
| 2. 카메라 좌표축으로 회전 행렬 구성 | u, v, w를 행으로 쌓아 3×3 행렬 생성 |
| 3. 회전 행렬 × p − c | 카메라 기준의 상대 위치 계산 완료 |
정답
import numpy as np
# 월드 기준의 점 p
p = np.array([10, 5, 3])
# 카메라 위치 (월드 기준)
c = np.array([4, 2, 1])
# 카메라 기준축
u = np.array([1, 0, 0]) # 카메라의 x축
v = np.array([0, 1, 0]) # 카메라의 y축
w = np.array([0, 0, 1]) # 카메라의 z축
# 1. 점 p를 카메라 기준으로 이동
p_relative = p - c # (10,5,3) - (4,2,1) = (6,3,2)
# 2. 카메라 기준축으로 재표현 (행렬 곱)
R = np.vstack([u, v, w]) # 3x3 회전 행렬
p_camera = R @ p_relative
print("카메라 좌표계 기준 점 위치:", p_camera)
벡터: 크기와 방향을 가진 수학적 객체. 딥러닝 Vision과 같은 분야에서 "시점 변화"란, 월드(세계) 좌표계에서 정의된 객체의 위치(벡터 p)를 카메라 좌표계로 변환하는 작업을 의미.
p cam =R⋅(p−c)
p: 월드 프레임에서의 객체 위치 벡터
c: 카메라 기준점 위치 벡터(월드 프레임)
R: 카메라의 방향을 정의하는 회전행렬 (카메라 프레임의 기저벡터: u, v, w)
p cam: 카메라에서 본 객체의 위치 벡터
벡터의 크기: ||v∣∣=x2+y2
벡터의 정규화(단위벡터 생성): u=v∣∣v∣∣
평면에서 (a,b)에 수직인 벡터는 (−b,a) 또는 (b,−a) 형태.
벡터의 회전 공식(2차원):
(x′,y′)=(xcosθ−ysinθ,xsinθ+ycosθ)
벡터 각도 계산: 내적 이용하여 cosθ=v⋅w∣∣v∣∣ ∣∣w∣∣
내적: v⋅w=∣∣v∣∣ ∣∣w∣∣cosθ
단위벡터끼리: 크기가 1이므로 v⋅w=cosθ
선형대수, 머신러닝의 거리와 유사도 계산 등에 중요.
사칙연산, 삼각부등식 ∣∣v−w∣∣*2 =∣∣v∣∣*2 +∣∣w∣∣*2 −2v⋅w
내적 최대/최소: 벡터가 같은(최대)·반대 방향(최소)일 때
회전 행렬(Rotation matrix; 3x3): 각각 x축, y축, z축 기준.
이동(translation)은 3차원에서 4x4 행렬(Homegeneous coordinate) 사용.
축 회전(Arbitrary axis rotation): 축 정규화, Rodrigues 공식.
기준점 중심의 이동: 이동 → 회전 → 되돌리기(역이동)
3점으로 평면 정의 후, 추가 점이 평면 법선과 어떤 관계인지(내적가 0이면 동일 평면).
파이썬: numpy 활용, cross product, dot product
컴퓨팅 지오메트리, 3D 모델링
직교 좌표계
첫 축: u(정규화)
두 번째 축: v(정규화)
세 번째 축: 외적(u × v)로 생성, 좌표계 완성.
Forward Kinematics: 기본 위치 주고, 회전·이동행렬 곱해 전체 위치 추정.
Homegenous Transformation Matrix(4x4): 이동과 회전 동시 표현.
카메라 기준점과 방향벡터(기저 벡터)로 좌표 재계산: pcam=R⋅(p−c)
시점 변화, 딥러닝 Vision
공부해야할 것들
1. 벡터 기본 개념
https://velog.io/@sham/miniRT-%ED%95%B5%EC%8B%AC%EA%B0%9C%EB%85%90-%EB%B2%A1%ED%84%B0%EB%9E%80
2. 선형대수학
3. 회전 행렬 및 좌표 변환
https://end-of-code.tistory.com/33
https://ingus-kinematics.tistory.com/69
4. Rodrigues 공식
https://diesuki4.tistory.com/908
https://freshrimpsushi.github.io/ko/posts/3622/
5. 로봇공학 좌표계 및 변환
https://homo-robotics.tistory.com/13
6. 선형대수/기초 벡터
https://stementor.tistory.com/entry/00-%EB%93%A4%EC%96%B4%EA%B0%80%EB%A9%B0