2012-06-24 2 views
1

여기에서 기사를 읽었습니다 : http://paulbourke.net/geometry/polygonise/.Marching Cubes 알고리즘의 Isovalue

현재 지형과 같은 미니 크래프트는 심플 렉스 노이즈를 사용하여 생성되었으며 32x32x128 블록을 가진 16x16 청크로 나뉘어져 있습니다. 이제 큐브를 행진 할 때 Polygonise 함수에 생성 된 노이즈를 사용하고 싶습니다. 하지만 내 문제는 어떻게 isovalue을 계산할 수 있습니까? 나는 그것을 얻지 않는다.

누구나 여기 스푼 피드 기사가 더 많이 있습니다. 롤

편집 : 이봐, 난이 http://paulbourke.net/geometry/polygonise/marchingsource.cpp에 발견

.

sSourcePoint []의 값은 0.5이므로 개체를 가운데에 맞 춥니 다. 그러나 fResult + = 0.5/(fDx * fDx + fDy * fDy + fDz * fDz)는 무엇을합니까? 오, 나는 그 코드들로 협박 당한다.

GLfloat fSample1(GLfloat fX, GLfloat fY, GLfloat fZ) 
{ 
     GLdouble fResult = 0.0; 
     GLdouble fDx, fDy, fDz; 
     fDx = fX - sSourcePoint[0].fX; 
     fDy = fY - sSourcePoint[0].fY; 
     fDz = fZ - sSourcePoint[0].fZ; 
     fResult += 0.5/(fDx*fDx + fDy*fDy + fDz*fDz); 

     fDx = fX - sSourcePoint[1].fX; 
     fDy = fY - sSourcePoint[1].fY; 
     fDz = fZ - sSourcePoint[1].fZ; 
     fResult += 1.0/(fDx*fDx + fDy*fDy + fDz*fDz); 

     fDx = fX - sSourcePoint[2].fX; 
     fDy = fY - sSourcePoint[2].fY; 
     fDz = fZ - sSourcePoint[2].fZ; 
     fResult += 1.5/(fDx*fDx + fDy*fDy + fDz*fDz); 

     return fResult; 
} 
+2

isovalue를 _ 계산하지 마십시오. 당신은 등가물을 설정합니다. 볼륨은'f (x, y, z) = isovalue'에 의해 암시 적으로 정의됩니다. 여기서'f '는 스칼라 3D 필드 (노이즈)입니다. 블록이 아닌 점에 어떻게 든 값을 정의해야합니다. 덕분에 –

+0

. 그것은 많은 도움이되었습니다. 이제, http://paulbourke.net/geometry/polygonise/marchingsource.cpp의 코드를 이해하려고합니다. 포인트를주는 fSample1을 찾았습니다. 그러나 나는 그것을 완전히 이해하지 못합니다. 그는 어떻게 단지 float 만 반환하여 3 개의 객체를 만들 수 있었습니까? – Dark

+1

'fSample *'함수는 스칼라 3D 필드를 정의합니다. 왜 3 개의 물체가 있을까요? 'sSourcePoints'는 필드를 동적으로 만듭니다 ('vSetTime'을보세요). isovalue는'fTargetValue'라고 불립니다 ('l. 518'을보세요). –

답변

2

음, Paul의 소스는 실제로 "spoonfed"입니다. fSample1 전에 코멘트는 말한다 :

//fSample1 finds the distance of (fX, fY, fZ) from three moving points 

을 기본적으로, 그는 이렇게 그가 하나에 세 개의 거리 함수 ([I] fSourcePoint에서 거리) "혼합"필요가 소위 "metaballs"개체를 만드는 것입니다. 당신이 지금까지 각각의 세 가지 점에서 때, isovalue 거의 제로 -

f[i] = 1/DistFromCenterToSourcePoint[i]. 

효과는 간단하다 어디에서 할 수있는 그래서 그는

Isovalue = 1/f[0] + 1/f[1] + 1/f[2] 

걸립니다. 점에 가까울수록 f 값은 작아지고 등고선은 커집니다.

의 거리는 보통의 제곱 유클리드

dist(p1, p2) = sqrt((p1.x - p2.x)^2 + (p1.y - p2.y)^2 + (p1.z - p2.z)^2) 

는 "마인 크래프트 같은"달성까지의 거리 당신이 다른 메트릭을 사용할 필요가 isosurfaces입니다. 택시에서보세요 (일명 맨하탄) 메트릭 :

dist1(p1, p2) = abs(p1.x - p2.x) + abs(p1.y - p2.y) + abs(p1.z - p2.z) 

또는 최대-메트릭

distMax(p1, p2) = max(abs(p1.x - p2.x), abs(p1.y - p2.y), abs(p1.z - p2.z)) 

이러한 메트릭의 "구"(즉, 구의 방정식을 만족하는 세트 "DIST

= R ")는 큐브입니다.

반전하고 합계를 계산 한 다음 (fSample1 함수에서 모두 수행) 실험을 통해 몇 가지 일반적인 등가 값을 선택하고 결과를 확인하십시오.