2017-07-21 6 views
0

私はatan2fで中心に向かって私のオブジェクトの向きを変更しようとしますが、それは私に間違った価値を与えています。私はどこか間違っていますか?atan2f()が動作しません

glm::vec3 center = glm::vec3(0.4f, 0.4f, 0.0f); 
for(int i = 0; i < num; i++){ 
    float rel = i/(float) num; 
    float angle = rel * M_PI * 2; 
    glm::vec3 position = glm::vec3(cos(angle), glm::sin(angle), position.z); 

    position.x *= radius; position.y *= radius; 
    position.x += center; position.y += center; 
    glm::mat4 trans = glm::translate(glm::mat4(1.0f), position); 

    float newAngle = atan2f(position.y - center.y, position.x - center.x); 

    glm::mat4 rotation = glm::rotation(glm::mat4(1.0f), newAngle, glm::vec3(0, 0, 1)); 

    numModel.at(i) = trans * rotation; 
} 
+0

間違った値について特に気付くことができますか?たぶんあなたは、記号を反転するか、それに似たようなものに 'pi/2'を追加する必要があります。 – HolyBlackCat

+0

@HolyBlackCatあなたの答えをありがとう。私は3つのオブジェクトを持っています。もし私がatan2fで角度を変えようとすると、0度、120度、-120度のいずれかになります。権利値は90度、135度、最後は約-135度でなければなりません。 – Vitge

答えて

0

あなたが世界の中心の周りにオブジェクトを回転する場合は、最初の回転行列を設定する必要があります。

float angle = ...; 
glm::vec3 rotAxis(...); 
glm::mat4 rotMat = glm::rotation(glm::mat4(1.0f), angle, rotAxis); 

glm::rotation関数は正弦と角度の余弦を計算しますマトリックス内に適切なフィールドを設定します。

glm::vec3 position(radius, 0.0f, 0.0f); 
glm::mat4 transMat = glm::translate(glm::mat4(1.0f), position); 

あなたは回転を乗算する必要が世界の中心の周りにオブジェクトを回転させる:あなたはセットアップあなたのオブジェクトの位置行列に持つ第二

が、これはオブジェクトの初期位置を記述する行列であります行列rotMatをモデル行列transMatで置き換えます。これは、回転行列がオブジェクトを配置するための参照システムを定義するためです。

glm::mat4 modelMat = rotMat * transMat; 

あなたは、自身の原点を中心にオブジェクトを回転したい場合は、世界にあなたのオブジェクトを配置する最初のを持っていると、あなたはそれを回転する必要があります。

glm::mat4 modelMat = transMat * rotMat; 

また質問への答えをご覧ください。 OpenGL transforming objects with multiple rotations of Different axis

オブジェクトがワールドの中心に向くようにしたい場合は、まずオブジェクトをその場所に翻訳する必要があります。第2に、世界のX軸とオブジェクトから中心への方向の間の角度を計算する必要があります。最後に、と反対ののオブジェクトを回転させる必要があります。

glm::vec3 position(...); 
glm::vec3 center(...); 
glm::mat4 transMat = glm::translate(glm::mat4(1.0f), position); 

float angle = atan2f(center.y - position.y, center.x - position.x); 

glm::vec3 rotAxis(0.0f, 0.0f, 1.0f); 
glm::mat4 rotMat = glm::rotation(glm::mat4(1.0f), -angle, rotAxis); 

glm::mat4 modelMat = transMat * rotMat; 
+0

こんにちは、私はすでに中心の周りにオブジェクトを作成し、翻訳しました。 私がしようとしているのは、中心を中心に回転するのではなく、オブジェクトの頂点を中心に向けることです。 – Vitge

+0

@Vite私は、私の答えを広げて参照してください。 – Rabbid76

+0

ありがとう、これはこれ... – Vitge

関連する問題