说我有一个立方体。假设坐标值是这样的。 (单位一臂)
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 ++。
答案 0 :(得分:2)
你应该熟悉线性代数和转换矩阵。
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中,然后返回转换后的结果。
答案 1 :(得分:0)
在这里,您将当前矩阵在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;
}