在OpenGL中绘制相机对齐的圆

时间:2014-05-01 16:58:41

标签: opengl

我喜欢使用gluSphere()在OpenGL环境中绘制球体。但是,我希望我可以在球体周围画一个边框,边框是一个与相机框架完美对齐的圆圈,这样圆圈实际上总是一个圆圈,而不是从不同角度看到的椭圆。我使用的框架为我设置OpenGL环境并处理相机。当我画画时,我总是在思考世界坐标,所以我觉得很难完成这项任务。我希望在我最深层次的OpenGL绘图命令中嵌入一个解决方案,如下所示:

// Draws a sphere with a camera plane aligned border around it (you wish).
void GLLib::drawBorderedSphere(float radius)
{
    static GLUquadric* quadric = gluNewQuadric();
    gluSphere(quadric, radius, 32, 32);

    // Determine a rotation matrix depending on the current camera configuration.
    // glRotate(somehow);
    // drawCircle(radius); <-- this I already have.
}

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

实际上任务很简单。您知道球体的中心点和相机的位置。这将为您提供平面的法线向量,圆圈位于。现在您只需在该位置找到两个基本向量(理想情况下彼此正交),以形成圆的坐标基础。这也很简单:将任何与摄像机不平行的矢量渲染到球形矢量(例如摄像机“向上”矢量),并使用Gram-Schmidt正交化将其正交化为圆形法线,将其称为“切线矢量”。要获得第二个圆平面基矢量,称为“比特”,计算圆平面法线和切线的叉积。作为最后一步,缩小切线和单位长度的比特。

  1. N =相机 - Circlecenter
  2. T = orthogonalize(N,Camera_Up)
  3. B =交叉(N,T)
  4. T'= T / len(T); B'= B / len(B)
  5. 然后用T'和B'你可以绘制圆圈:

    drawCircle(radius):
        p = []
        for i in 0 .. points:
            a = i*2*pi / points
            p.append( radius*(T*sin(a) + B*cos(a)) )
        draw_line_loop(p)
    
相关问题