2011-09-07 1 views
0

내가 정말로 찾고있는 것은 정말 간단하지만, 지금까지 인터넷에서 DotNet에서이 작업을 수행 한 방법을 찾지 못했고 (완전히 불필요한 기능에 수천을 쓰지 않고)이 작업을 수행하는 타사 구성 요소를 찾지 못했습니다. 여기에 :C# 또는 VB.Net에서 3D 변환 (원근감)을 어떻게합니까?

저는 바둑판 무늬를 만드는 바닥 타일 (실제 사진)의 jpeg가 있습니다. dotnet에서 사진을 함께 회전하여 스티치하고 최종 이미지를 jpeg로 저장하는 것이 쉽습니다.

다음으로 최종 사진을 찍어 "타일"이 일반적인 "실내 장면"을 위해 바닥에 놓여있는 것처럼 보이게하려고합니다. 기본적으로 3D 퍼스펙티브를 추가하여 실제로 실내 공간에있는 것처럼 보이게합니다. 그때, jpeg 파일의 3D 시각을 만들로 저장해야 Flor Website

을 기본적으로 : Heres는

카펫과 비슷한 일을하고있는 웹 사이트는, 그러나 나는 윈폼 응용 프로그램에서이 작업을 수행 할 필요가 새 jpeg (그러면 일반 룸 장면의 오버레이를 넣을 수 있습니다.)

누구나이 겉으로보기에는 간단한 작업을 수행 할 수있는 제 3 자 DotNet 이미지 처리 모듈을 어디서 얻을 수 있는지 알고 있습니까?

답변

4

회전, 크기 조절 또는 전단과 같은 간단한 2D 변환보다 복잡하고 계산 상 비싼 3D 변환이 필요하므로 간단하지 않습니다. 수학에서 차이점에 대한 아이디어를 얻으려면 2D 변환에는 2 x 2 행렬이 필요하지만 투영 변환 (다른 3D 변환보다 복잡함)은 4 x 4 행렬이 필요합니다.

폴리곤을 원근감있게 그릴 수 있고 텍스처를 카펫처럼 덮을 수있는 3D 렌더링 엔진이 필요합니다. .Net 2.0의 경우, 다각형을 렌더링 할 수있는 DirectX 포트 인 SlimDX를 사용하는 것이 좋지만 일부 학습 곡선이 있습니다. WPF (.Net 3.0 이상)를 사용하는 경우 3D 캔버스가 내장되어있어 다각형을 원근감있게 그릴 수 있습니다. SlimDX보다 배우기가 쉽습니다. 3D 캔버스의 출력을 jpeg로 방향을 바꿀 수있는 방법이 있다는 것을 확신합니다. ...

큰 성능을 필요로하지 않을 경우 및 텍스처 (예 : 항상 수평 바닥 또는 항상 수직 벽). 그렇다면 .Net 2.0의 간단한 그리기 루프를 사용하여 직접 렌더링 할 수 있습니다.

+0

+1. Direct3D 또는 OpenGL을 사용하면 원근 투영의 텍스처 렌더링을 수동으로 작성하는 것보다 훨씬 쉽고 (더 나은 결과를 얻을 수 있습니다.) 조명 및 범프 매핑과 같은 항목을 나중에 추가 할 수도 있습니다 (감각 exture). –

3

평이한 바닥을 원하면 코드는 다음과 같습니다. 경고 : 원하는 결과를 얻으려면 상당한 시간과 세심한 노력이 필요합니다. 특히 수학을 잘 모르는 경우 더욱 그렇습니다. 그러나 다른 한편으로는 (... 이러한 유형의 코드를 연주하는 것이 재미있다 :

는 다음과 같은 몇 가지 샘플 이미지를 찾기

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Windows.Forms; 

namespace floorDrawer 
{ 
public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 

     ResizeRedraw = DoubleBuffered = true; 

     Width = 800; 
     Height = 600; 

     Paint += new PaintEventHandler(Form1_Paint); 

    } 

    void Form1_Paint(object sender, PaintEventArgs e) 
    { 

     // a few parameters that control the projection transform 
     // these are the parameters that you can modify to change 
     // the output 

     double cz = 10; // distortion 
     double m = 1000; // magnification, usually around 1000 (the pixel width of the monitor) 

     double y0 = -100; // floor height 

     string texturePath = @"c:\pj\Hydrangeas.jpg";//@"c:\pj\Chrysanthemum.jpg"; 


     // screen size 
     int height = ClientSize.Height; 
     int width = ClientSize.Width; 

     // center of screen 
     double cx = width/2; 
     double cy = height/2; 



     // render destination 
     var dst = new Bitmap(width, height); 

     // source texture 

     var src = Bitmap.FromFile(texturePath) as Bitmap; 

     // texture dimensions 
     int tw = src.Width; 
     int th = src.Height; 

     for (int y = 0; y < height; y++) 
      for (int x = 0; x < width; x++) 
      { 
       double v = m * y0/(y - cy) - cz; 
       double u = (x - cx) * (v + cz)/m; 

       int uu = ((int)u % tw + tw) % tw; 
       int vv = ((int)v % th + th) % th; 
       // The following .SetPixel() and .GetPixel() are painfully slow 
       // You can replace this whole loop with an equivalent implementation 
       // using pointers inside unsafe{} code to make it much faster. 
       // Note that by casting u and v into integers, we are performing 
       // a nearest pixel interpolation... It's sloppy but effective. 

       dst.SetPixel(x, y, src.GetPixel(uu, vv)); 
      } 

     // draw result on the form 
     e.Graphics.DrawImage(dst, 0, 0); 
    } 

} 
} 

This is a sample output using one of Windows 7 sample images.

Another example using another Windows 7 sample picture.

+0

이 픽셀을 픽셀 단위로 처리하는 대신 모서리를 계산 한 다음 적절한 2D 행렬을 계산하고 'Graphics.transform'을 설정하여 DrawImage()를 수행해야합니다. 기울어 진 사각형을 그리는 DrawImage() 호출이있을 수도 있습니다. 미안 해요 내 3D 수학은 20 세이고 Windows 프로그래밍은 10입니다. – NPAssoc

+0

@NPAssoc 저는이 해를 몇 년 전에 쓴 적이 있는데, 저는 "픽셀 별 3D 기술"을 과시했습니다. 3D 투영을 렌더링하려면, 내가 아는 한 4x4 크기의 아핀 행렬이 필요합니다. 나는 렌더 매트릭스를 설정하는 것이 일반적이지만, System.Drawing.Graphics는 4x4 변환 매트릭스를 지원하지 않는다고 생각합니다. 더 새로운 WPF 프레임 워크는 이것을 즉시 사용할 수 있습니다. –

+0

@NPAssoc 방금 "기울어 진 사각형"발언에 주목했습니다. 비뚤어진 사각형의 경우 "전단"변환을 사용합니다. 전단 연산은 2x2 행렬로 수행 할 수 있으며 System.Drawing.Graphics에서 쉽게 처리 할 수 ​​있습니다. 전단 작업은 원근감있는 아핀 투영법과 같지 않습니다. 위의 내 의견과 다른 해법에 언급 된 4x4 변형이 필요합니다. –