这里我想知道旋转和平移后矩形是否可以保持矩形。我的例子如下:
原始矩形的四个角点是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中绘制它们之后,四个角点不能形成矩形。
所以我想知道为什么?平移和旋转不能确保矩形不变?如何在这些变换后使矩形保持矩形?
答案 0 :(得分:1)
平移和旋转是被称为Rigid Transformations的变换类型,它们保留顶点之间的距离和方向,因此,基本上,在平移和旋转之后,矩形应保持其形状。
实际上,如果你计算距离( d = sqrt(&lt; v1 - v0,v1 - v0&gt;),你的代码没有问题,其中&lt; x,y&gt; ; 表示任何一对连续顶点之间的内积,得到2,这是变换前矩形中任意一对连续顶点之间的原始距离,如果你取标准化向量的点积< em>(sp2-sp1)和(sp4-sp1)结果非常接近0(由于浮动误差),这表明成形角度非常接近90度。所以,在转换之后,你仍然在空间中得到一个矩形。