0

だから私はここに機能を持っています

void rotateLocal(GLfloat deg, GLfloat x, GLfloat y, GLfloat z)

ここで、x、y、z は、このオブジェクトを中心に回転させたいローカル軸の座標です。テスト目的で (0,1,0) を使用していますが、ローカル y ではなくワールド y を中心に回転するだけです。この関数のオブジェクトの 1 つの頂点のロジックは次のとおりです。

ax = x;
ay = y;
az = z;

//normalize
length = sqrt((ax * ax) + (ay * ay) + (az * az));
ux = ax / length;
uy = ay / length;
uz = az / length;

//square these
uxS = ux * ux;
uyS = uy * uy;
uzS = uz * uz;

getx = vertex[0];
gety = vertex[1];
getz = vertex[2];

//find new vertex points using rotation matrix for local axis
vertex[0] = (getx * (uxS + cos(deg) * (1 - uxS))) + (gety * (ux * uy * (1 - cos(deg)) - uz * sin(deg))) + (getz * (uz * ux * (1 - cos(deg)) + uy * sin(deg)));
vertex[1] = (getx * (ux * uy * (1-cos(deg)) + uz * sin(deg))) + (gety * (uyS + cos(deg) * (1 - uyS))) + (getz * (uy * uz * (1 - cos(deg)) - ux * sin(deg)));
vertex[2] = (getx * (uz * ux * (1-cos(deg)) - uy * sin(deg))) + (gety * (uy * uz * (1-cos(deg)) + ux * sin(deg))) + (getz * (uzS + cos(deg) * (1-uzS)));

回転行列に何か問題がありますか? どこかで間違った変数を使用していますか?

注: RotateGL などは使用したくありません。行列の計算を自分で行いたいのです。

4

1 に答える 1

1

問題は、ワールド座標で軸を表現していることです。あなたがしなければならないことは次のとおりです。

  • 回転させたいオブジェクトのローカルからワールドへの変換行列を取得します。
  • この行列の逆を使用して、ワールド軸 (この例では (0,1,0)) をローカル座標に変換します。
  • コードで行っているように、変換された軸を使用して回転を計算します。

オブジェクトの座標がローカル空間で表現されていることがわかりました。

それで全部です。

于 2013-10-06T07:12:47.010 に答える