2013-05-08 2 views
1

두 개 이상의 무관 한 높이 맵을 함께 스티칭 할 알고리즘을 작성하려고합니다 (C#에서). 그래서 맵 사이에 솔기가 보이지 않습니다. 기본적으로 나는이 페이지에있는 기능을 모방하려는 : http://www.bundysoft.com/wiki/doku.php?id=tutorials:l3dt:stitching_heightmaps솔기를 제거하기 위해 여러 개의 하이트 맵을 어떻게 꿰맬 수 있습니까?

나는 또한 수행 할 수 있도록하려는

(당신은 내가 무엇에 대해서 이야기하고의 요점을 얻기 위해 사진을 볼 수 있습니다) 하나의 하이트 맵을 타일로 바꿀 수 있도록 변경하여 끝없는 세상을 만듭니다 (이 모든 것은 Unity3d에서 사용하기위한 것입니다). 그러나 여러 하이트 맵을 함께 스티칭 할 수 있다면 알고리즘을 하나의 하이트 맵에서 쉽게 수정할 수 있어야하므로이 부분에 대해 걱정하지 않아도됩니다. 내가 검색과 성공없이 솔루션을 검색 한로

는지도의 모든 종류, 감상 할 수있다. 올바른 방향으로 조금만 움직여 주시면 대단히 감사하겠습니다! 많은 이미지 조작 기법을 하이트 맵에 적용 할 수 있지만 찾고있는 결과를 생성하는 이미지 처리 알고리즘을 찾을 수 없다는 것을 알고 있습니다. 예를 들어, image stitching은 겹치는 시야가있는 이미지에만 적용되는 것처럼 보입니다. 관련없는 하이트 맵에서는 그렇지 않습니다. 어떤 방식으로 작업에 FFT 로우 패스 필터를 사용

겠습니까하거나 있음은 단일 한 tileable 하이트 생성에 유용 할 것

?

알고리즘은 Unit3d에서 사용할 수 있기 때문에, 어떤 C# 코드는 내가 그 유니티가 사용하는 최신 버전의 생각으로, 닷넷 3.5에 국한되어야 할 것이다. 도움 주셔서 감사합니다! 당신이 게시 된 이미지에서 이루어집니다 무엇

답변

1

, 나는이 문제를 해결에서 내 이전의 시도와 올바른 궤도에 있던 것 같다.

1) 하이트에 점과 그 반대 지점 사이의 평균 찾기 : 함께 하이트 바느질에서 내 초기이 시도는 하이트의 각 지점에 대해 다음 단계를 포함했다.반대 지점은 단순히 x 축 (수평 모서리를 꿰매는 경우) 또는 z 축 (수직 모서리의 경우) 중 하나에 반영되는 첫 번째 점입니다. 거리가 가까운 수평 또는 수직 가장자리 하이트의 점까지의 거리입니다

newHeight = oldHeight + (average - oldHeight)*((maxDistance-distance)/maxDistance); 

가 (이 가장자리에 당신이 원하는 따라

:

2) 다음과 같은 공식을 사용하여 점의 새로운 높이 찾기 스티치). maxDistance (지형이 얼마만큼 변경되는지에 영향을주는 조정 가능한 값)보다 작은 거리를 가진 점은이 공식을 기반으로 조정됩니다.

그것은 오래된 수식이었으며 대부분의 지형에 대해 아주 좋은 결과를 산출했지만 변경된 하이트 맵 지점과 변경되지 않은 하이트 맵 지점 사이의 영역에 눈에 띄는 선이 생겼습니다. 나는 변경된 지역의 경사가 변화가없는 지역에 비해 너무 가파르므로 두 곳 사이의 눈에 띄는 대조를 일으키고 있기 때문에 이것이 발생했다는 사실을 거의 즉각적으로 깨달았다. 불행하게도이 문제를 잘못된 방식으로 해결하려고했는데 대조 영역을 함께 흐리게 처리하거나 부드럽게하는 방법에 대한 해결책을 모색했습니다.

평활화 기법으로는 거의 성공하지 못했지만 변경되지 않은 영역의 기울기와 더 잘 어울리기를 바라면서 변경된 영역의 기울기를 줄이기로 결정했습니다. 나는 이것이 나의 바느질 알고리즘을 크게 향상 시켰고, 위에 기록 된 선들 중 99 %를 제거했다는 것을 기쁜 마음으로 알려드립니다.

이전 화학식에서 주요 원인이 제품이었다 직선에 가장 가까운 에지 점의 거리에 따라 0과 1 사이의 값을 제조 하였다

(maxDistance-distance)/maxDistance 

