[Unity] 바닥에 대한 거울 반사

9354 단어 Unitytech

ReflecionProbe 정보


Unity는 반사를 재현하기 위해 ReflecionProbe(이하 탐지라고 함)의 기능을 사용합니다.
일반적으로 프로브를 사용할 때는 반사할 객체의 위치와 동일한 위치에 프로브를 배치합니다.
リフレクションプローブの設置例
リフレクションプローブの反射例
소품 등의 경우 이 방법으로 반사하면 그에 상응하여 정확한 외관을 반영할 수 있다고 생각합니다.
그러나 평면 등으로 구성된 마루에 상술한 방법으로 반사된 상황에서 파산은 상당히 뚜렷하다.
플랜의 반사에 ↓ 탐지를 이미지처럼 배치하면...
Planeにプローブを置いた画像
결과적으로 부정확한 반사가 나타났다
영상 오른쪽은 거의 자동차의 반사에 의해 가려졌다.
正しくない反射

탐지 위치를 바꾸어 대책을 세우다


해결 방법에 관하여 참고하였다여기 블로그..
주로 반사면을 축 위의 대칭적인 위치에 놓는다.
仕組み
삽화 준비하느라 힘들었어요.
https://community.arm.com/developer/tools-software/graphics/b/blog/posts/combined-reflections-stereo-reflections-in-vr
제가 좀 빌려 쓸 수 있도록 허락해 주세요...
블로그 기사에도 실물이 있고 탐측을 사용하지 않는 방법도 소개돼 있으니 추천합니다.
하지만 플랜(반사면)의 y 좌표는 0이 초보자로서 반할 수 있다는 전제이기 때문에 이 기사에서 이에 대응하는 것을 소개하고 싶다.
using UnityEngine;
using System.Collections;
 
public class setProbePosition: MonoBehaviour
{

    [SerializeField]
    public GameObject plane;//鏡面反射を行うPlane
    private ReflectionProbe probe;
    private Transform trfMainCam;
    private Transform trfPlane;

    void Start()
    {
        probe = gameObject.GetComponent<ReflectionProbe>();
        trfMainCam = Camera.main.transform;
    }

    void Update()
    {
        //差分距離導出
        float _diffDistance = GetDiffDistance();
        SetPosition(_diffDistance);
    }

    private void SetPosition(float _diffDist)
    {
        probe.transform.position = new Vector3(trfMainCam.position.x, trfMainCam.position.y - (_diffDist * 2.0f), trfMainCam.position.z);
    }

    private float GetDiffDistance()
    {
        float _dist =  Mathf.Abs(trfMainCam.position.y - plane.transform.position.y);
        if (trfMainCam.position.y < plane.transform.position.y)
        {
            //カメラより上に平面があった場合にprobeとの位置が逆転するための対策
            _dist *= -1.0f;
        }

        return _dist;
    }
}
반사하려는 평면 탐지에 제작된 스크립트를 적용하고 검사기에서 객체의 평면으로 지정하면 사용할 수 있습니다.
함수로 정리된 것이기 때문에 조금 다르지만 블로그 글과 다른 부분은 프로브의 y 좌표를 결정하는 카메라의 - 1 y 좌표 부분이다.-trfMainCam.position.y 섹션trfMainCam.position.y - (_diffDist * 2.0f)이(가) (으)로 변경되었습니다._diffDist 카메라와 평면이 y축에 있는 차분거리는 GetDiffDistance()로 계산된 것으로 기본적으로 카메라와 평면을 통해 감법 계산만 한다.
그러나 평면이 천장처럼 카메라 위에 존재하는 상황에서 계산값을 직접 사용하면 탐측된 위치와의 관계가 이상해진다-1.0. 따라서 곱하기를 통해 대책을 세워야 한다.
그리고 카메라의 y 좌표와_diffDist를 두 배로 줄이면 탐측은 카메라와 평면의 위치에 대응하는 위치로 계속 이동한다.
이 장점은 플랜트의 y 좌표가 0이 아니었을 때는 말할 것도 없고, 게임 속 이동 침대 등도 반사되는 허점이 나타나지 않는다는 것이다.

결실


좋은 느낌
結果

최후


실제로 이것만 설치하면 부족한 처리에서 플랜트의 대상이 플랜트를 관통하면 탐침의 부분을 꿰뚫어도 반사로 흡수된다.
아까도 소개한 바와 같이블로그 글 탐사를 하지 않는 방법으로 문제를 해결하기 때문에 그곳에서 어려움이 있으면 블로그를 찾아보는 것을 권장합니다.
(기본적으로 블로그 글과 같지만 비슷한 글이 적기 때문에 초보자가 쉽게 찾을 수 있다는 뜻을 담았다)

좋은 웹페이지 즐겨찾기