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东西,有些直觉是的,但我不是老师,我不擅长在没有笔/纸或黑板的情况下远程解释。我可能无法进一步帮助你。