2016-02-29 105 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); 
}