10

特定の位置に QUAD がある場合、その法線が特定のポイントを指すように回転するにはどうすればよいですか? 色付きのブロックが単なる長方形の四角形であると想像してください。この画像は、私の言いたいことを少し示しています。四角形はすべて、球の中心を向くように配置されています。

代替テキスト http://emrahgunduz.com/wp-content/uploads/2009/01/material_id_gui-600x364.jpg

たぶん、この 2 番目の画像は、私がやろうとしていることをもう少し示しています

私はopenGL / C++(およびEigen lib)を使用しています。そして、単純なクワッドを描画する次のコードがあります。

#include "ofMain.h"
#include "Quad.h"
Quad::Quad(Vector3f oPosition):position(oPosition) {
}

void Quad::update() {
}

void Quad::draw() {
    float size = 1.3;
    glColor3f(1.0f, 0.0f, 0.6f);
    glPushMatrix();
        glTranslatef(position.x(), position.y(), position.z());
        glScalef(size, size,size);
        glBegin(GL_QUADS);
            glVertex3f(0,0,0);
            glVertex3f(1,0,0);
            glVertex3f(1,1,0);
            glVertex3f(0,1,0);
        glEnd();
    glPopMatrix();
}

更新 17-07 親愛なる読者へ

クワッドを回転させることで、少し前進しました。look_atいくつかのクワッドをランダムに配置してから、以下の返信の説明を使用して、このコードを使用してそれらを vector3f に向かって回転させます。

void Quad::draw() {
    float size = 0.5;
    glColor3f(1.0f, 0.0f, 0.6f);
    glPushMatrix();
        Vector3f center = look_at - position;
        Vector3f center_norm = center.normalized();
        float r_angle   = acos(center_norm.dot(normal));
        Vector3f axis = normal.normalized().cross(center_norm);

        glPointSize(8);
        glLineWidth(4.0f);

        // draw the center point
        glColor3f(1.0f, 0.0f, 0.0f);
        glBegin(GL_POINTS); 
            glVertex3fv(look_at.data());
        glEnd();

        // draw the quad
        glColor4f(0.0f, 0.0f, 0.0f, 0.85f); 
        glTranslatef(position.x(), position.y(), position.z());
        glRotatef(r_angle * RAD_TO_DEG, axis.x(), axis.y(), axis.z());
        glScalef(size, size,size);
        glBegin(GL_QUADS);
            glVertex3f(-0.5,-0.5,0);
            glVertex3f(0.5,-0.5,0);
            glVertex3f(0.5,0.5,0);
            glVertex3f(-0.5,0.5,0);
        glEnd();

    glPopMatrix();
}

結果は次のようになります。 代替テキスト

ご覧のとおり、クワッドの回転はまだ少し「奇妙」ですが、ほぼそこまで来ています。下の画像を見ると、色付きのクワッドがあり、回転の違いがはっきりとわかります。下の色付きの球と同じ結果が得られるようにクワッドを回転させるにはどうすればよいですか?

4

3 に答える 3

2

あなたはすでにこれを見つけているかもしれません - http://gpwiki.org/index.php/OpenGL:Tutorials:Using_Quaternions_to_represent_rotation - しかし、私が最後にこのトピックを調べたとき、私はそれが役に立ちました.

于 2010-07-08T13:54:17.237 に答える
2

回転軸 = normalize(crossproduct(currentNormal, desiredNormal))

回転角度 = acos(dotproduct(normalize(currentNormal), normalize(desiredNormal))。

軸と角度から回転行列または四元数を構築できます。正確な式は、四元数に関するリソースで見つけることができます。

法線をベースの周りで回転させるか、先端の周りで回転させるかによって、角度または軸を反転する必要がある場合があります。

また、このリソースには、四元数、回転、および 3 次元空間全般に関する十分な情報が含まれているようです。

于 2010-07-08T16:06:09.737 に答える
0

「特定の位置にある」とは、現在の正常な状態を知っていることを意味する場合、次のようになります。

  1. 古い法線と新しい法線の内積は、それらの間の角度の正弦です。
  2. それらの外積は、目的の回転を実行する必要がある軸です。
  3. 与えられた軸と角度からの回転クォータニオンの構築は、十分に文書化されており、基本的な機能です。
  4. クワッド自体の回転には注意が必要であり、クワッドをどの程度正確に回転させるかによって異なります。
于 2010-07-08T16:11:13.797 に答える