SlideShare a Scribd company logo
1 of 37
Download to read offline
Picking
쿠재아이
김재경
Picking?
In computer graphics, the task of determining which
screen-rendered object a user has clicked on
- wikipedia
주제 선정 이유
• 예전 스터디에서 Picking에 관한 얘기가 나옴
• ‘그냥 좌표 값 계산하면 되는거 아닌가?’ 라고 생각
• 그래서 생각을 해보니…
흠…
…?!??!?!
!!!!!!!!!!!
마우스 좌표는 2차원인데 오브젝트 좌표는 3차원이네???
어떻게 변환하지?
목표
• Picking 알고리즘을 이해한다
1. 클릭된 화면의 점(s)과 s에 해당하는 투영 창의 점(p)을 구한다
2. View Space에서 선택 반직선을 계산한다. 즉, View Space의 원점에서 시작해서 p를
통과하는 반직선을 구한다
3. 교차 판정을 위해 오브젝트들과 반직선을 같은 공간으로 변환한다
4. 반직선과 교차하는 물체를 찾는다. 교차하는 물체가 여러 개이면 가장 가까운 것을 선택
목표
• Picking 알고리즘을 이해한다 할 수 있을까?
1. 클릭된 화면의 점(s)과 s에 해당하는 투영 창의 점(p)을 구한다
2. View Space에서 선택 반직선을 계산한다. 즉, View Space의 원점에서 시작해서 p를
통과하는 반직선을 구한다
3. 교차 판정을 위해 오브젝트들과 반직선을 같은 공간으로 변환한다
4. 반직선과 교차하는 물체를 찾는다. 교차하는 물체가 여러 개이면 가장 가까운 것을 선택
접근법
• 2D -> 3D 변환은 모르지만 그 반대는 알고 있다. (렌더링 파이프라인)
• 그럼 2D -> 3D 변환을 반대로 하면 되겠네
• 참 쉽죠?
변환 과정
• 3D -> 2D 좌표계 변환은 다음과 같은 과정을 거친다
• Local -> World -> View -> Homogenuouse clip(Perspective) -> NDC
-> Viewport(Screen)
• Homogenuouse clip(Perspective)는 2D -> 3D 변환 할 때는 생략 할 수 있다
• 따라서 2D -> 3D 변환 과정은
• Viewport -> NDC -> View -> World -> Local
Viewport(Screen) -> NDC
[𝑥 𝑛𝑑𝑐, 𝑦 𝑛𝑑𝑐, 𝑧 𝑛𝑑𝑐, 1]
𝑤
2
0 0 0
0
−ℎ
2
0 0
0 0 1 0
𝑤
2
ℎ
2
0 1
= [
𝑥 𝑛𝑑𝑐 𝑤+𝑤
2
,
−𝑦 𝑛𝑑𝑐ℎ+ℎ
2
, 𝑧 𝑛𝑑𝑐, 1]
• 먼저 3D -> 2D 과정을 알아보자
• NDC -> Viewport(Screen) 과정은 다음과 같다
(w = 백버퍼 가로, h = 백버퍼 세로이며 MinDepth = 0, MaxDepth = 1 일 경우)
Viewport(Screen) -> NDC
𝑥 𝑠 =
𝑥 𝑛𝑑𝑐 𝑤 + 𝑤
2
• 그러면 스크린 좌표는 다음과 같다
𝑦𝑠 =
−𝑦 𝑛𝑑𝑐ℎ + ℎ
2
Viewport(Screen) -> NDC
𝑥 𝑛𝑑𝑐 =
2𝑥 𝑠
𝑤
− 1
𝑦 𝑛𝑑𝑐 =
−2𝑦𝑠
ℎ
+ 1
• 이제 역으로 정리해보자
• Viewport(Screen) -> NDC 과정은 다음과 같다
NDC -> View
𝑥 𝑣 = 𝑟(
2𝑥 𝑠
𝑤
− 1)
• 𝑥 𝑛𝑑𝑐만 해상도 종횡비(𝑟)로 곱하면 된다
𝑦𝑣 =
−2𝑦𝑠
ℎ
+ 1
Z 값은?
• Z 값은 cot
𝛼
2
로 계산할 수 있는데… (𝛼는 수직 시야각) Frustum에서
닮은꼴 삼각형의 성질을 이용하면 식을 좀 더 간단하게 바꿀 수 있다 (P는 투영행렬)
𝑥 𝑣
′
=
2𝑥 𝑠
𝑤
− 1
P00
𝑦𝑣
′
=
−2𝑦𝑠
ℎ
+ 1
P11
𝑧 𝑣 = 1
View Space의 좌표를 구했다!
1. 클릭된 화면의 점(s)과 s에 해당하는 투영 창의 점(p)을 구한다 - 완료
2. View Space에서 선택 반직선을 계산한다. 즉, View Space의 원점에서 시작해서 p를
통과하는 반직선을 구한다
3. 교차 판정을 위해 오브젝트들과 반직선을 같은 공간으로 변환한다
4. 반직선과 교차하는 물체를 찾는다. 교차하는 물체가 여러 개이면 가장 가까운 것을 선택
반직선을 계산하자
• 3차원 직선의 방정식
• q와 u의 값은 무엇일까? 생각해보자
rv t = qv + tuv
반직선을 계산했다!
1. 클릭된 화면의 점(s)과 s에 해당하는 투영 창의 점(p)을 구한다 - 완료
2. View Space에서 선택 반직선을 계산한다. 즉, View Space의 원점에서 시작해서 p를
통과하는 반직선을 구한다 - 완료
3. 교차 판정을 위해 오브젝트들과 반직선을 같은 공간으로 변환한다
4. 반직선과 교차하는 물체를 찾는다. 교차하는 물체가 여러 개이면 가장 가까운 것을 선택
코드
반직선을 계산하자
• 메시들을 World Space로 변환하고 교차 판정을 할 수도 있지만 비용이 크다
• 반직선을 Local Space로 변환해서 교차 판정 하자
반직선을 계산하자
rw t = qvV−1
+ tuvV−1
= qw + tuw
• 반직선을 World Space로 변환 (V−1 은 View Matrix의 Inverse)
반직선을 계산하자
rL t = qwW−1
+ tuwW−1
= qL + tuL
• 반직선을 Local Space로 변환 (W−1 은 World Matrix의 Inverse)
코드
반직선과 메시가 같은 공간에 있게 되었다!
1. 클릭된 화면의 점(s)과 s에 해당하는 투영 창의 점(p)을 구한다 - 완료
2. View Space에서 선택 반직선을 계산한다. 즉, View Space의 원점에서 시작해서 p를
통과하는 반직선을 구한다 - 완료
3. 교차 판정을 위해 오브젝트들과 반직선을 같은 공간으로 변환한다 - 완료
4. 반직선과 교차하는 물체를 찾는다. 교차하는 물체가 여러 개이면 가장 가까운 것을 선택
반직선에 교차하는 물체를 찾아야 한다
• 2가지를 생각해보자
1. 모든 오브젝트에 대하여 판정을 해야 한다
2. 반직선과 오브젝트의 모든 폴리곤에 대하여 판정을 해야 한다
• 뭔가 비효율적이지 않나?
반직선에 교차하는 물체를 찾아야 한다
• 2가지를 생각해보자
1. 모든 오브젝트에 대하여 판정을 해야 한다 -> Frustum Culling
2. 반직선과 오브젝트의 모든 폴리곤에 대하여 판정을 해야 한다 -> AABB
• 뭔가 비효율적이지 않나?
Frustum Culling
Frustum Culling
렌더링 파이프라인에서 걸러지는데요???
클리핑의 위치가???
AABB(Asix-Aligned Bounding Box)
• 축 정렬 경계 상자
• 메시를 감싸는 상자를 뜻 함
반직선에 대 삼각형 교차판정
• 삼각형의 좌표를 아래 식처럼 표현할 수 있다
T 𝑢, 𝑣 = v0 + 𝑢 v1 − v0 + 𝑣(v2 − v0)
(𝑢 ≥ 0, 𝑣 ≥ 0, 𝑢 + 𝑣 ≤ 1)
T 𝑢, 𝑣 = v0 + 𝑢 v1 − v0 + 𝑣(v2 − v0)
• 반직선과 삼각형이 만난다는 것은 아래 식을 뜻한다
r t = T(𝑢, 𝑣)
q + 𝑡u = v0 + 𝑢 v1 − v0 + 𝑣(v2 − v0)
−𝑡u + 𝑢 v1 − v0 + 𝑣 v2 − v0 = q − v0
−𝑡u + 𝑢 v1 − v0 + 𝑣 v2 − v0 = q − v0
• 여기서 𝑡, 𝑢, 𝑣를 구해야 한다
e1 = v1 − v0
e2 = v2 − v0
m = q − v0
• 식이 복잡하니 정리하자
• 옆처럼 식을 만들고 정리한다
−𝑡u + 𝑢e1 + 𝑣e2 = m
• 그리고 이 식을 어떻게 잘 정리하면…
𝑡 = e2 ∙ m × e1 /e1 ∙ (u × e2)
𝑢 = m ∙ u × e2 /e1 ∙ (u × e2)
𝑣 = u ∙ m × e1 /e1 ∙ (u × e2)
끝

