2016-02-29 86 views
0

我想在右下歐幾里得三角形龐加萊磁盤雙曲線三角形,它看起來像這樣的形式將紋理映射:紋理映射到一個雙曲線三角形

Hyperbolic Triange

這裏的紋理(紋理的左上角三角形是透明且未使用的)。你可能會認識到這是埃舍爾的Circle Limit I的一部分:

Texture

而這正是我的多邊形的樣子(它在原點,這就意味着,兩個邊緣直線爲中心,但是一般三個邊會是曲線如在第一圖片):

Wireframe Polygon

多邊形的中心是由它的頂點形成的歐幾里德三角形的incentre和我UV使用它的incentre映射紋理,將其分割成相同多邊形所具有的面數,並將每個面映射到相應的多邊形面上。然而,結果是這樣的:

Textured Polygon

如果有人認爲這樣使用UV貼圖我很樂意提供一些示例代碼,但是我開始想,這也許是不可能的,是可解我將不得不編寫自己的着色器函數。

+0

我也問過這個問題在上computergraphics.stackexchange並得到一個答案有 http://computergraphics.stackexchange.com/questions/2117/map-a-texture-to-a-hyperbolic-triangle – looeee

+0

這很整齊。你有沒有可能提供一個更詳細的例子來說明你是如何做到的? –

+0

歡迎您瀏覽https://github.com/looeee/hyperbolic-tiling/tree/master/es2015。就繪製多邊形而言,大多數代碼位於elements.js Polygon類中,該類將網格傳遞到threejs.js中的polygon()方法進行繪製。 我在eschersketch.com上也有一個工作快照。 – looeee

回答

0

UV貼圖是一種將紋理映射到OpenGL多邊形的方法。紋理總是使用xy座標在(0,1)範圍內的歐幾里得空間中進行採樣。

要將您的紋理覆蓋到Poincare光盤上的三角形上,請保留歐幾里德座標系在頂點中,然後使用這些來對紋理進行採樣。

以下代碼對OpenGL 3.0 ES有效。

頂點着色器:

#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); 
}