Unity3D에서 포털을 통해 여행 할 때 두 대의 카메라를 블렌딩하는 방법


18

내 질문에 도달하기 전에 가장 확실한 해결책은 정규화 된 뷰 포트 rect를 사용하는 것이지만 직사각형보다 복잡한 모양이 필요하며 뷰 포트 rect를 사용하는 것을 보았지만 그렇지 않은 것 같습니다. 내 해결책이 되라.

편집 : 일부 사람들은 내 질문에 혼란 스러웠습니다. 조금 더 자세히 설명하겠습니다. 여기에 이미지 설명을 입력하십시오 플레이어가 한 포털로 이동하면 클론 FPS 컨트롤러를 만들어 다른 포털 밖으로 옮깁니다. 그러면 두 대의 카메라와 오른쪽 위의 뷰가 나타납니다. 하나의 카메라 만 표시하고 포털을 통해 클리핑합니다. 내가 원하는 것은 이것 과 비슷한 것입니다카메라가 블렌드되어 부드러운 전환 효과를 만들어냅니다. 내가하고 싶은 것은 녹색 검사기 이미지에서 아래 이미지의 왼쪽까지 모든 것을 삭제하고 다른 카메라로 바꾸는 것입니다. 이렇게하면 포털에서 정점에 이르는 카메라 A의 뷰 부분을 다른 포털에서 정점에있는 카메라 B의 뷰 부분과 혼합하여 하나의 완전한 이미지를 얻을 수 있습니다. 그리고 포털을 통해 이동할 때 컷이 적절히 변경됩니다.

나는 포털 시스템을 설계하고 있으며 플레이어가 포털을 원활하게 이동할 수 있도록 모든 것을 갖추고 있습니다. 내 주요 문제는 이제 카메라 블렌드 효과 밸브가하는 것입니다. 마치 마치 포털을 통해 머리를 찌르는 것처럼 완벽하게 조화를 이루려면 두 대의 카메라가 필요합니다. 사각형 일뿐 아니라 일치해야하지만 플레이어는 포털을 통해 찾고 있습니다.

지금 당장 내 최고의 리드는 각 포털 뒤에 깊이 마스크 셰이더를 투영 한 다음 여행중인 포털의 카메라를 깊이 전용으로 만드는 것입니다. 그런 다음 어떻게 든 두 카메라를 혼합하십시오. 내 주요 문제는 내가 어떻게하는지, 두 번째 카메라가 포털 외부의 내용 만 렌더링하도록하고 나머지는 기본적으로 카메라 1로 설정하여 하나의 전체 화면 투영을 얻는 것입니다.

아이디어를 주거나 깊이 마스크 셰이더로 어떻게 도움을 줄 수 있는지 설명해 주시면 큰 도움이 될 것입니다. 나는 이것에 대해 계속 연구하고 돌파하면서 업데이트 할 것입니다.


5
"카메라 블렌드 효과 밸브의 기능"이 무엇입니까? 포털 렌더링에서 단일 카메라로 충분하다는 것을 이해했습니다. 일인칭 게임에서는 플레이어에 부착되어 플레이어와 함께 포털을 통과 할 때 자동으로 새 위치로 변환됩니다. 포털 효과를 렌더링하기 위해 변환 된 장면 사본이 렌더링됩니다. 이것은 두 번째 카메라로도 달성 할 수 있지만 이러한 카메라를 혼합 할 필요는 없습니다.
msell

1
나는 이미 시각적 효과가 완벽하게 떨어졌습니다. 내가하려는 것은 포털을 걷는 효과를 얻는 방법을 알아내는 것입니다. 나는 이미 모든 캐릭터 그래픽을 가지고 있으며 부드럽게 움직이며, 1 인칭 관점에서 부드럽게 보이기 만하면됩니다.
Timothy Williams

1
많은 사람들이 문제가 무엇인지 이해하면 문제를 해결하고 싶을 것입니다. 실제로 문제를 더 잘 설명해야합니다. 아마도 그림을 추가하거나 문제를 시각화하는 비디오까지도 포함해야합니다.
msell

2
효과의 비디오 예제에 대한 링크를 추가 할 수 있습니까?
Mike Baxter

