1

ここで、回転と平行移動の後で長方形を長方形のままにできるかどうか疑問に思っています。私の例は次のようにリストされています:

元の長方形の4つのコーナーポイントは、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を使用して、結果の長方形の4つのコーナーポイントを計算します。

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];

他の3つのsp2sp3sp4も同じ方法で計算されます。

ただし、結果は混乱を招きます。それらはもはや長方形ではありません。

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つのコーナーポイントは長方形を作成できません。

だから私はなぜ知りたいですか?平行移動と回転では、長方形が変更できないことを保証できませんか?そして、これらの変換後、長方形を長方形のままにする方法は?

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 に答える