More Related Content

What's hot

Html5 canvas animation
Html5 canvas animationHtml5 canvas animation
Html5 canvas animationSangHun Lee
 
GeoGebra Model : GC2015X-B201005059
GeoGebra Model : GC2015X-B201005059GeoGebra Model : GC2015X-B201005059
GeoGebra Model : GC2015X-B201005059Taehwan Kim
 
09_Voxel rendering
09_Voxel rendering09_Voxel rendering
09_Voxel renderingnoerror
 
3D 컴퓨터 그래픽스 기초
3D 컴퓨터 그래픽스 기초3D 컴퓨터 그래픽스 기초
3D 컴퓨터 그래픽스 기초Seung Joon Choi
 
10_무한 평면과 놀기
10_무한 평면과 놀기10_무한 평면과 놀기
10_무한 평면과 놀기noerror
 
기본 회전 공식
기본 회전 공식 기본 회전 공식
기본 회전 공식 cancan21st
 
Python Machine Learning - ML02 Linear Regression(선형회귀)
Python Machine Learning - ML02 Linear Regression(선형회귀)Python Machine Learning - ML02 Linear Regression(선형회귀)
Python Machine Learning - ML02 Linear Regression(선형회귀)건환 손
 
IndirectDraw with unity
IndirectDraw with unityIndirectDraw with unity
IndirectDraw with unityJung Suk Ko
 
