2014-10-13 2 views
1

컴퓨터에서 프로젝터로 표시된 이미지로 물리적 큐브를 매핑해야합니다. 나는 즉시 3D 큐브와 카메라 투영법을 사용하여 가상 이미지를 실제 객체에 맞추려고 했으므로 문제를 단순화하고 큐브의 2D 표현을 사용하고 2D 공간에서 각 버텍스를 이동하기로 결정했습니다. 물체에 잘 맞을 때까지. 이제 소프트웨어는 약간의 세부 사항을 제외하고는 완료되었습니다 : 텍스처.OpenGL을 사용한 2D 사다리꼴의 텍스처 보간법

저는 LWJGL을 사용하고 있으며 문서의 일부 예제에서 데이터 구조를 기반으로했습니다.

2D 공간에서 실제 입방체의 3 개의 보이는면을 표현하기 위해 7 개의 꼭지점을 사용했습니다. 이것은 각면을 덮는 3 개의 사다리꼴 (또는 불규칙한 사변형)을 만들고, 내가 보았던 ST (또는 UV) 좌표로 매핑했습니다. 이 이미지는,이 차원의 모든 기억 :

여기 test texture showing the mapping coordinates

는 모든 주문 XYZWRGBASTPQ와 VBO에 저장있어, 내가 버퍼에 내 정점 데이터를로드 코드 블록이다 (참고 Z는 항상 0입니다 , PQ는 기본적으로 0,1입니다.) :

vertices = new VertexData[7]; 
vertices[0] = new VertexData().setXY(0, 0).setST(0.5f, 0.5f); 
vertices[1] = new VertexData().setXY(0.5f, 1f/3).setST(0.5f, 0); 
vertices[2] = new VertexData().setXY(0, 2f/3).setST(0, 0); 
vertices[3] = new VertexData().setXY(-0.5f, 1f/3).setST(0, 0.5f); 
vertices[4] = new VertexData().setXY(-0.5f, -1f/3).setST(0, 1); 
vertices[5] = new VertexData().setXY(0, -2f/3).setST(0.5f, 1); 
vertices[6] = new VertexData().setXY(0.5f, -1f/3).setST(1, 1); 

0은 육각형의 중심이며 오른쪽 상단 모서리에서 반 시계 방향으로 1-6입니다. 삼각형 팬으로 그려집니다. 사다리꼴은 평행 사변형이있는 동안

다 괜찮이 다른 텍스처 테스트입니다 :

another texture test

그러나 문제는 양측이 동일하지 않을 경우, 질감이 삼각형 때문에시기를 예상이다 ,

awful texture projection

내가 주제에 많이 읽어 그 중 일부 :

0,123,516이 예상대로 보이지 않는, 텍스처를 투영하려고

Quadrilateral Interpolation, Part 1

지금까지 아무것도

Perspective correct texturing of trapezoid in OpenGL ES 2.0

Getting to know the Q texture coordinate...

내가 아는 모든 즉 인 Q는 텍스처의 좌표를 함께 할 수있는 뭔가가 문제를 해결 나를 가까이 얻었다.

내 버텍스 쉐이더는 최소한이다

#version 150 core 

in vec4 in_color; 
in vec4 in_position; 
in vec4 in_texture; 

out vec4 pass_color; 
out vec4 pass_texture; 

void main(void) { 
    pass_color = in_color; 
    pass_texture = in_texture; 
    gl_Position = in_position; 
} 

내 조각 쉐이더 내가 Q 좌표 주변에 바이올린을 시도했기 때문에 지금 내가 textureProj을 사용하고, 정말 간단합니다.

#version 330 core 

in vec4 pass_color; 
in vec4 pass_texture; 
out vec4 color; 

uniform sampler2D texture_diffuse; 

void main(void) { 
    color = pass_color; 
    color = textureProj(texture_diffuse, pass_texture); 
} 

