Atmosphere

 

public (Vector3 near, Vector3 far) RaySphere(
    Vector3 rayOrigin, Vector3 rayDirection,
    Vector3 sphereOrigin, float sphereRadius)
{
    // 광선 방향 정규화
    rayDirection.Normalize();
    // 프로젝션
    var rayToSphere = sphereOrigin - rayOrigin;
    var project = rayOrigin + Vector3.Project(rayToSphere, rayDirection);
    // 직각삼각형 밑변길이 구하기
    var sphereToProject = Vector3.Distance(sphereOrigin, project);
    var projectToHit = Mathf.Sqrt(sphereRadius * sphereRadius - sphereToProject * sphereToProject);
    // 충돌 위치 구하기
    var rayToProject = Vector3.Distance(rayOrigin, project);
    var hit1 = rayOrigin + rayDirection * (rayToProject - projectToHit);
    var hit2 = rayOrigin + rayDirection * (rayToProject + projectToHit);
    return (hit1, hit2);
}

답글 남기기