일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- not working
- 빌드 오류
- 데이터바인딩
- react-native
- 리액트 네이티브
- git인증
- 뒤로가기 안됨
- Invalid credentials
- VisualStudio
- react
- 예제
- WPF
- Kotlin
- 디버깅
- EC2
- 안드로이드 스튜디오
- sourcetree
- 리액트
- 개발환경설정
- aPK
- AWS
- bitbucket
- flutter
- 설정
- 인증문제해결
- Git
- Android
- gradle
- 안됨
- 안드로이드
- Today
- Total
물에 살고싶은 개발자
[퍼옴글] 오브젝트간의 거리 본문
출처 : http://smilemugi.net/wordpress/archives/236
----------------------------------------------------------------------------------
요즘 모바일 프로젝트를 진행하면서 디바이스의 열발생 부분에 대해서 고민을 많이 하고 있다. 디바이스의 열이 발생하는 이유는 당연하게도 CPU, GPU 사용량 때문이다. PC 에서는 CPU 와 GPU 위에 커다란 선풍기(쿨러 ^^;)가 달려 있기 때문에 금방 식기도 하고 사용자들은 크게 느끼지 못한다. 하지만, 모바일 디바이스들은 기기 자체가 발열판 역할도 겸하고 있기 때문에 열이 많이 발생하고 이를 사람 손으로 쉽게 느끼게 되어 디바이스의 열발생에 대해서 민감할 수 밖에 없다.
이를 해결하기 위해서는 아주 간단한 답이 있다. CPU, GPU 사용량을 줄이는 것이다. ^^; 사용량을 줄이기 위해서 여러가지 최적화 방안도 고민을 해야 할 것이다.
아래의 글은 두 오브젝트 간의 거리와 방향을 구하는 방법에 대해서 설명한 것인데, 같은 기능을 사용하더라도 CPU 부하를 덜 주면서 해당 결과를 얻는 방법에 대한 내용이다.
원문 : https://docs.unity3d.com/Documentation/Manual/DirectionDistanceFromOneObjectToAnother.html
두 오브젝트 간의 방향과 거리
공간의 한 점에서 다른 점을 빼면, 그 결과는 한 오브젝트에서 다른 오브젝트를 가리키고 있는 벡터가 된다.
var heading = target.position - player.position; (Player의 위치에서 Target의 위치를 가리키는 벡터)
Target오브젝트 방향으로 가리킬 뿐만 아니라, 이 벡터의 크기(magnitude)는 두 위치간의 거리값과 동일하다. 일반적으로 target 에 대한 방향과 거리를 구하기 위해서는 정규화 된 벡터(normalized vector)가 필요하다. 두 오브젝트간의 거리는 heading 벡터의 크기(magnitude)와 동일하고 이 벡터(heading)는 이 벡터의 크기(heading.magnitude)로 나누면 정규화(normalize) 될 수 있다.
var distance = heading.magnitude;
var direction = heading / distance; // 정규화된 direction 벡터가 되었다.
이러한 접근은 magnitude 와 noramlize 를 각각 사용하는 것보다 우수하다. 왜냐하면, 이런 함수들은 CPU 부하를 주기 때문이다.
근접체크를 위한 거리비교를 위한 것이라면, magnitude 사용을 완전히 피할 수도 있다. sqrMagnitude 는 magnitude 의 제곱 값을 제공한다. 이 것은 시간을 소비하는 Square root(계산 함수) 연산이 없이도 magnitude 처럼 계산 되어질 수 있다. 알려진 거리에 대해서 magnitude 를 비교하는 것 보다, 제곱 거리와 제곱된 magnitude(sqrMagnitude)를 사용해서 비교할 수 있다.
if (heading.sqrMagnitude < maxRange * maxRange) {
// Target is withing range
}
이 것은 비교할 때, 실제 magnitude 를 사용하는 것보다 더 효율적이다.
때때로, target 에 대한 바닥위의 값(y = 0 인값)이 필요하기도 하다. 예를 들면, Player가 서 있고, 공중에 떠 있는 target 에 접근하려고 한다고 상상해 보자. player의 위치로부터 target 위치를 빼면, target 을 위로 향하고 있는 벡터를 얻게 될 것이다. 이 것은 Player의 변환의 기점으로 삼기에는 적절하지 않다. 왜냐하면 위로 향하게 될 것이기 때문이다. 실제로 필요한 것은 player의 위치에서 target의 바닥(y = 0 인값)에서의 위치로 향하는 벡터이다. 이 값은 두 위치의 차 값을 가지고 Y 값을 0 으로 셋팅하면 쉽게 얻어 질 수 있다.
var heading = target.position - player.position;
heading.y = 0; // 바닥 위에서의 heading 값