2
카메라 / FPS 컨트롤러를 하나만 사용하면 어떻게됩니까? 카메라가 포털을 통해 이동하면 새로운 위치 및 방향으로 카메라를 변환 할 수 있습니다. 포털 렌더링이 올바른 경우 전환이 매끄럽고 혼합이 필요하지 않아야합니다.
msell

답변:


6

문제 이해

내가 당신이 설명하는 문제에서 볼 수있는 것은 포털에 의해 정의 된 평면을 교차하는 카메라의 가까운 평면의 결과입니다. 이 교차로가 발생하는 동안 포털이있는 벽 뒤에서 볼 수 있습니다.

이것은 플레이어가 물 위에서 수중으로 전환 할 때 다른 게임에서 발생 하는 문제 와 유사합니다 . 카메라가 물 바로 위에있는 경우 플레이어보기를 난독 처리하기 위해 후 처리 효과가 적용되지 않습니다 (어둡고 흐릿하며 파란색으로 표시). 따라서 가까운 비행기의 바닥이 물 아래에 있으면 플레이어는 물 아래에서 명확하게 볼 수 있습니다.

맞으면 투영 행렬을 정의 할 때이 평면의 위치를 ​​변경하여 확인할 수 있습니다. 카메라 원점에서 가까운 평면까지의 거리가 멀어 질수록 문제도 발생합니다.

쉬운 솔루션

가까운 평면을 카메라에 매우 가깝게 만들면이 문제가 거의 사라집니다. 이 솔루션은 완벽한 솔루션은 아니지만 대부분의 경우 충분한 결과를 얻을 수 있으며 효율적입니다.

전체 솔루션

가까운 평면을 카메라에 더 가깝게 배치해도 만족스럽지 않으면 "마스크"를 만들어 플레이어와 포털 관점에서 장면을 렌더링하여 생성 된 이미지를 혼합 할 수 있습니다.

포털을 평평한 표면에만 적용 할 수 있다고 가정하면 카메라의 가까운 평면과 포털에 의해 정의 된 평면 (또는 그 벽) 사이의 교차 선을 계산할 수 있습니다. 이 줄은 화면을 두 부분으로 나눕니다. 스크린 픽셀이있는 선의 어느 쪽을 결정하면 사용할 렌더 이미지, 포털 이미지 또는 플레이어 카메라 이미지를 알 수 있습니다.

이 문제가 발생하면 카메라 뷰 절두체는 포털 내에 완전히 있어야하므로 교차 선은 항상 한 화면 가장자리에서 다른 화면 가장자리로 완전히 절단되어야합니다.

이 링크 는 수학이 선을 찾는 데 도움이됩니다. 아래 코드는 대략적으로 정확해야합니다.

교차 선은 선의 점과 선 방향을 사용하여 정의됩니다. 교차 방향 아래는 포털 법선의 교차 곱과 카메라 뷰 방향 (평면 법선 근처)을 사용하여 계산됩니다. 선상의 점은 가까운 평면의 한 점에서 포털 평면을 향해 직접 포탈 평면을 향해 광선을 캐스팅하고 교차점을 찾아서 제공됩니다.

