使用非正交变换保持相对大小

时间:2015-03-14 17:37:19

标签: opengl transformation projection orthogonal

我正在编写一个使用纹理四边形显示文本标签的着色器(没什么复杂的。)

标签有一个原点(vec3)和一个方向(vec3),我选择一个固定的 着色器中的正交方向(见下文)。每个字形由四个描述 使用偏移量(vec2)给出顶点和每个顶点位置 沿切线和正交方向前进

 uniform vec3 origin;
 uniform vec3 direction;
 uniform float scale;
 attribute vec2 position;

 vec3 tangent = normalize(direction.xyz);
 vec3 ortho   = cross(tangent, vec3(0,0,-1));
 vec4 P = vec4(origin + scale*(position.x * tangent + position.y * ortho),1.0);

这没有问题。

现在,我想介绍一个用户定义的转换函数 (例如极坐标投影,但在着色器中未知)。问题是 我想保持我的标签大小不变独立于变换和 相对于参考点。例如,这不起作用:

vec4 P = transform(origin + scale*(position.x * tangent + position.y * ortho));

因为定义字形的四个点可能具有“不同的”变换 变换不是正交的(如极坐标投影)。使用参考点R,我可以使用以下方法获得固定的方向和大小:

vec4 T = transform(R + scale*tangent*position.x) - transform(R);
vec4 O = transform(R + scale*ortho*position.y) - transform(R);
vec4 P = transform(origin) + T + O;

但我希望在保持大小不变​​的同时保持新的方向 相对于参考点。有什么想法吗?

Screenshot of current transformation

最后解决方案是:

vec4 T = transform((origin+scale*tangent)) - transform(origin);
T = scale*normalize(T);
vec4 O = transform((origin+scale*ortho)) - transform(origin);
O = scale*normalize(O);
vec4 P = transform(origin) + position.x*T + position.y*O;

但丢失缩放信息(存在于转换中)。

0 个答案:

没有答案