c++ - 如何在 OpenGL 中绘制圆弧

标签 c++ opengl

在用 C++ OpenGL 制作一个小 Pong 游戏时,我认为在东西弹跳时创建弧形(半圆)会很有趣。我决定暂时跳过贝塞尔曲线,直接使用代数,但我并没有走得太远。我的代数遵循一个简单的二次函数 (y = +- sqrt(mx+c))。

这个小摘录只是一个例子,我还没有完全参数化,我只是想看看它会是什么样子。然而,当我画这个时,它给了我一条垂直直线,直线的切线接近 -1.0/1.0。

这是 GL_LINE_STRIP 样式的限制还是有更简单的方法来绘制半圆/圆弧?还是我完全错过了一些明显的东西?

void Ball::drawBounce()
{   float piecesToDraw = 100.0f;
    float arcWidth = 10.0f;
    float arcAngle = 4.0f;

    glBegin(GL_LINE_STRIP);
        for (float i = 0.0f; i < piecesToDraw; i += 1.0f)  // Positive Half
        {   float currentX = (i / piecesToDraw) * arcWidth;
            glVertex2f(currentX, sqrtf((-currentX * arcAngle)+ arcWidth));
        }
        for (float j = piecesToDraw; j > 0.0f; j -= 1.0f) // Negative half (go backwards in X direction now)
        {   float currentX = (j / piecesToDraw) * arcWidth;
            glVertex2f(currentX, -sqrtf((-currentX * arcAngle) + arcWidth));
        }
    glEnd();
}

提前致谢。

最佳答案

sqrtf((-currentX * arcAngle)+ arcWidth) 的目的是什么?当 i>25 时,该表达式变为虚数。执行此操作的正确方法是使用 sin()/cos() 生成问题中所述的半圆的 X 和 Y 坐标。如果您想改用抛物线,更简洁的方法是计算 y=H-H(x/W)^2

关于c++ - 如何在 OpenGL 中绘制圆弧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2596934/

相关文章:

c++ - 'non-virtual interface' 和 'abstract interface' 有什么区别?

C++:如何获得类似 C# 的属性

c++ - (x+1) > x 如何评估为 0 和 1?

api - glUseProgram(0)有什么作用?

objective-c - 注册最后的鼠标位置以实现平滑绘图

opengl - 用 fwidth 确定 miplevel

C++ 能否使 pthread (Windows) 保持打开状态以多次运行一个函数?

c++ - 为什么将 double 类型转换为 int 似乎会在第 16 位数字后四舍五入?

c - 用于 openGL 的 DIY 相机变换

c++ - 如何从非连续数据生成 OpenGL 纹理?