선 렌더러 선에 더 많은 꼭지점을 추가하면 선이 비 틀리고 부드러운 선이되는 것을 멈췄습니다.
.GIF 여기 : http://i.imgur.com/hRAhCXM.gif
재료를 제거하더라도 모든 선은 동일한 z 레벨에 있습니다.
왜 이것이 그렇게하는지, 어떻게 해결 해야하는지, 어떤 제안이 있는지 모르겠습니다 .C #
선 렌더러 선에 더 많은 꼭지점을 추가하면 선이 비 틀리고 부드러운 선이되는 것을 멈췄습니다.
.GIF 여기 : http://i.imgur.com/hRAhCXM.gif
재료를 제거하더라도 모든 선은 동일한 z 레벨에 있습니다.
왜 이것이 그렇게하는지, 어떻게 해결 해야하는지, 어떤 제안이 있는지 모르겠습니다 .C #
답변:
문제는 기본적으로 이것입니다.
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
, c
와 d
바로 위의 이미지에서 녹색 점처럼, 하나의 선분의 네 모서리를 구성합니다. 이 꼭짓점은 메쉬에 추가되고, 4 개의 꼭짓점을 2 개의 삼각형으로 만들기 위해 인덱스를 추가합니다 (따라서 6 개의 인덱스, abc 및 bdc가 추가됨).
이것은 분명히 다소 복잡해질 수 있습니다. Unity가 자신의 방식대로 LineRenderer를 구현 한 또 다른 이유는 다른 문제를 피할 수 있기 때문입니다. 각 선분을 그리기 시작하면 두 선분이 어디에서 만나서 못생긴 관절을 형성하는지 알 수 있습니다. 두 선 사이의 공유 법선을 계산하고 정점을 공유 법선으로 업데이트하여이 문제를 처리 할 수있는 방법이 있지만 여전히 꼬인 선으로 쉽게 끝날 수 있기 때문에 부분적으로 만 문제를 해결합니다. 가장 강력한 솔루션은 관절에 추가 꼭지점을 생성하여 모서리로 작동하는 것입니다.
나는 같은 문제가 있었고 우아한 해결책이 아니라 단순하고 작동하는 가장자리를 부드럽게하기 위해 더 많은 포인트를 추가하여 해결했습니다. 적어도 나에게는. 나는 이것을하는 함수를 썼다 :
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;
}
불투명 한 선에서이를 해결하는 한 가지 방법은 각 관절에 원을 렌더링하는 것입니다. 원은 선 너비와 같은 직경을 가져야합니다. 이를 위해서는 몇 개의 추가 정점이 렌더링되어야하지만 실제로는 멋지게 보입니다. 그런 다음 조인트 사이의 공유 법선을 제거 할 수도 있습니다.
Unity 라인 렌더러를 사용하는 대신 자체 렌더링 코드를 작성해야합니다.
http://u3d.as/nFE 에서이 작업을 수행하는 자산을 만들었습니다.
내가 피하는 방법은 LineRenderer.SetPosition () 메서드에서 항상 z 위치를 0으로 설정하는 것입니다. 글을 쓰는 대신
LineRenderer.SetPosition(i, myVector3);
나는 썼다
LineRenderer.SetPosition(i, new Vector3(myVector3.x, myVector3.y, 0));
그러나 여전히 이상한 라인을 얻을 수 있기 때문에 이것이 최선의 해결책은 아닙니다. 내가 생각할 수있는 가장 좋은 해결책은 별도의 줄을 만드는 것이 었습니다. 그것은 나를 위해 완벽하게 작동했습니다. 이것이 도움이되기를 바랍니다.