>

이것은 이상한 질문이 될 수 있지만 Unity에 익숙하지 않은 것처럼 내 문제를 해결하는 방법을 모르겠지만 Ray () 클래스는 모든 종류의 작업에 가장 유용한 클래스 중 하나입니다. 어쨌든 Ray의 주어진 지점을 계산하기 위해 .GetPoint(distance) 를 호출하기 쉽습니다. . -그러나 .GetPoint(distance, padding, angle) 와 같은 전화를 할 수있는 방법이 있습니까 ?

예를 들어, a 의 (3D) Ray   b

a--c----b
   |
   d

.GetPoint(3) 에 전화   c 를 반환합니다 , 및 원하는 새 메소드 .GetPoint(3, 2, 0) 에 대한 호출   d 를 반환해야합니다 . 또한 .GetPoint(3, 2, 90) 를 호출   d when it's behind (or above) c 를 반환해야합니다 .

수학 수업에서 더 많은주의를 기울 였어야한다고 생각합니다 ...


  • 답변 # 1

    Unity가 임의의 시작점을 찾는 것을 걱정하지 않는다면 Vector3.OrthoNormalize 를 사용할 수 있습니다  당신을위한 출발점을 얻습니다.

    그러면 Quaternion.AngleAxis 를 사용할 수 있습니다  광선 방향을 기준으로 점을 회전하려면 (회전 조작을 위해 원점과 광선을 오프셋해야 함)

    Vector3 GetPaddedPoint(Ray ray, float distance, float padding, float angleInDegrees) 
    {
        Vector3 rayDirection = ray.direction;
        Vector3 startingOrtho;
        Vector3.OrthoNormalize(ref rayDirection, ref startingOrtho);
        // Find some point padding from ray at distance from origin
        Vector3 axisPoint = ray.GetPoint(distance);
        Vector3 startingPoint = padding * startingOrtho+ axisPoint;
        // Find where startingPoint would be if the origin of the ray was at the origin
        Vector offsetPoint = startingPoint - ray.origin;
        // Rotate the offsetPoint around ray direction using Quaternion
        Quaternion rotation = Quaternion.AngleAxis(angleInDegrees, rayDirection);
        Vector3 rotatedOffsetPoint = rotation * offsetPoint;
        // Add back in the ray's origin
        return rotatedOffsetPoint + ray.origin;
    }
    
    

    시작 지점에 대해 특정 종류의 방향을 선호하는 경우 startingOrtho 를 통과 할 수 있습니다 . OrthoNormalize 를 유지  그것이 startingOrtho 를 보장하기 위해 전화  광선에 직교하고 아직 그렇지 않은 경우 정규화됩니다.

    Vector3 GetPaddedPoint(Ray ray, float distance, float padding, float angleInDegrees, Vector3 startingOrtho) 
    {
        Vector3 rayDirection = ray.direction;
        Vector3.OrthoNormalize(ref rayDirection, ref startingOrtho);
        // Find some point padding from ray at distance from origin
        Vector3 axisPoint = ray.GetPoint(distance);
        Vector3 startingPoint = padding * startingOrtho+ axisPoint;
        // Find where startingPoint would be if the origin of the ray was at the origin
        Vector offsetPoint = startingPoint - ray.origin;
        // Rotate the offsetPoint around ray direction using Quaternion
        Quaternion rotation = Quaternion.AngleAxis(angleInDegrees, rayDirection);
        Vector3 rotatedOffsetPoint = rotation * offsetPoint;
        // Add back in the ray's origin
        return rotatedOffsetPoint + ray.origin;
    }
    
    

  • 이전 python - 쉘 창에 오류가 발생하면 팝업 메시지가 생성됩니까?
  • 다음 iphone - Swift에서 UILabel의 textColor를 설정하는 방법