저는 Primogic과 Sprite (예 : PrimitiveBatches와 SpriteBatches)를 사용하여 Monogame에 2D 장면을 가지고 있는데, 다음과 함께 돋보기 효과를 만들고 싶습니다. 그것의 밑에 내용의 확대 한 전망을 보여주는 원형 렌즈. 어떻게해야합니까?2DNA에서 XNA/Monogame의 스케일 된 기본 내용을 보여주는 원형 돋보기 렌즈 그리기
감사합니다.
저는 Primogic과 Sprite (예 : PrimitiveBatches와 SpriteBatches)를 사용하여 Monogame에 2D 장면을 가지고 있는데, 다음과 함께 돋보기 효과를 만들고 싶습니다. 그것의 밑에 내용의 확대 한 전망을 보여주는 원형 렌즈. 어떻게해야합니까?2DNA에서 XNA/Monogame의 스케일 된 기본 내용을 보여주는 원형 돋보기 렌즈 그리기
감사합니다.
저는 여러분의 환경을 사용하지 않지만 항상 픽셀 이동으로이 효과를 보았습니다. 렌더링 된 장면에 픽셀 액세스 권한이있는 경우 (이상적으로 백 버퍼에있는 동안 깜박이지 않으므로 이상적으로) 렌즈 내부의 픽셀을 바깥 쪽 위치로 이동하십시오. 일정한 변위를 사용하거나 더 나은 (큰 줌)을 중간에서 그리고 가장자리 근처에서 덜 움직일 때 더 좋습니다.
전형적인 구현은 다음과 같다 : 렌즈 영역을 통해 일부 temp
버퍼
(x,y)
에
(x0,y0)
에서 처리 된 화소의 계산 실제 반경 r
렌즈 영역 외부의 픽셀을 무시합니다.처리 된 픽셀의 63,655,520,403,210컴퓨팅의 실제 줌 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
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 미리보기 :
당신이 내 코드 페이지에서 GFX 액세스 이해와 도움이 필요한 경우 :
해당 제안 주셔서 감사합니다. 하지만 Monogame 파이프 라인의 픽셀에 액세스하는 방법을 모르겠습니다. 그리고 래스터 화 된 벡터 데이터를 확대/축소하는 것이 픽셀 화 된 축소보기를 제공하므로 피하고 싶을 것입니다. – Tamori
Java2D에서는 새로운 이미지에서 Graphics 객체를 만들고 확대/축소 비율에 해당하는 크기 조절 변형을 적용하고 렌즈 모양과 일치하는 클리핑 영역을 사용하여 내용을 그려 넣은 다음 내 캔버스의 페인트 방법으로 이미지를 그립니다. 나는 전략이 XNA에서 비슷하다고 생각하지만, 그렇게하기 위해 사용할 수있는 정확한 API 요소를 모른다. 약간 검색 한 결과 RenderTarget2D를 정의하고 렌더링 설정으로 내 물건을 그려 넣은 다음 백 버퍼에 그려 넣습니다. 하지만 어떻게 스케일 변환과 원형 클리핑을 적용 할 지 확신하지 못합니다. – Tamori