DP Optimization
DP OptimizationDP Optimization
DP Optimization승혁 조
 
Canvas_basic tutorial
Canvas_basic tutorialCanvas_basic tutorial
Canvas_basic tutorialfairesy
 
Rendering realistic Ice objects
Rendering realistic Ice objectsRendering realistic Ice objects
Rendering realistic Ice objectsyong gyun im
 
실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬현찬 양
 
[ShaderX5] 4.4 Edge Masking and Per-Texel Depth Extent Propagation For Comput...
[ShaderX5] 4.4 Edge Masking and Per-Texel Depth Extent Propagation For Comput...[ShaderX5] 4.4 Edge Masking and Per-Texel Depth Extent Propagation For Comput...
[ShaderX5] 4.4 Edge Masking and Per-Texel Depth Extent Propagation For Comput...종빈 오
 
Post processing in_color
Post processing in_colorPost processing in_color
Post processing in_color민웅 이
 
UNIST Pinocchio - Processing Lecture 4
UNIST Pinocchio - Processing Lecture 4UNIST Pinocchio - Processing Lecture 4
UNIST Pinocchio - Processing Lecture 4송현 김
 
Gpg 벡터와 평면 충돌 기법
Gpg 벡터와 평면 충돌 기법Gpg 벡터와 평면 충돌 기법
Gpg 벡터와 평면 충돌 기법종규 우
 

What's hot (20)

Html5 canvas animation
Html5 canvas animationHtml5 canvas animation
Html5 canvas animation
 
GeoGebra Model : GC2015X-B201005059
GeoGebra Model : GC2015X-B201005059GeoGebra Model : GC2015X-B201005059
GeoGebra Model : GC2015X-B201005059
 
