1

回転を機能させようとしましたが、機能しているようです。オブジェクトを移動しようとすると問題が発生します。オブジェクトの軸がメッシュで回転することを期待していましたが、代わりにグローバル軸を保持して移動し続けますその軸上のオブジェクト。回転に関する私の理解は間違っていますか? または、これが発生する原因となっているコードですか。また、私の理解が問題である場合、オブジェクトの軸をオブジェクトで変換する方法があります。私のコードは次のとおりです。

Projection= glm::perspective(45.f, 4.0f / 3.0f, 0.1f, 100.0f);

//position and direction are calculated based on mouse position
View      = glm::lookAt(
position,
position+direction,
up
);
glm::mat4 myMatrix = glm::translate(x,y,z);
glm::mat4 myScalingMatrix = glm::scale(0.2f, 0.2f ,0.2f);
glm::vec3 myRotationAxis( 0, 1, 0);
glm::mat4 tempModel = glm::mat4(1.f);
glm::mat4 myRotationMatrix =glm::rotate( tempModel,45.f, myRotationAxis );

glm::mat4 Model= myMatrix* myRotationMatrix *myScalingMatrix;

glm::mat4 MVP = Projection* View * Model;
4

3 に答える 3

2

順序が重要であるため、行列の乗算順序を調べます。あなたの場合、最初にオブジェクトをスケーリングしてから回転させ、最後にグローバル軸に従ってオブジェクトを移動します。乗算を切り替えることにより、最初に移動し、次にローカル座標系全体を必要な角度だけ回転させることができます。これにより、オブジェクトの回転だけでなく、移動軸の回転も行われます。

glm::mat4 Model= myRotationMatrix * myMatrix *myScalingMatrix;

件名に関するいくつかの参照。

于 2013-06-11T23:13:23.087 に答える
2

回転行列は、原点 (つまり (0,0,0)) を中心とした回転に対してのみ機能するため、原点をオブジェクトの中心に前後に切り替える必要があります。

オブジェクトが (X、Y、Z) にあるとします。次に、そのオブジェクトを中心に回転させたい場合は、最初に平行移動(-X、-Y、-Z)してから回転を行い、次に平行移動(X、Y、Z)を元の位置に戻す必要があります。オブジェクトに回転中心を実行します。

この図は、実際にどのように機能するかを示しています。 ここに画像の説明を入力

これは、上の画像を含むリンクです。これには、回転に関するいくつかの基本も含まれています。

于 2013-06-11T23:14:23.113 に答える
0

私の場合、単純な三角形を描いて変換をいじっていました。私の三角形が座標を持っていたとき:

{0.0,2.0,-10.0,
-2.0,-2.0,-10.0,
2.0,-2.0,-10.0};

スケーリングは、中心0.0、0.0、0.0に対してスケーリングされたため、あなたが言ったとおりになりました。y 軸に沿った回転もめちゃくちゃです。明らかな修正は、カメラを後方に移動し、オブジェクトを中央に配置することでした.

{0.0,2.0,0.0,
-2.0,-2.0,0.0,
2.0,-2.0,0.0};

これは、すべての数学に集中している間は見過ごされがちな些細なケースです。そのため、オブジェクトが中央にあることを確認してください。

于 2014-03-17T02:01:14.140 に答える