카메라의 광선(Rays)

View Frustum의 단원에서는, 카메라의 뷰 내의 어떤 점이 월드 공간에서 선에 해당한다는 것을 설명합니다. 해당 선에 대한 수학적 표현을 보여주는 것이 때로는 유용할 수 있어 Unity는 이를 Ray 오브젝트의 형태로 제공할 수 있습니다. 해당 Ray는 뷰에서 항상 한 점과 연결되므로, 그 Camera 클래스는 ScreenPointToRayViewportPointToRay 기능을 제공합니다. 이 둘의 차이점은 ScreenPointToRay 는 그 점이 픽셀 좌표로 제공될 것으로 예상하고, 반면 ViewportPointToRay 는 0..1 범위 내에서 정규화 된 좌표를 취한다는 것입니다 (여기서 0은 뷰의 하단 혹은 왼쪽을 나타내고 1은 상단 혹은 오른쪽을 나타낸다). 이 기능들의 각각은 원점과 그 원점으로부터 선의 방향을 표시하는 벡터로 구성된 Ray을 반환합니다. 이 Ray는 Camera의 transform.position 지점 보다는 근거리 클리핑 평면(near clipping plane)에서 출발합니다.

레이캐스팅(Raycasting)

카메라로부터 오는 Ray의 가장 일반적인 사용은 씬에 raycast 수행하는 것입니다. raycast 는 가상의 “레이저 빔”을 원점으로부터 해당 ray을 따라 씬에서 충돌체(collider)에 부딪힐 때까지 전송합니다. 그러면 해당 오브젝트에 대한 정보와 RaycastHit오브젝트에서 이 부딪힌 지점이 반환됩니다. 이는 화면상의 이미지를 기반으로 오브젝트를 찾을 수 있는 매우 유용한 방법입니다. 예를 들어, 마우스 위치에 있는 오브젝트는 다음 코드로 확인할 수 있습니다:-

var hit: RaycastHit;
var ray: Ray = camera.ScreenPointToRay(Input.mousePosition);
 
if (Physics.Raycast(ray, hit)) {
	var objectHit: Transform = hit.transform;
 
	// Do something with the object that was hit by the raycast.
}

카메라에 따른 광선(Ray) 움직이기

화면의 위치에 대응하는 광선을 얻어 그 광선을 따라 카메라를 이동하는 것이 때로 유용할 수 있습니다. 예를 들어, 사용자가 한 오브젝트를 마우스로 선택한 후 그 오브젝트를 마우스로 화면상 한 위치에 고정시킨 후 줌 인 하기를 원할 수 있습니다 (이는 카메라가 전술 지도와 같은 것을 볼 때 유용할 것이다). 이러한 작업을 수행하는 코드는 매우 간단합니다:-

var zooming: boolean;
var zoomSpeed: float;
 
if (zooming) {
	var ray: Ray = camera.ScreenPointToRay(Input.mousePosition);
	zoomDistance = zoomSpeed * Input.GetAxis("Vertical") * Time.deltaTime;
	camera.transform.Translate(ray.direction * zoomDistance, Space.World);
}

역링크