Vector3 intersectionDir = Vector3.cross(portalNorm, viewDir);
Ray ray = new Ray(camPos + viewDir * camNearPlaneDist, portalNorm);
Vector3 intersectionPos = ray.intersects(new Plane(portalVert1, portalVert2, portalVert3);

viewDir이 단위 벡터인지 확인하십시오. portalVert1, 2 및 3은 포털 데칼 또는 표면에 사용 된 4 개의 정점 중 3 개에 불과합니다. 포털이있는 평면을 정의하는 다른 방법이 있지만 이것이 가장 유용한 정보라고 생각합니다.

교차 선을 정의하는이 두 벡터가 있으면 뷰에 각각 곱한 다음 투영 행렬을 곱하여 화면 공간에 배치하십시오.

그런 다음 포스트 프로세스 셰이더를 사용하여 이러한 이미지를 혼합 할 수 있습니다. 현재 픽셀이있는 분할 선의 어느 쪽을 결정하여 각 픽셀에서 사용할 이미지를 선택합니다. 픽셀 위치 (렌더 타겟 텍셀을 조회하는 데 사용되는 위치)를 가져 와서 수행합니다.

float d = (pixelX - intersectionPos.X) * intersectionDir.Y - (pixelY - intersectionPos.Y) * intersectionDir.X;

측면은 d가 0보다 크거나 작은 지에 의해 주어집니다. 정확하게 0이면, 당신은 선에 있습니다.

위의 수학에 대한 참조는 이것을 참조 하십시오 .

포털 관점에서 렌더링하기 전에 사용하기 위해 깊이 마스크 / 스텐실 버퍼를 만들 때이 방법을 사용할 수도 있습니다. 전체 화면 쿼드를 만들고 선을 사용하여 슬라이스 할 수 있습니다.


니어 클립 플레인은 좋은 아이디어 였지만 내가 찾고있는 것은 아닙니다. 두 번째 부분은 흥미로운 접근법입니다. 현재 나가는 포털 평면 뒤의 모든 것에 깊이 마스크 셰이더를 사용하고 있으며 종료 카메라의 클리어 플래그를 깊이 만 설정하고 있습니다. 이를 통해 포털에서 정점에 도달하는 종료 카메라의 일부가 화면에 그려지고 입력 카메라가 깊이 마스크에 그려 지므로 정점에 도달하는 각 카메라의 부분을 혼합하여 하나의 이미지를 만듭니다. 해당 포털. 유일한 문제는 약간의 클리핑 문제가 발생하는 것입니다.
Timothy Williams

플레이어가 지나갈 때 약간의 멍청이. 이 아이디어는 매우 유망한 소리를 냈습니다. 본질적으로 내가해야 할 일은 화면 근처의 카메라가 평면 근처와 포털 평면이 교차하는 방향을 계산하고 방향은 선의 진행 방향을 알려주며 점은 선의 다양한 점입니다. 그런 다음 픽셀을 배치하는 분할 선의 어느 쪽을 셰이더 / 스크립트에서 어떻게 결정합니까?
Timothy Williams

기본 코드를 제공하기 위해 답변을 약간 업데이트했습니다. 클리핑 평면 거리 근처에서 뷰를 변경하여 문제를 확인하십시오. 이것을 가능한 작게하면 충분할 수 있습니다. 제대로 작동하고 올바르게 작동 한 다음 빠르게 작동하도록하십시오.
OriginalDaemon


나는 거의 클리핑 평면 거리를 변경하는 것을 테스트했지만 문제가 약간 개선되었지만 Mell이 게시 한 기사에 따르면 스트래핑 할 때 문제가 해결되지 않습니다. 나는 여전히 교차 선이 작동하는 것처럼 느껴지므로 시도해 볼 것입니다. 또한 Mell이 게시 한 기사를 좀 더 자세히 살펴 보겠습니다. 결국 그것은 깊이 마스크가 더 빠른지 또는이 교차 선이 더 빠른지에 도달 할 것입니다
Timothy Williams

3

제안 된 답변은 매우 좋았지 만 깊이 마스크를 사용하여 다른 기술을 사용하게되었습니다.

당신이하는 일은 스크립트와 셰이더를 가져 와서 장면에 렌더러가있는 모든 객체에 스크립트를 넣고 렌더 대기열을 3020으로 설정합니다 (나중에 이것을 쉽게하기 위해 스크립트를 게시 할 것입니다).

그런 다음 포털의 상자 뒤에 비행기 상자를 만듭니다 (모두 안쪽을 향하고 그림에서 상자의 측면을 볼 수 없지만 상자 안에있을 때는 회색으로 표시됨) 이렇게 : 여기에 이미지 설명을 입력하십시오 그리고 그것들을 그들 자신의 특별한 레이어 (나를 위해 "DepthMask"를 선택했습니다)로 설정 한 다음, 위에 셰이더가있는 머티리얼을 추가합니다. 여기에 이미지 설명을 입력하십시오

그런 다음 기본 카메라를 가져 와서 컬링 마스크 (DepthMask 레이어를 확인하지 않은)에서 특수 레이어의 선택을 해제하고 깊이를 0으로 설정하십시오. 여기에 이미지 설명을 입력하십시오

그런 다음 카메라를 순간 이동하고 복제 할 때 다른 카메라의 클리어 플래그를 "Depth Only"로 설정하고 깊이는 1로 설정하십시오. 여기에 이미지 설명을 입력하십시오

그런 다음 두 카메라 뷰 사이에 완벽한 화면이 혼합되어 나타납니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.