09_Voxel rendering
09_Voxel rendering09_Voxel rendering
09_Voxel rendering
 
3D 컴퓨터 그래픽스 기초
3D 컴퓨터 그래픽스 기초3D 컴퓨터 그래픽스 기초
3D 컴퓨터 그래픽스 기초
 
Open gl
Open glOpen gl
Open gl
 
10_무한 평면과 놀기
10_무한 평면과 놀기10_무한 평면과 놀기
10_무한 평면과 놀기
 
기본 회전 공식
기본 회전 공식 기본 회전 공식
기본 회전 공식
 
Python Machine Learning - ML02 Linear Regression(선형회귀)
Python Machine Learning - ML02 Linear Regression(선형회귀)Python Machine Learning - ML02 Linear Regression(선형회귀)
Python Machine Learning - ML02 Linear Regression(선형회귀)
 
IndirectDraw with unity
IndirectDraw with unityIndirectDraw with unity
IndirectDraw with unity
 
DP Optimization
DP OptimizationDP Optimization
DP Optimization
 
Matlab gui
Matlab guiMatlab gui
Matlab gui
 
Canvas_basic tutorial
Canvas_basic tutorialCanvas_basic tutorial
Canvas_basic tutorial
 
Rendering realistic Ice objects
Rendering realistic Ice objectsRendering realistic Ice objects
Rendering realistic Ice objects
 
실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬
 
[ShaderX5] 4.4 Edge Masking and Per-Texel Depth Extent Propagation For Comput...
[ShaderX5] 4.4 Edge Masking and Per-Texel Depth Extent Propagation For Comput...[ShaderX5] 4.4 Edge Masking and Per-Texel Depth Extent Propagation For Comput...
[ShaderX5] 4.4 Edge Masking and Per-Texel Depth Extent Propagation For Comput...
 
Post processing in_color
Post processing in_colorPost processing in_color
Post processing in_color
 
자료구조05
자료구조05자료구조05
자료구조05
 
자료구조05
자료구조05자료구조05
자료구조05
 
UNIST Pinocchio - Processing Lecture 4
UNIST Pinocchio - Processing Lecture 4UNIST Pinocchio - Processing Lecture 4
UNIST Pinocchio - Processing Lecture 4
 
Gpg 벡터와 평면 충돌 기법
Gpg 벡터와 평면 충돌 기법Gpg 벡터와 평면 충돌 기법
Gpg 벡터와 평면 충돌 기법
 

Similar to Picking

Voxel based game_optimazation_relelase
Voxel based game_optimazation_relelaseVoxel based game_optimazation_relelase
Voxel based game_optimazation_relelaseYEONG-CHEON YOU
 
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법강 민우
 
Ray-triangle intersection
Ray-triangle intersectionRay-triangle intersection
Ray-triangle intersection동환 김
 
컴퓨터 그래픽스 2015-2019년 기말시험
컴퓨터 그래픽스 2015-2019년 기말시험컴퓨터 그래픽스 2015-2019년 기말시험
컴퓨터 그래픽스 2015-2019년 기말시험Lee Sang-Ho
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018devCAT Studio, NEXON
 
Day by day iPhone Programming
Day by day iPhone ProgrammingDay by day iPhone Programming
Day by day iPhone ProgrammingYoung Oh Jeong
 
노말 맵핑(Normal mapping)
노말 맵핑(Normal mapping)노말 맵핑(Normal mapping)
노말 맵핑(Normal mapping)QooJuice
 
인공지능, 기계학습 그리고 딥러닝
인공지능, 기계학습 그리고 딥러닝인공지능, 기계학습 그리고 딥러닝
인공지능, 기계학습 그리고 딥러닝Jinwon Lee
 
Let'Swift 2022 PencilKit과 Point in Polygon 알고리즘을 활용한 올가미 툴 개발기
Let'Swift 2022 PencilKit과 Point in Polygon 알고리즘을 활용한 올가미 툴 개발기Let'Swift 2022 PencilKit과 Point in Polygon 알고리즘을 활용한 올가미 툴 개발기
Let'Swift 2022 PencilKit과 Point in Polygon 알고리즘을 활용한 올가미 툴 개발기Haeseok Lee
 
