2016-10-19 7 views

답변

1

저는 여러분의 환경을 사용하지 않지만 항상 픽셀 이동으로이 효과를 보았습니다. 렌더링 된 장면에 픽셀 액세스 권한이있는 경우 (이상적으로 백 버퍼에있는 동안 깜박이지 않으므로 이상적으로) 렌즈 내부의 픽셀을 바깥 쪽 위치로 이동하십시오. 일정한 변위를 사용하거나 더 나은 (큰 줌)을 중간에서 그리고 가장자리 근처에서 덜 움직일 때 더 좋습니다.

전형적인 구현은 다음과 같다 : 렌즈 영역을 통해 일부 temp 버퍼

  • 루프 (x,y)

    1. 복사본 렌즈 영역
    2. 렌즈 중심 (x0,y0)에서 처리 된 화소의 계산 실제 반경 r 렌즈 영역 외부의 픽셀을 무시합니다.처리 된 픽셀의 63,655,520,403,210
    3. 컴퓨팅의 실제 줌 m

      나는 이런 식으로 이것에 대한 cos를 사용하려면 :

      m=1.0+(1.5*cos(0.5*M_PI*double(r)/double(r0))); // M_PI=3.1415... 
      

      당신은 1.0,1.5 상수로 재생할 수 있습니다. 그들은 최소 (1.0)과 최대 (1.0+1.5) 줌을 결정합니다. 또한이 cos가 너의 [deg] 필요한 경우 매우 대신 0.5*M_PI

    4. 90.0 복사 백 버퍼 temp에서 화소 또는 화면을 변경 [rad]에서 각 복용위한 여기

      backbuffer(x,y)=temp(x0+(x-x0)/m,y0+(y-y0)/m) 
      

    C++/VCL 예 :

    void TMain::draw() 
        { 
        // clear bmp (if image not covering whole area) 
        bmp->Canvas->Brush->Color=clBlack; 
        bmp->Canvas->FillRect(TRect(0,0,xs,ys)); 
        // copy background image 
        bmp->Canvas->Draw(0,0,jpg); // DWORD pxy[ys][xs] is bmp direct pixel access, (xs,ys) is bmp size 
        // here comes the important stuff: 
        int x0=mx,y0=my;   // position = mouse 
        const int r0=50;   // radius 
        DWORD tmp[2*r0+3][2*r0+3]; // temp buffer 
        double m; 
        int r,x,y,xx,yy,xx0,xx1,yy0,yy1; 
        // zoom area bounding box 
        xx0=x0-r0; if (xx0< 0) xx0=0; 
        xx1=x0+r0; if (xx1>=xs) xx1=xs-1; 
        yy0=y0-r0; if (yy0< 0) yy0=0; 
        yy1=y0+r0; if (yy1>=ys) yy1=ys-1; 
        // copy bmp to tmp 
        for (y=yy0;y<=yy1;y++) 
        for (x=xx0;x<=xx1;x++) 
         tmp[y-yy0][x-xx0]=pyx[y][x]; 
        // render zoomed area 
        for (y=yy0;y<=yy1;y++) 
        for (x=xx0;x<=xx1;x++) 
         { 
         // compute radius 
         xx=x-x0; 
         yy=y-y0; 
         r=sqrt((xx*xx)+(yy*yy)); 
         if (r>r0) continue; 
         if (r==r0) { pyx[y][x]=clWhite; continue; } 
         // compute zoom: 2.5 on center, 1.0 at eges 
         m=1.0+(1.5*cos(0.5*M_PI*double(r)/double(r0))); // M_PI=3.1415... 
         // compute displacement 
         xx=double(double(xx)/m)+x0; 
         yy=double(double(yy)/m)+y0; 
         // copy 
         if ((xx>=xx0)&&(yy>=yy0)&&(xx<=xx1)&&(yy<=yy1)) 
         pyx[y][x]=tmp[yy-yy0][xx-xx0]; 
         } 
        // just refresh screen with backbuffer 
        Canvas->Draw(0,0,bmp); 
        } 
    
    (품질 및 FPS는 GIF 인코딩에 의해 하강)

    그리고 여기에 애니메이션 GIF 미리보기 :

    preview

    당신이 내 코드 페이지에서 GFX 액세스 이해와 도움이 필요한 경우 :

  • +0

    해당 제안 주셔서 감사합니다. 하지만 Monogame 파이프 라인의 픽셀에 액세스하는 방법을 모르겠습니다. 그리고 래스터 화 된 벡터 데이터를 확대/축소하는 것이 픽셀 화 된 축소보기를 제공하므로 피하고 싶을 것입니다. – Tamori

    +0

    Java2D에서는 새로운 이미지에서 Graphics 객체를 만들고 확대/축소 비율에 해당하는 크기 조절 변형을 적용하고 렌즈 모양과 일치하는 클리핑 영역을 사용하여 내용을 그려 넣은 다음 내 캔버스의 페인트 방법으로 이미지를 그립니다. 나는 전략이 XNA에서 비슷하다고 생각하지만, 그렇게하기 위해 사용할 수있는 정확한 API 요소를 모른다. 약간 검색 한 결과 RenderTarget2D를 정의하고 렌더링 설정으로 내 물건을 그려 넣은 다음 백 버퍼에 그려 넣습니다. 하지만 어떻게 스케일 변환과 원형 클리핑을 적용 할 지 확신하지 못합니다. – Tamori