라인 렌더러 선을 평평하게 유지하는 방법?


10

선 렌더러 선에 더 많은 꼭지점을 추가하면 선이 비 틀리고 부드러운 선이되는 것을 멈췄습니다.

여기에 이미지 설명을 입력하십시오

.GIF 여기 : http://i.imgur.com/hRAhCXM.gif

재료를 제거하더라도 모든 선은 동일한 z 레벨에 있습니다.

왜 이것이 그렇게하는지, 어떻게 해결 해야하는지, 어떤 제안이 있는지 모르겠습니다 .C #


이것은 LineRenderer가 꼭지점을 배치하는 데 사용하는 알고리즘의 문제로, 날카로운 모서리를 제대로 처리하지 못합니다. 모서리를 둥글게하기 위해 더 많은 포인트를 추가하여 다소 개선 할 수 있지만, 내가 찾은 가장 강력한 방법은 더 나은 알고리즘으로 자신의 기능을 복제하거나 필요한 정점으로 동적 메쉬를 만들거나 창의적으로 만드는 것입니다 파티클 시스템을 활용하여 점 체인을 그립니다.
DMGregory

1
업데이트 : 이후 버전의 Unity (5 5+)는 LineRenderer 알고리즘을 향상 시켰으므로 LineRenderers 사용을 고려하는 사용자는 요즘 기본 결과가 훨씬 더 나아질 수 있습니다.
DMGregory

답변:


11

문제는 기본적으로 이것입니다.

여기에 이미지 설명을 입력하십시오

LineRenderer가 빨간색 점 위치를 연결하려고합니다. 메쉬를 만들기 위해 녹색 정점을 만듭니다. 따라서 최상위 라인 세그먼트가 멋지게 보입니다. 그러나 LineRenderer는 경제적이려고 시도하고 두 번째 선 세그먼트의 끝에서 한 선 세그먼트의 끝에서 정점을 재사용합니다. 날카로운 각도가 있으면보고있는 문제가 발생합니다. 두 번째 선분은 '엔드 캡'이 다른 '엔드 캡'과 수직이 아니므로 교차점에서 꼬집어집니다.

해결책은 자신 만의 라인 렌더러를 만드는 것이므로 경제적이지 않습니다. 동적 메쉬 를 생성하여이 작업을 수행 할 수 있습니다 . 메시는 일련의 얇은 쿼드로 구성됩니다. 각 선분에 대해 선의 법선과 지정된 선 너비를 계산하여 쿼드의 네 모서리를 계산할 수 있습니다.

Vector3 normal = Vector3.Cross(start, end);
Vector3 side = Vector3.Cross(normal, end-start);
side.Normalize();
Vector3 a = start + side * (lineWidth / 2);
Vector3 b = start + side * (lineWidth / -2);
Vector3 c = end + side * (lineWidth / 2);
Vector3 d = end + side * (lineWidth / -2);

여기서, a, b, cd바로 위의 이미지에서 녹색 점처럼, 하나의 선분의 네 모서리를 구성합니다. 이 꼭짓점은 메쉬에 추가되고, 4 개의 꼭짓점을 2 개의 삼각형으로 만들기 위해 인덱스를 추가합니다 (따라서 6 개의 인덱스, abc 및 bdc가 추가됨).

이것은 분명히 다소 복잡해질 수 있습니다. Unity가 자신의 방식대로 LineRenderer를 구현 한 또 다른 이유는 다른 문제를 피할 수 있기 때문입니다. 각 선분을 그리기 시작하면 두 선분이 어디에서 만나서 못생긴 관절을 형성하는지 알 수 있습니다. 두 선 사이의 공유 법선을 계산하고 정점을 공유 법선으로 업데이트하여이 문제를 처리 할 수있는 방법이 있지만 여전히 꼬인 선으로 쉽게 끝날 수 있기 때문에 부분적으로 만 문제를 해결합니다. 가장 강력한 솔루션은 관절에 추가 꼭지점을 생성하여 모서리로 작동하는 것입니다.


1
유니티 라인 렌더러를 사용하고 추가 점을 삽입하여 작은 연귀를 만들 수도 있습니다. 이전 포인트에서 다음 포인트로 향하는 포인트를 조금만 넣으십시오.
mklingen

좋은 설명 바이트, 감사합니다. 각 코너에서 더 많은 포인트를 생성 할 수 없는지 확인해보고, 제대로 작동하지 않으면 다이나믹 메시를 만들려고 노력할 것입니다. 감사합니다.
Douglas Gaskell

1

나는 같은 문제가 있었고 우아한 해결책이 아니라 단순하고 작동하는 가장자리를 부드럽게하기 위해 더 많은 포인트를 추가하여 해결했습니다. 적어도 나에게는. 나는 이것을하는 함수를 썼다 :

Vector3[] Generate_Points(Vector3[] keyPoints, int segments=100){
    Vector3[] Points = new Vector3[(keyPoints.Length - 1) * segments + keyPoints.Length];
    for(int i = 1; i < keyPoints.Length;i++){
        Points [(i - 1) * segments + i - 1] = new Vector3(keyPoints [i-1].x,keyPoints [i-1].y,0);
        for (int j = 1;j<=segments;j++){
            float x = keyPoints [i - 1].x;
            float y = keyPoints [i - 1].y;
            float z = 0;//keyPoints [i - 1].z;
            float dx = (keyPoints [i].x - keyPoints [i - 1].x)/segments;
            float dy = (keyPoints [i].y - keyPoints [i - 1].y)/segments;
            Points [(i - 1) * segments + j + i - 1] = new Vector3 (x+dx*j,y+dy*j,z);
        }
    }
    Points [(keyPoints.Length - 1) * segments + keyPoints.Length - 1] = new Vector3(keyPoints [keyPoints.Length-1].x,keyPoints [keyPoints.Length-1].y,0);
    return Points;
}


0

불투명 한 선에서이를 해결하는 한 가지 방법은 각 관절에 원을 렌더링하는 것입니다. 원은 선 너비와 같은 직경을 가져야합니다. 이를 위해서는 몇 개의 추가 정점이 렌더링되어야하지만 실제로는 멋지게 보입니다. 그런 다음 조인트 사이의 공유 법선을 제거 할 수도 있습니다.

Unity 라인 렌더러를 사용하는 대신 자체 렌더링 코드를 작성해야합니다.

http://u3d.as/nFE 에서이 작업을 수행하는 자산을 만들었습니다.


0

내가 피하는 방법은 LineRenderer.SetPosition () 메서드에서 항상 z 위치를 0으로 설정하는 것입니다. 글을 쓰는 대신

LineRenderer.SetPosition(i, myVector3);

나는 썼다

LineRenderer.SetPosition(i, new Vector3(myVector3.x, myVector3.y, 0));

그러나 여전히 이상한 라인을 얻을 수 있기 때문에 이것이 최선의 해결책은 아닙니다. 내가 생각할 수있는 가장 좋은 해결책은 별도의 줄을 만드는 것이 었습니다. 그것은 나를 위해 완벽하게 작동했습니다. 이것이 도움이되기를 바랍니다.

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