2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions현정 김
 
내가 이해하는 SVM(왜, 어떻게를 중심으로)
내가 이해하는 SVM(왜, 어떻게를 중심으로)내가 이해하는 SVM(왜, 어떻게를 중심으로)
내가 이해하는 SVM(왜, 어떻게를 중심으로)SANG WON PARK
 
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)Sukwoo Lee
 
Convolutional neural networks
Convolutional neural networksConvolutional neural networks
Convolutional neural networksHyunjinBae3
 
하스켈로 알고리즘 문제 풀기 2
하스켈로 알고리즘 문제 풀기 2하스켈로 알고리즘 문제 풀기 2
하스켈로 알고리즘 문제 풀기 2민석 이
 
프로그래머가 알아야 하는 2진수 기반의 컴퓨터 동작 원리
프로그래머가 알아야 하는 2진수 기반의 컴퓨터 동작 원리프로그래머가 알아야 하는 2진수 기반의 컴퓨터 동작 원리
프로그래머가 알아야 하는 2진수 기반의 컴퓨터 동작 원리중선 곽
 

Similar to Picking (20)

Voxel based game_optimazation_relelase
Voxel based game_optimazation_relelaseVoxel based game_optimazation_relelase
Voxel based game_optimazation_relelase
 
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
 
정점 변환
정점 변환정점 변환
정점 변환
 
Hanoi2
Hanoi2Hanoi2
Hanoi2
 
Ray-triangle intersection
Ray-triangle intersectionRay-triangle intersection
Ray-triangle intersection
 
컴퓨터 그래픽스 2015-2019년 기말시험
컴퓨터 그래픽스 2015-2019년 기말시험컴퓨터 그래픽스 2015-2019년 기말시험
컴퓨터 그래픽스 2015-2019년 기말시험
 
Sw occlusion culling
Sw occlusion cullingSw occlusion culling
Sw occlusion culling
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
 
Day by day iPhone Programming
Day by day iPhone ProgrammingDay by day iPhone Programming
Day by day iPhone Programming
 
노말 맵핑(Normal mapping)
노말 맵핑(Normal mapping)노말 맵핑(Normal mapping)
노말 맵핑(Normal mapping)
 
인공지능, 기계학습 그리고 딥러닝
인공지능, 기계학습 그리고 딥러닝인공지능, 기계학습 그리고 딥러닝
인공지능, 기계학습 그리고 딥러닝
 
Let'Swift 2022 PencilKit과 Point in Polygon 알고리즘을 활용한 올가미 툴 개발기
Let'Swift 2022 PencilKit과 Point in Polygon 알고리즘을 활용한 올가미 툴 개발기Let'Swift 2022 PencilKit과 Point in Polygon 알고리즘을 활용한 올가미 툴 개발기
Let'Swift 2022 PencilKit과 Point in Polygon 알고리즘을 활용한 올가미 툴 개발기
 
2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions2018 Ajou Programming Contest solutions
2018 Ajou Programming Contest solutions
 
자료구조02
자료구조02자료구조02
자료구조02
 
내가 이해하는 SVM(왜, 어떻게를 중심으로)
내가 이해하는 SVM(왜, 어떻게를 중심으로)내가 이해하는 SVM(왜, 어떻게를 중심으로)
내가 이해하는 SVM(왜, 어떻게를 중심으로)
 
알고리즘
알고리즘알고리즘
알고리즘
 
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
2017 12 09_데브루키_리얼타임 렌더링_입문편(3차원 그래픽스[저자 : 한정현] 참조)
 
Convolutional neural networks
Convolutional neural networksConvolutional neural networks
Convolutional neural networks
 
하스켈로 알고리즘 문제 풀기 2
하스켈로 알고리즘 문제 풀기 2하스켈로 알고리즘 문제 풀기 2
하스켈로 알고리즘 문제 풀기 2
 
프로그래머가 알아야 하는 2진수 기반의 컴퓨터 동작 원리
프로그래머가 알아야 하는 2진수 기반의 컴퓨터 동작 원리프로그래머가 알아야 하는 2진수 기반의 컴퓨터 동작 원리
프로그래머가 알아야 하는 2진수 기반의 컴퓨터 동작 원리
 

