如何在OpenGL中绘制3D矢量?

时间:2014-10-20 02:47:06

标签: c++ opengl vector 3d rotation

我正在对粒子的运动进行3D模拟,我想在某些位置绘制代表电场的箭头。 我在Blender中创建了一个箭头网格并将其导出为.obj,因此我可以在我的代码中使用它(我创建了一个.obj加载器),但我似乎无法正确旋转它以使它指向正确的方向,即使我检查了电场矢量是否正确计算。 我也得到了一些奇怪的结果。例如,如果向量应该向上指向,则向下指向,但是当我注释掉在x轴上旋转的代码时,箭头指向下方。然后,如果它指向右侧,则指向内侧(朝向负z轴),但是当我在y轴上注释掉旋转时,它指向右侧。

这是我的旋转和渲染箭头的代码:

void Render(Vector3 cameraPos)
{
    glScalef(field.length() * ArrowLength,1.0,1.0);
    glTranslatef(0,0,_zdefault);
    glRotatef(Entity::yangle,0,1,0);
    glTranslatef(pos.getX() + cameraPos.getX(), pos.getY() + cameraPos.getY(), pos.getZ() + cameraPos.getZ() - _zdefault);

    glRotatef(atan2(field.getZ(),field.getY()) * 180/M_PI, 1.0,0.0,0.0);
    glRotatef(atan2(field.getX(),field.getZ()) * 180/M_PI, 0.0,1.0,0.0);
    glRotatef(atan2(field.getY(),field.getX()) * 180/M_PI, 0.0,0.0,1.0);

    glBindTexture(GL_TEXTURE_2D,arrowTexture);

    glCallList(arrow);
    glLoadIdentity();
};

字段是表示电场的Vector。 行

glTranslatef(0,0,_zdefault);
glRotatef(Entity::yangle,0,1,0);

是否可以旋转整个场景,有点像在Blender中围绕它旋转。 另外,Vector3只是一个简单的Vector类,我用非常基本的功能编写。就像我说的那样,矢量计算没有问题,我检查过,我只是不能使用向量来正确旋转。

我有一种感觉我的角度对于我使用atan2的glRotatef来说有点搞砸了,但我仍然无法理解这会如何影响旋转,如前所述。

有没有办法只根据矢量组件旋转东西?

1 个答案:

答案 0 :(得分:1)

首先,您可能不应该使用glRotatef glTranslatef等旧版管道,而是使用着色器并管理您自己的矩阵。

除此之外,使用lookAt作为方向指示并使用field向量

进行up转换更好

对于旋转整个场景,您只需定义一个中心并在翻译后使用相同的变换旋转所有向量