2017-09-26 1 views
1

네 모서리에서 점의 그리드를 생성하려고합니다. 이 모서리를 자유롭게 배치 할 수 있으므로 그리드에 원근감이있는 것처럼 보입니다. 나는 구석이 시계 방향으로 순서대로 처리에서 다음 코드를 작성했습니다네 모서리에서 원근감있는 그리드 만들기

이것은 보간 된 포인트 그리드를 생성

PVector[][] setGrid(PVector[] corners, int cols, int rows) { 
    PVector[][] grid = new PVector[rows][cols]; 
    for(int y = 0; y < rows; y++) { 
     float fY = (float)y/(rows - 1); 
     PVector p1 = PVector.lerp(corners[0], corners[3], fY); 
     PVector p2 = PVector.lerp(corners[1], corners[2], fY); 
     for(int x = 0; x < cols; x++) { 
      grid[y][x] = PVector.lerp(p1, p2, (float)x/(cols-1)); 
     } 
    } 
    return grid; 
} 

(- 왼쪽부터), 그러나 그것은 일치하지 않습니다 원근감있는 격자. 모든 인라인 포인트는 등거리이며 가장 가까운 포인트는 먼 것보다 분리되어야합니다. 가능하면

나는

내 대답을 명확히하기 위해 편집

자바/처리에서, 어떤 방향을 부탁드립니다. 나는 4 개의 임의의 코너 포인트를 정의하고, perspective deformed grid을 생성하는 모든 포인트를 얻고 싶습니다. 원근법 dX1! = dX2뿐만 아니라 dY1! = dY2이기 때문에주의하십시오. 내가 썼던 코드는이 효과가 없다. (나는 이것을 안다. 그러나 내가 원하는 것을 어떻게하는지 모른다.) 포인트가 보간 될 때 dX1 = dX2 = ... = dXi이고 dY1 = dY2 = ... = dYi

원근감 변환에 대해 읽었지만 이미지를 변환 할 필요가 없습니다. 단지 grid points coordinates이 필요합니다.

+0

난 정말 모르겠어요 무엇을 너는 묻고있어. 연결이 끊어진 기능 대신 [mcve]를 게시 할 수 있습니까? 당신이하려고하는 것을 모의 게시 할 수 있습니까? 어떤 코드 줄이 예상 한 것과 다른 방식으로 작동합니까? –

+0

나는 나 자신을 조금 더 잘 설명하려고 노력했고, 내가 원하는 결과의 그림을 추가했다. – markusand

답변

0

예제 이미지에서 원근 효과는 다른 길이의 가장자리를 따라 불변하는 선의 수를 유지함으로써 얻을 수 있습니다. 그게 당신의 구현이 무엇인지, 그래서 나는 솔직히 문제를 보지 않고있어.

은 여기 setGrid을 (호출 스케치)입니다 :

PVector[] corners; 

void setup(){ 
    size(150,100); 
    corners = new PVector[4]; 
    corners[0] = new PVector(35,20); 
    corners[1] = new PVector(15,height-30); 
    corners[2] = new PVector(width-10,height-10); 
    corners[3] = new PVector(width-30,10); 
    noLoop(); 
} 
void draw(){ 
    background(255); 
    PVector[][] results = setGrid(corners, 9, 9); 
    for(PVector[] pvs : results){ 
    for(PVector pv : pvs){ 
     ellipse(pv.x,pv.y,5,5); 
    } 
    } 
} 

PVector[][] setGrid(PVector[] corners, int cols, int rows) { 
    PVector[][] grid = new PVector[rows][cols]; 
    for(int y = 0; y < rows; y++) { 
     float fY = (float)y/(rows - 1); 
     PVector p1 = PVector.lerp(corners[0], corners[3], fY); 
     PVector p2 = PVector.lerp(corners[1], corners[2], fY); 
     for(int x = 0; x < cols; x++) { 
      grid[y][x] = PVector.lerp(p1, p2, (float)x/(cols-1)); 
     } 
    } 
    return grid; 
} 

... 그 결과는 대상 이미지처럼 거의 정확하게 보인다. 당신이 다른 것을보고 있다면, 아마 비슷한 가장자리 길이를 가진 그리드를 생성하고있을 것입니다. 거리로 멀어져 보도처럼 - - 정기적 사다리꼴에 관점을 투사 할 경우

후 대신이 방법을 고려하십시오

+0

내가 공유 한 방법의 결과는 내가 정말로 필요로하는 것이 아니다. 동일한 열 또는 행에있는 점 사이의 거리는 등거리이며, 점이 보는 사람에게 "더 가까이"더 커야하고 "멀리있는"점은 작아야합니다. 2D 장면에서이 3D 효과를 시뮬레이트하는 알고리즘이 있는지 확실하지 않습니다. – markusand

+0

위와 연결된 math.stackexchange 대답과 같은 알고리즘이 있습니다. 그러나 의사 3D 정보를 제공해야합니다. . 거기에 자기 대답을보십시오. – JeremyDouglass

관련 문제