More from QooJuice

리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션QooJuice
 
캐릭터 애니메이션
캐릭터 애니메이션캐릭터 애니메이션
캐릭터 애니메이션QooJuice
 
Screen space ambient occlusion
Screen space ambient occlusionScreen space ambient occlusion
Screen space ambient occlusionQooJuice
 
UE4 Garbage Collection
UE4 Garbage CollectionUE4 Garbage Collection
UE4 Garbage CollectionQooJuice
 
Compute shader
Compute shaderCompute shader
Compute shaderQooJuice
 
Game programming patterns 2
Game programming patterns 2Game programming patterns 2
Game programming patterns 2QooJuice
 
Game programming patterns
Game programming patternsGame programming patterns
Game programming patternsQooJuice
 
코루틴(Coroutine)
코루틴(Coroutine)코루틴(Coroutine)
코루틴(Coroutine)QooJuice
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템QooJuice
 
Direct x 12 초기화
Direct x 12 초기화Direct x 12 초기화
Direct x 12 초기화QooJuice
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍QooJuice
 
절차지향 vs 객체지향
절차지향 vs 객체지향절차지향 vs 객체지향
절차지향 vs 객체지향QooJuice
 
Segmentation and Paging
Segmentation and PagingSegmentation and Paging
Segmentation and PagingQooJuice
 
Move semantics
Move semanticsMove semantics
Move semanticsQooJuice
 

More from QooJuice (17)

리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션리플렉션과 가비지 컬렉션
리플렉션과 가비지 컬렉션
 
캐릭터 애니메이션
캐릭터 애니메이션캐릭터 애니메이션
캐릭터 애니메이션
 
Screen space ambient occlusion
Screen space ambient occlusionScreen space ambient occlusion
Screen space ambient occlusion
 
UE4 Garbage Collection
UE4 Garbage CollectionUE4 Garbage Collection
UE4 Garbage Collection
 
Compute shader
Compute shaderCompute shader
Compute shader
 
Game programming patterns 2
Game programming patterns 2Game programming patterns 2
Game programming patterns 2
 
Game programming patterns
Game programming patternsGame programming patterns
Game programming patterns
 
코루틴(Coroutine)
코루틴(Coroutine)코루틴(Coroutine)
코루틴(Coroutine)
 
테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
Direct x 12 초기화
Direct x 12 초기화Direct x 12 초기화
Direct x 12 초기화
 
행렬
행렬행렬
행렬
 
벡터
벡터벡터
벡터
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍
 
부팅
부팅부팅
부팅
 
절차지향 vs 객체지향
절차지향 vs 객체지향절차지향 vs 객체지향
절차지향 vs 객체지향
 
Segmentation and Paging
Segmentation and PagingSegmentation and Paging
Segmentation and Paging
 
Move semantics
Move semanticsMove semantics
Move semantics
 

