2016-02-29 4 views
0

Я хочу, чтобы отобразить текстуру в виде нижнего правого евклидов треугольника гиперболического треугольника на Пуанкаре диске, который выглядит следующим образом:Карта текстуры на гиперболический треугольник

Hyperbolic Triange

Вот (верхний левый треугольник текстуры прозрачен и не используется). Вы могли бы признать это как часть Circle Limit I Эшера:

Texture

И это то, что мой многоугольник выглядит (это с центром в начале координат, а это значит, что два ребра представляют собой прямые линии, однако в целом все три ребра будут быть кривые, как и в первой картине):

Wireframe Polygon

центр многоугольника является incentre из евклидова треугольника, образованного его вершин, и я UV отображение текстуры, используя его вписанной, разделив его в одна и та же число граней, так как многоугольник имеет и отображает каждую грань на соответствующую грань многоугольника. Однако результат выглядит следующим образом:

Textured Polygon

Если кто-то думает, что это решаемая с помощью УФ отображение Я был бы счастлив, чтобы обеспечить некоторый пример кода, однако я начинаю думать, что это не может быть возможно и Я должен буду написать свои собственные функции шейдера.

+0

я задал этот вопрос снова на computergraphics.stackexchange и получил ответ там http://computergraphics.stackexchange.com/questions/2117/map-a-texture-on-a-hyperbolic-triangle – looeee

+0

Это аккуратно. Вы могли бы представить более подробный пример того, как вы это сделали? –

+0

Вы можете ознакомиться с кодом здесь https://github.com/looeee/hyperbolic-tiling/tree/master/es2015. Что касается рисования многоугольников, то большинство кода находится в классе elements.js Polygon, который передает сетку методу polygon() в threejs.js для рисования. Я сохраняю рабочий снимок в прямом эфире на eschersketch.com. – looeee

ответ

0

UV mapping - метод отображения текстуры на полигон OpenGL. Текстура всегда отбирается в евклидовом пространстве, используя координаты xy в диапазоне (0, 1).

Чтобы наложить текстуру на треугольник на диске Пуанкаре, держите эвклидовы координаты в своих вершинах и используйте их для прорисовки текстуры.

Для OpenGL 3.0 ES действует следующий код.

Vertex шейдеров:

#version 300 es 

//these should go from 0.0 to 1.0 
in vec2 euclideanCoords; 
in vec2 hyperbolicCoords; 

out vec2 uv; 

void main() { 
    //set z = 0.0 and w = 1.0 
    gl_Position = vec4(hyperbolicCoords, 0.0, 1.0); 

    uv = euclideanCoords; 
} 

Фрагмент шейдеры:

#version 300 es 

uniform sampler2D escherImage; 

in vec2 uv; 
out vec4 colour; 

void main() { 
    colour = texture(escherImage, uv); 
}