필요한 경우 모든 코드를 게시 할 의향이 있습니다. 나는 올바른 방향으로 밀기 만하면됩니다.

+0

원근감 보간을 허용하려면 정점에 적절한 깊이 값 (z- 치수 추가)이 필요합니다. Btw, 와이어 프레임 모델이 잘못 보입니다 (위의 큐브 이미지와 반대). –

+0

필요하지 않습니다. 이미 해결했으며 나중에 솔루션을 게시 해 드리겠습니다. 감사! – fixmycode

답변

1

그래서 인터넷에 많이 숨어서 불행하게도 삼각형 팬을 매핑하는 UV 방식은 호환되지 않습니다. 그래서 삼각형 팬을 각각 삼각형으로 된 삼각형 팬을 삼각형으로 변형시켜야했습니다.

public static void qMapFaces(VertexData[] vertices, int[][] faces){ 
    for(int[] face : faces){ 
     VertexData[] verts = new VertexData[4]; 
     int j = 0; 
     for(int i : face){ 
      verts[j++] = vertices[i]; 
     } 

     float ax = verts[2].getXYZ()[0] - verts[0].getXYZ()[0]; 
     float ay = verts[2].getXYZ()[1] - verts[0].getXYZ()[1]; 
     float bx = verts[3].getXYZ()[0] - verts[1].getXYZ()[0]; 
     float by = verts[3].getXYZ()[1] - verts[1].getXYZ()[1]; 

     float cross = ax * by - ay * bx; 

     if(cross != 0) { 
      float cx = verts[0].getXYZ()[0] - verts[1].getXYZ()[0]; 
      float cy = verts[0].getXYZ()[1] - verts[1].getXYZ()[1]; 

      float s = (ax * cy - ay * cx)/cross; 

      if(s > 0 && s < 1){ 
       float t = (bx * cy - by * cx)/cross; 

       if(t > 0 && t < 1){ 
        float[] qi = new float[4]; 
        qi[0] = 1/(1 - t); 
        qi[1] = 1/(1 - s); 
        qi[2] = 1/t; 
        qi[3] = 1/s; 

        int q = 0; 
        for(VertexData vertex : verts){ 
         float[] stpq = vertex.getSTPQ(); 
         vertex.setSTPQ(stpq[0] * qi[q], stpq[1] * qi[q], 0, qi[q]); 
         q++; 
        } 
       } 
      } 
     } 
    } 
} 
: 기본적 Q는 각면의 대각선 차이에 기초하여 보간을 좌표 산출 지금 BitLush의 알고리즘을 사용하여이 정보와 함께

VertexData[] vertices = new VertexData[12]; 
int i = 0; 
for(VertexData vert : oldVertices){ 
    vertices[i++] = new VertexData(vert); 
} 
vertices[7] = new VertexData(vertices[1]); 
vertices[7].setST(1, 0.5f); 

vertices[8] = new VertexData(vertices[0]); 
vertices[9] = new VertexData(vertices[3]); 
vertices[10] = new VertexData(vertices[0]); 
vertices[11] = new VertexData(vertices[5]); 

int[][] faces = { 
    {0, 1, 2, 3}, 
    {4, 11, 10, 9}, 
    {6, 7, 8, 5} 
}; 

if(qMapping) TextureUtils.qMapFaces(vertices, faces); 

을 : I는면 사이에 공유 정점을 복제하여 만든

Q 좌표를 보간 한 후에는 투영이 크게 향상되지만 한 번에 두면의 보간을 제어 할 수 없기 때문에 텍스처가 가장자리에서 너무 잘 정렬되지 않습니다. 이것은 내 프로젝트에 문제가되지 않지만 누군가가 해결 방법을 찾으면 저에게 연락하십시오 !!

the before and after the Q mapping

-1

triangle cutted in two to make 2 linear interpolations

당신이 당신의 삼각형을 절단해야합니다 그리고 당신은 선형 보간 할 수 있습니다.