在opengl中旋转后的坐标值

Posted

技术标签:

【中文标题】在opengl中旋转后的坐标值【英文标题】:coordinate values after rotation in opengl 【发布时间】:2014-05-25 13:58:17 【问题描述】:

假设我有一个立方体。说坐标值是这样的。 (1个手臂)

GLfloat vertA[3] =  0.5, 0.5, 0.5;
GLfloat vertB[3] = -0.5, 0.5, 0.5;
GLfloat vertC[3] = -0.5,-0.5, 0.5;
GLfloat vertD[3] =  0.5,-0.5, 0.5;
GLfloat vertE[3] =  0.5, 0.5,-0.5;
GLfloat vertF[3] = -0.5, 0.5,-0.5;
GLfloat vertG[3] = -0.5,-0.5,-0.5;
GLfloat vertH[3] =  0.5,-0.5,-0.5;

如果我翻译成这样

glTranslatef(1,2,3);

然后 1,2 和 3 将分别添加到 x,y 和 z 坐标。这些是翻译后的立方体的新坐标值。但是如果我将它旋转一定程度(有或没有翻译)

glRotatef(25,0,0,1);

现在旋转立方体的坐标是多少? 我在opengl中工作。我在 windows 上使用 c++。

【问题讨论】:

【参考方案1】:

您应该熟悉线性代数和变换矩阵。

glRotate 将生成一个rotation matrix 并将其后乘到当前矩阵。您应该注意这里的一些事情:glTranslate 不会直接向顶点坐标添加任何内容,glRotate 也不会更改坐标。所有这些所做的只是改变一个矩阵。该矩阵将累积所有变换的组成,并在绘制调用期间将一次应用于所有顶点。

在您的情况下,需要围绕 z 轴旋转 25 度,因此不会更改 z 坐标。旋转矩阵将如下所示

|  cos(25°)   -sin(25°)    0        0   |
|  sin(25°)    cos(25°)    0        0   |
|     0           0        1        0   |
|     0           0        0        1   |

要将此矩阵应用于向量 (x,y,z,w)^T,我们只需将矩阵乘以向量即可。 按照那个乘法的规则,我们得到一个新的向量

x' = cos(25°)*x -sin(25°)*y y' = sin(25°)*x +cos(25°)*y z' = z w' = w

这只是单独的旋转,不考虑平移。但是您可以将 zour 顶点的值放入 int 并返回转换后的结果。

【讨论】:

【参考方案2】:

在这里,您将当前矩阵在 z 轴上旋转 25 度。这是 glm::rotate 的代码,其作用相同。

template <typename T, precision P>
GLM_FUNC_QUALIFIER detail::tmat4x4<T, P> rotate
(
    detail::tmat4x4<T, P> const & m,
    T const & angle,
    detail::tvec3<T, P> const & v
)

    T c = cos(a);
    T s = sin(a);

    detail::tvec3<T, P> axis(normalize(v));
    detail::tvec3<T, P> temp((T(1) - c) * axis);

    detail::tmat4x4<T, P> Rotate(detail::tmat4x4<T, P>::_null);
    Rotate[0][0] = c + temp[0] * axis[0];
    Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2];
    Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1];

    Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2];
    Rotate[1][1] = c + temp[1] * axis[1];
    Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0];

    Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1];
    Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0];
    Rotate[2][2] = c + temp[2] * axis[2];

    detail::tmat4x4<T, P> Result(detail::tmat4x4<T, P>::_null);
    Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2];
    Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2];
    Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2];
    Result[3] = m[3];
    return Result;

【讨论】:

以上是关于在opengl中旋转后的坐标值的主要内容,如果未能解决你的问题,请参考以下文章

一个点A (x0 ,y0)绕原点旋转一个角度后的点 A' (x1,y1) 的坐标值计算方法是怎么推出来的

旋转后的OpenGL python和pygame翻译不适用于mouselook和移动

旋转矩阵的问题(openGL/glm)[关闭]

如何在OpenGL中实现形状的原位旋转和旋转状态下的移动?

在OpenGL中保存旋转矩阵

如何根据对象的本地位置/旋转在 OpenGL 中移动/旋转对象