矩形的旋转和平移

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

原始矩形的四个角点为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);

然后我使用matrix“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中绘制它们之后,四个角点不能形成矩形。

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


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

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

链接地址: http://www.djcxy.com/p/64015.html

上一篇: The rotation and translation of a rectangle

下一篇: Transform coordinates into another coordinate system