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