. 하이트 맵 포인트와 에지 사이의 거리가 증가함에 따라, 하이트 맵 포인트는 (상기 정의 된 바와 같이) 평균보다 적게 사용하고 원래 값을 향해 점점 더 많이 이동하게됩니다. 이 선형 보간은 너무 단계 기울기의 원인 이었지만 운 좋게도 Unity의 API의 Mathf 클래스에 내장 된 방법을 발견했습니다.이 방법은 2 차 (3 차원 입체) 보간법을 허용합니다. 이것은 SmoothStep Method입니다.

here과 비슷한 방법을 사용하면이 방법을 사용할 수 있습니다. 중간 거리에서 하이트 맵 값을 결정하는 데 평균이 얼마나 많이 사용되는지가 변경되지만 심각도는 줄어 듭니다. 기하 급수적으로 거리가 maxDistance에 가까이 갈수록 덜 심한 기울기가 만들어지며 변경되지 않은 영역의 기울기와 더 잘 조화를 이룹니다.

//Using Mathf - Unity only? 
float weight = Mathf.SmoothStep(1f, 0f, distance/maxDistance); 

//Using XNA 
float weight = MathHelper.SmoothStep(1f, 0f, distance/maxDistance); 

//If you can't use either of the two methods above 
float input = distance/maxDistance; 
float weight = 1f + (-1f)*(3f*(float)Math.Pow(input, 2f) - 2f*(float)Math.Pow(input, 3f)); 

//Then calculate the new height using this weight 
newHeight = oldHeight + (average - oldHeight)*weight; 

더 나은 바느질을 생산하고 더 나은 보간 방법이있을 수 있습니다 : 새로운 제조법은 다음과 같이 보인다. 나는 그러한 방법을 찾으면이 질문을 확실히 업데이트 할 것이므로, 하이트 맵 스티치를하는 다른 사람들은 그들이 필요로하는 정보를 찾을 수 있습니다. 직선 보간법이 올바른 방향으로 가고있는 것에 대한 rincewound에 대한 명성!

0

나에게 간단한 선형 보간처럼 많이 보인다. 기본적으로 두 이미지 (왼쪽, 오른쪽)를 가져와 스티치 영역을 정의합니다. 선형 보간의 경우 왼쪽 이미지의 왼쪽 픽셀 (스티칭 영역)과 오른쪽 이미지의 오른쪽 픽셀 (스티칭 영역에도 있음)을 사용할 수 있습니다. 그런 다음 보간 된 값으로 공간을 채 웁니다.

은이 예제를 가지고 - 나는 아이디어를 보여주기 위해 여기에 한 줄을 사용하고 있습니다 : 왼쪽의

Left = [11,11,11,10,10,10,10] 
Right=   [01,01,01,01,02,02,02] 
       ^^^^ overlap/stitiching region. 

가장 왼쪽 값 :

Left = [11,11,11,10,10,10,10] 
Right= [01,01,01,01,02,02,02] 

우리의 겹침 폭 4 픽셀입니다 말할 수 있습니다를 이미지는 10 일 것입니다. 오른쪽 이미지의 가장 오른쪽 값은 1이됩니다. 이제 2 단계로 10과 1 사이를 직선 보간합니다. 새 스티칭 영역은 다음과 같습니다.

stitch = [10, 07, 04, 01] 

우리는 다음과 같은 스티치 라인으로 끝낼 :

line = [11,11,11,10,07,04,01,02,02,02] 

이 두 개의 전체 이미지에 적용 할 경우 이전에 게시 된 것과 유사한 결과를 얻을 수 있습니다. 좋아

+0

좋아, 네가 무슨 말을하는지 이해 하겠지만 어떻게 이것을 하이트 맵에 적용하겠습니까? 귀하의 예제에서 결과 스티치 라인 길이가 10이지만 결합, 초기 왼쪽과 오른쪽 라인의 길이는 14입니다. 원래 왼쪽/오른쪽 라인과 같은 길이가 새로운 왼쪽/오른쪽 라인을 생성해야합니다 , 왼쪽 줄의 가장 오른쪽 값이 오른쪽 줄의 가장 왼쪽 값과 일치하는 경우 (같은 값이 아닌 경우 높이 맵 사이에 간격이 있음). –

+0

도움을 주셔서 감사합니다. 보간은 확실히 올바른 방향이었습니다. 나는 지금까지 최고의 결과를 가져 오는 답을 추가했다. 질문에 대한 답변으로 자신의 답변을 표시하는 것이 좋습니까? 아니면 일반적으로 싫어하는 것입니까? –

관련 문제