안기훈_자료_보존용_계정 MYPI

안기훈_자료_보존용_계정
접속 : 2875   Lv. 49

Category

Profile

Counter

  • 오늘 : 180 명
  • 전체 : 242892 명
  • Mypi Ver. 0.3.1 β
[Unreal 게시판] player가 보고 있는 지 여부를 판단하는 방법 (0) 2014/10/23 PM 01:38
Question>

간단한 1인칭게임을 만들고 있습니다.
트리거 박스를 만들고
그 안에 들어가면 메쉬가 움직이는 마티니를
플레이시키는 간단한 구조인데요.

제가 구현하고 싶은것은 플레이어가 트리거 박스안에 있을때 메쉬를
2초정도 바라보면 메쉬가 움직이는 마티니를 구동시키거나
메쉬가 움직이는 애니메이션을 주고 싶은데 "플레이어가 바라볼때" 를
어떤 명령으로 구현해야 할지 전혀 모르겠습니다.

-------------------------------------------------------------

Answer>

2가지 접근이 가능하겠습니다.^^



1>정확하지는 않지만, 간단하게 구현하는 방법.
아래 link 참고하시고요.

C++의 경우:
https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/Engine/UWorld/LineTraceSingle/1/index.html
https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/Engine/UWorld/LineTraceMulti/1/index.html
UWorld::LineTraceSingle()와 UWorld::LineTraceMulti()로 해결하시면 됩니다.

blue print의 경우:
https://docs.unrealengine.com/latest/INT/Gameplay/HowTo/UseRaycasts/Blueprints/index.html
'Single Line Trace'나 'Multi Line Trace'로 해결하시면 됩니다.

link 내용의 trace 함수를들을 이용해서, 바로 보고 있는 지 여부를 판단하시면 되겠습니다.^^

하지만,
이 방법은 시야각의 범위가 고려되지가 않기 때문에, 시야각을 벗어났음에도 불구하고,
보인다고 판단할 수 있는 오류가 발생할 수 있습니다.^^;;;;;



2>까다롭지만, 정확하게 구현하는 방법.
unreal engine으로 만든 game은
대부분 perspective view를 사용하므로,
perspective view의 view frustum을 구성하는 값을 인자로 해서,
class FConvexVolume으로 객체를 만든 후에 아래 함수로 판단합니다.

https://docs.unrealengine.com/latest/INT/API/Runtime/Engine/FConvexVolume/IntersectBox/3/index.html

player의 view frustum에 '상자'가 겹쳐지지 않는다면,
(님은 표현대로 얘기하면, '플레이어가 (상자를) 바라보지 않을 때')
위 함수는 FALSE를 결과값으로 돌립니다.

하지만,
player의 view frustum에 '상자'가 들어 온다면,
(즉, 님이 얘기하신대로 '플레이어가 (상자를) 바라볼때')
위 함수는 TRUE를 결과값으로 돌립니다.

따라서, FConvexVolume::IntersectBox()를 이용하면,
질문의 의도대로 'player가 상자를 볼 때와 보지 않을 때'를
view frustum에 입각하여 정확하게 판단할 수 있습니다.^^

이 방법은 시야각이 100% 고려되서 view frustum이 만들어 지기 때문에,
시야 범위에 대한 오차가 발생할 수 없습니다.^^



처하신 상황에 따라서, 둘 중에 하나 고르세요~ ^^



P.S.
unreal engine 4의 'KismetSystemLibrary.h'를 보면
아래와 같은 형태로 선언되어 있습니다.

UFUNCTION(BlueprintCallable, ..., meta=( ..., FriendlyName = "SingleLineTraceForObjects"))
static ENGINE_API bool LineTraceSingleForObjects( ... );

즉, blue print의 'Single Line Trace For Objects'는
C++의 LineTraceSingleForObjects()로 대응됩니다.-_-;;;;;;;;

마찬가지로,
blue print의 'Multi Line Trace For Objects'는
LineTraceMultiForObjects()로 대응됩니다.-_-;;;;;;;

단어의 순서가 바뀐 이유에 대해서는
저한테 묻지 마시고, tim sweeney에게 물어 보시기 바랍니다.^^;;;;;;;;;;







Tag:
안기훈, Kee Hoon Ahn, 언리얼, Unreal, UDK, iPhone, iPad, app, 앱, iOS

신고

 
X