Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;/openGL:使用四元数向点旋转四边形_C++_Opengl_Rotation_Quaternions - Fatal编程技术网

C++ C++;/openGL:使用四元数向点旋转四边形

C++ C++;/openGL:使用四元数向点旋转四边形,c++,opengl,rotation,quaternions,C++,Opengl,Rotation,Quaternions,当我在某个位置有一个四边形时,我如何旋转它,使它的法线指向一个给定的点?假设彩色块只是矩形四边形,那么这张图显示了我的意思。四边形的方向都指向球体的中心 也许这第二张图片显示了我正在尝试做的事情: 我使用OpenGL/C++(和特征库)。我有这个代码来画一个简单的四边形: #include "ofMain.h" #include "Quad.h" Quad::Quad(Vector3f oPosition):position(oPosition) { } void Quad::update

当我在某个位置有一个四边形时,我如何旋转它,使它的法线指向一个给定的点?假设彩色块只是矩形四边形,那么这张图显示了我的意思。四边形的方向都指向球体的中心

也许这第二张图片显示了我正在尝试做的事情:

我使用OpenGL/C++(和特征库)。我有这个代码来画一个简单的四边形:

#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 亲爱的读者:

只是旋转四个四角体,让它走得更远了一点。我随机放置了两个四边形,然后使用下面的回复中的描述,使用此代码将它们旋转到
查看
矢量3f:

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();
}
结果如下所示:


正如你所看到的,我就快到了,尽管四边形的旋转仍然有点“奇怪”。你可以看到下面的图片,上面有彩色的四边形,你可以清楚地看到旋转的不同。如何旋转四边形以获得与下面彩色球体相同的结果?

您可能已经发现了这一点,但我在上次研究此主题时发现它很有用。

旋转轴=规格化(交叉积(currentNormal,desiredNormal))

旋转角度=acos(点积(规格化(currentNormal)、规格化(desiredNormal))

您可以从轴和角度构建旋转矩阵或四元数。有关四元数的任何资源中都可以找到精确的公式

您可能需要翻转角度或轴,这取决于您是围绕其“底部”还是围绕其“尖端”旋转法线

另外,resource似乎有足够的关于四元数、旋转和三维空间的信息。

如果“在某个位置”表示您知道当前法线,那么下面就是问题:

  • 新旧法线的点积是它们之间夹角的余弦
  • 它们的叉积是一个轴,您应该围绕该轴执行所需的旋转
  • 从给定的轴和角度构造旋转四元数是一个很好的文档和基本特征
  • 旋转四边形本身很棘手,这取决于您希望它旋转的确切方式

  • +1:因为我喜欢3D图片:)这些图像链接都断开了。对于四边形,可以使用叉积=normalize(叉积(c-a,d-b))或normalize(叉积(b-a,c-a))找到法线。来自quad的任意两个非平行向量都可以用于使垂直。在您的示例中,法线为(0,0,1)或(0,0,-1)。(取决于四边形是否使用相同的缠绕顺序,单面还是双面,等等)。@pollux:如果我有一块黑板,几分钟的时间,你在房间里,我可以解释一切。纯文本有点难。现在,您可以了解您的行为,因为您尝试仅使用一次旋转来对齐四边形。这是可能的,但使用两个旋转要容易得多——首先旋转四边形,使其法线平行(或相反,取决于您想要什么)指向球体中心的向量。如果我正确理解你的截图,你已经做到了。第二步,围绕法线旋转四边形,使其“向上”向量正确对齐。@pollux:Step#2:在四边形中,需要找到“局部向上”向量。即从四边形中心指向四边形“顶部”的方向。你需要一个“全局向上”向量,它指向世界。要找到四边形的“正确向上”,您需要做两个叉积-首先“vec3 side=normalize(交叉(全局向上,方向到中心)”-这将得到指向“侧向”的向量。然后您可以得到“正确的上=规格化(交叉(方向上到中心,侧面))”。这将为四边形提供所需的“向上”向量。现在您可以计算旋转角度(acos(点(局部向上,适当向上)),并使用…@pollux:问题可以以不同的方式解决。在这种情况下,四边形的位置/旋转可以是偏航、俯仰和距离。即,两个旋转角度和距球体中心的距离。您可以只制作一个四边形,然后使用一个glTranslate和两个glRotate调用绘制它。距离可以计算为长度(四边形-中心-球体-中心).pitch-acos(dot3(全局向上,规格化(四边形中心-球体中心)))等等。这并不难。@pollux:不管怎样,如果你有困难,我建议你去买三角学书籍,把所有的东西都画在纸上,看看你自己如何旋转四边形,以及如何计算旋转。或者你也可以向几何学老师/导师寻求帮助。我使用和理解像这样的3d东西,有些直觉是的,但我不是老师,我不擅长在没有笔/纸或黑板的情况下远程解释。我可能无法进一步帮助你。