Picking

  • 2. Picking? In computer graphics, the task of determining which screen-rendered object a user has clicked on - wikipedia
  • 3. 주제 선정 이유 • 예전 스터디에서 Picking에 관한 얘기가 나옴 • ‘그냥 좌표 값 계산하면 되는거 아닌가?’ 라고 생각 • 그래서 생각을 해보니…
  • 7. 마우스 좌표는 2차원인데 오브젝트 좌표는 3차원이네??? 어떻게 변환하지?
  • 8. 목표 • Picking 알고리즘을 이해한다 1. 클릭된 화면의 점(s)과 s에 해당하는 투영 창의 점(p)을 구한다 2. View Space에서 선택 반직선을 계산한다. 즉, View Space의 원점에서 시작해서 p를 통과하는 반직선을 구한다 3. 교차 판정을 위해 오브젝트들과 반직선을 같은 공간으로 변환한다 4. 반직선과 교차하는 물체를 찾는다. 교차하는 물체가 여러 개이면 가장 가까운 것을 선택
  • 9. 목표 • Picking 알고리즘을 이해한다 할 수 있을까? 1. 클릭된 화면의 점(s)과 s에 해당하는 투영 창의 점(p)을 구한다 2. View Space에서 선택 반직선을 계산한다. 즉, View Space의 원점에서 시작해서 p를 통과하는 반직선을 구한다 3. 교차 판정을 위해 오브젝트들과 반직선을 같은 공간으로 변환한다 4. 반직선과 교차하는 물체를 찾는다. 교차하는 물체가 여러 개이면 가장 가까운 것을 선택
  • 10. 접근법 • 2D -> 3D 변환은 모르지만 그 반대는 알고 있다. (렌더링 파이프라인) • 그럼 2D -> 3D 변환을 반대로 하면 되겠네 • 참 쉽죠?
  • 11. 변환 과정 • 3D -> 2D 좌표계 변환은 다음과 같은 과정을 거친다 • Local -> World -> View -> Homogenuouse clip(Perspective) -> NDC -> Viewport(Screen) • Homogenuouse clip(Perspective)는 2D -> 3D 변환 할 때는 생략 할 수 있다 • 따라서 2D -> 3D 변환 과정은 • Viewport -> NDC -> View -> World -> Local
  • 12. Viewport(Screen) -> NDC [𝑥 𝑛𝑑𝑐, 𝑦 𝑛𝑑𝑐, 𝑧 𝑛𝑑𝑐, 1] 𝑤 2 0 0 0 0 −ℎ 2 0 0 0 0 1 0 𝑤 2 ℎ 2 0 1 = [ 𝑥 𝑛𝑑𝑐 𝑤+𝑤 2 , −𝑦 𝑛𝑑𝑐ℎ+ℎ 2 , 𝑧 𝑛𝑑𝑐, 1] • 먼저 3D -> 2D 과정을 알아보자 • NDC -> Viewport(Screen) 과정은 다음과 같다 (w = 백버퍼 가로, h = 백버퍼 세로이며 MinDepth = 0, MaxDepth = 1 일 경우)
  • 13. Viewport(Screen) -> NDC 𝑥 𝑠 = 𝑥 𝑛𝑑𝑐 𝑤 + 𝑤 2 • 그러면 스크린 좌표는 다음과 같다 𝑦𝑠 = −𝑦 𝑛𝑑𝑐ℎ + ℎ 2
  • 14. Viewport(Screen) -> NDC 𝑥 𝑛𝑑𝑐 = 2𝑥 𝑠 𝑤 − 1 𝑦 𝑛𝑑𝑐 = −2𝑦𝑠 ℎ + 1 • 이제 역으로 정리해보자 • Viewport(Screen) -> NDC 과정은 다음과 같다
  • 15. NDC -> View 𝑥 𝑣 = 𝑟( 2𝑥 𝑠 𝑤 − 1) • 𝑥 𝑛𝑑𝑐만 해상도 종횡비(𝑟)로 곱하면 된다 𝑦𝑣 = −2𝑦𝑠 ℎ + 1
  • 16. Z 값은? • Z 값은 cot 𝛼 2 로 계산할 수 있는데… (𝛼는 수직 시야각) Frustum에서 닮은꼴 삼각형의 성질을 이용하면 식을 좀 더 간단하게 바꿀 수 있다 (P는 투영행렬) 𝑥 𝑣 ′ = 2𝑥 𝑠 𝑤 − 1 P00 𝑦𝑣 ′ = −2𝑦𝑠 ℎ + 1 P11 𝑧 𝑣 = 1
  • 17. View Space의 좌표를 구했다! 1. 클릭된 화면의 점(s)과 s에 해당하는 투영 창의 점(p)을 구한다 - 완료 2. View Space에서 선택 반직선을 계산한다. 즉, View Space의 원점에서 시작해서 p를 통과하는 반직선을 구한다 3. 교차 판정을 위해 오브젝트들과 반직선을 같은 공간으로 변환한다 4. 반직선과 교차하는 물체를 찾는다. 교차하는 물체가 여러 개이면 가장 가까운 것을 선택
  • 18. 반직선을 계산하자 • 3차원 직선의 방정식 • q와 u의 값은 무엇일까? 생각해보자 rv t = qv + tuv
  • 19. 반직선을 계산했다! 1. 클릭된 화면의 점(s)과 s에 해당하는 투영 창의 점(p)을 구한다 - 완료 2. View Space에서 선택 반직선을 계산한다. 즉, View Space의 원점에서 시작해서 p를 통과하는 반직선을 구한다 - 완료 3. 교차 판정을 위해 오브젝트들과 반직선을 같은 공간으로 변환한다 4. 반직선과 교차하는 물체를 찾는다. 교차하는 물체가 여러 개이면 가장 가까운 것을 선택
  • 21. 반직선을 계산하자 • 메시들을 World Space로 변환하고 교차 판정을 할 수도 있지만 비용이 크다 • 반직선을 Local Space로 변환해서 교차 판정 하자
  • 22. 반직선을 계산하자 rw t = qvV−1 + tuvV−1 = qw + tuw • 반직선을 World Space로 변환 (V−1 은 View Matrix의 Inverse)
  • 23. 반직선을 계산하자 rL t = qwW−1 + tuwW−1 = qL + tuL • 반직선을 Local Space로 변환 (W−1 은 World Matrix의 Inverse)
  • 25. 반직선과 메시가 같은 공간에 있게 되었다! 1. 클릭된 화면의 점(s)과 s에 해당하는 투영 창의 점(p)을 구한다 - 완료 2. View Space에서 선택 반직선을 계산한다. 즉, View Space의 원점에서 시작해서 p를 통과하는 반직선을 구한다 - 완료 3. 교차 판정을 위해 오브젝트들과 반직선을 같은 공간으로 변환한다 - 완료 4. 반직선과 교차하는 물체를 찾는다. 교차하는 물체가 여러 개이면 가장 가까운 것을 선택
  • 26. 반직선에 교차하는 물체를 찾아야 한다 • 2가지를 생각해보자 1. 모든 오브젝트에 대하여 판정을 해야 한다 2. 반직선과 오브젝트의 모든 폴리곤에 대하여 판정을 해야 한다 • 뭔가 비효율적이지 않나?
  • 27. 반직선에 교차하는 물체를 찾아야 한다 • 2가지를 생각해보자 1. 모든 오브젝트에 대하여 판정을 해야 한다 -> Frustum Culling 2. 반직선과 오브젝트의 모든 폴리곤에 대하여 판정을 해야 한다 -> AABB • 뭔가 비효율적이지 않나?
  • 31. AABB(Asix-Aligned Bounding Box) • 축 정렬 경계 상자 • 메시를 감싸는 상자를 뜻 함
  • 32. 반직선에 대 삼각형 교차판정 • 삼각형의 좌표를 아래 식처럼 표현할 수 있다 T 𝑢, 𝑣 = v0 + 𝑢 v1 − v0 + 𝑣(v2 − v0) (𝑢 ≥ 0, 𝑣 ≥ 0, 𝑢 + 𝑣 ≤ 1)
  • 33. T 𝑢, 𝑣 = v0 + 𝑢 v1 − v0 + 𝑣(v2 − v0)
  • 34. • 반직선과 삼각형이 만난다는 것은 아래 식을 뜻한다 r t = T(𝑢, 𝑣) q + 𝑡u = v0 + 𝑢 v1 − v0 + 𝑣(v2 − v0) −𝑡u + 𝑢 v1 − v0 + 𝑣 v2 − v0 = q − v0
  • 35. −𝑡u + 𝑢 v1 − v0 + 𝑣 v2 − v0 = q − v0 • 여기서 𝑡, 𝑢, 𝑣를 구해야 한다 e1 = v1 − v0 e2 = v2 − v0 m = q − v0 • 식이 복잡하니 정리하자 • 옆처럼 식을 만들고 정리한다 −𝑡u + 𝑢e1 + 𝑣e2 = m
  • 36. • 그리고 이 식을 어떻게 잘 정리하면… 𝑡 = e2 ∙ m × e1 /e1 ∙ (u × e2) 𝑢 = m ∙ u × e2 /e1 ∙ (u × e2) 𝑣 = u ∙ m × e1 /e1 ∙ (u × e2)
  • 37.