旋转/对齐纹理坐标

时间:2013-01-23 15:13:56

标签: opengl geometry

我有1024x1渐变纹理,我想要映射到四边形。该梯度应沿该四边形内的线(p1,p2)对齐。纹理具有GL_CLAMP_TO_EDGE属性,因此它将填充整个四边形。

我现在需要弄清楚四边形的四个角(A,B,C,D)的纹理坐标,但我无法绕过所需的数学运算。

image

我试图计算(p1,p2)之间的角度,然后围绕(p1,2)之间的直线中心旋转角点,但我无法正常工作。无论如何它似乎有点过分 - 是否有更简单的解决方案?

1 个答案:

答案 0 :(得分:0)

我发现另一种方法实际上就像我想要的那样,只使用加法,乘法和一个div;节省了昂贵的时间。

我首先计算(p1,p2)线的斜率和与其正交的线的斜率。然后我计算出斜率的交点(从p1开始)和每个角落的正交说明。

Vector2 slope = {p2.x - p1.x, p2.y - p1.y};
Vector2 ortho = {-slope.y, slope.x};

float div = 1/(slope.y * ortho.x - slope.x * ortho.y);
Vector2 A = {
    (ortho.x * -p1.y + ortho.y * p1.x) * div,
    (slope.x * -p1.y + slope.y * p1.x) * div
};
Vector2 B = {
    (ortho.x * -p1.y + ortho.y * (p1.x - 1)) * div,
    (slope.x * -p1.y + slope.y * (p1.x - 1)) * div
};
Vector2 C = {
    (ortho.x * (1 - p1.y) + ortho.y * p1.x) * div,
    (slope.x * (1 - p1.y) + slope.y * p1.x) * div
};
Vector2 D = {
    (ortho.x * (1 - p1.y) + ortho.y * (p1.x - 1)) * div,
    (slope.x * (1 - p1.y) + slope.y * (p1.x - 1)) * div
};