1

在这里,我想知道一个矩形是否可以在旋转和平移后保持矩形。我的例子如下:

原矩形的四个角点为s1(-1,-1,2), s2(-1,1,2), s3(1,1,2), s4(1,-1,2);

我的整个变换是平移和旋转,所以我使用 glTranslate 和 glRotate 来获取变换矩阵:

GLfloat modelView[16]; //transform the rectangle
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
//because of column-major order, here should be rotation first and then translation
glRotatef(-rotationAngel, rotationVector[0], rotationVector[1], rotationVector[2]);
glTranslatef(tranV[0], tranV[1], tranV[2]); 
glGetFloatv(GL_MODELVIEW_MATRIX, modelView); 
glPopMatrix();

在我的真实程序中,rotationAngel = 62, rotationVector = (-0.34, 0.81, 0), tranV = (0.46, 1.70, 0.059);

然后我使用矩阵“modeView”来计算我的结果矩形的四个角点:

sp1.x = s1.x*modelView[0] + s1.y*modelView[4] + s1.z*modelView[8] + modelView[12];
sp1.y = s1.x*modelView[1] + s1.y*modelView[5] + s1.z*modelView[9] + modelView[13];
sp1.z = s1.x*modelView[2] + s1.y*modelView[6] + s1.z*modelView[10] + modelView[14];

其他三个 sp2 sp3 sp4 的计算方法相同。

然而,结果令人困惑。它们不再是矩形了。

sp1 = (-2.10, -0.038, 0.77);
sp2 = (-2.48, 1.88, 1.45);
sp3 = (-1.38, 1.50, 3.08);
sp4 = (-1.01, -0.34, 2.39);

很明显,在OpenGL中画出来后,四个角点不能组成一个矩形。

所以我想知道为什么?平移和旋转不能保证矩形不变?以及如何在这些转换后使矩形保持矩形?

4

1 回答 1

1

平移和旋转是称为刚性变换的变换类型,它们保持顶点之间的距离和方向,因此,基本上,在平移和旋转之后,矩形应该保持其形状。

实际上你的代码没有问题,如果你计算任意一对连续顶点之间的距离(d = sqrt(<v1 - v0, v1 - v0>),其中<x, y>表示内积),你得到 2 ,这是变换前矩形中任意一对连续顶点之间的原始距离,如果您采用归一化向量(sp2 - sp1)(sp4 - sp1)的点积,则结果非常接近 0(由于浮动误差),这表明成形角非常接近 90 度。所以,在转换之后,你仍然会在空间中得到一个矩形。

于 2012-06-13T03:19:09.413 回答