使用 openGL 在 C++ 中绘制圆
Drawing a circle in c++ using openGL
我一直在尝试使用 openGL 在 C++ 中绘制一个圆。 So far i have a compresses circle and it just has a random line going across the screen。
这是我用来获得这个形状的函数。
void Sprite::init(int x, int y, int width, int height, Type mode, float scale) {
_x = x;
_y = y;
_width = width;
_height = height;
//generate buffer if it hasn't been generated
if (_vboID == 0) {
glGenBuffers(1, &_vboID);
}
Vertex vertexData[360];
if (mode == Type::CIRCLE) {
float rad = 3.14159;
for (int i = 0; i < 359; i++) {
vertexData[i].setPosition((rad * scale) * cos(i), (rad * scale) * sin(i));
}
}
//Tell opengl to bind our vertex buffer object
glBindBuffer(GL_ARRAY_BUFFER, _vboID);
//Upload the data to the GPU
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
//Unbind the buffer
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
出现这条线的原因是什么?为什么我的圈子被压缩了?
抱歉,如果这是一个愚蠢的问题,或者如果这个问题不属于这个网站,我对 c++ 和这个网站都很陌生。
如果不亲自测试代码,很难确定,但无论如何我都会猜测。
你的奇怪行可能是由于缓冲区未完全初始化造成的。这是错误的:
Vertex vertexData[360];
for (int i = 0; i < 359; i++) {
应该是:
for (int i = 0; i < 360; i++) {
否则 vertexData[359]
处的位置未初始化并且包含一些遥远的点。
关于椭圆而不是圆形,这可能是由于您的视口在水平和垂直方向上的比例不相同造成的。如果将视口加变换矩阵配置为具有 X=-10..10、Y=-10..10 的视锥体,但实际视口为 X=0..800 和 Y=0..600,例如,比例会有所不同,您的图像就会失真。
解决方案是以下之一:
- 创建方形视口而不是矩形。检查
glViewport()
. 的参数
- 定义一个视图矩阵以考虑您的视口具有的相同比率。您没有显示如何设置 view/world 矩阵,也许您甚至没有使用矩阵...如果是这样,您可能应该使用一个。
我不明白,确切地说,你想要得到什么,但是...... cos()
和 sin()
收到了一个光芒四射的争论;所以,我想你需要的不是 cos(i)
和 sin(i)
,而是 cos((2*rad*i)/360.0))
和 sin((2*rad*i)/360.0))
,或者更简单地说,cos((rad*i)/180.0))
和 cos((rad*i)/180.0))
那么圆心和半径呢?
(x
, y
)应该是圆心吧?
scale
是半径吗?
在这种情况下,我想你应该这样写(注意:未测试)
Vertex vertexData[360];
float rad = 3.14159;
if (mode == Type::CIRCLE) {
for (int i = 0; i < 359; ++i) {
float angle = (rad / 180) * i; // (thanks Rodrigo)
vertexData[i].setPosition(x + scale * cos(angle), y + scale * sin(angle));
}
}
或者,失去精度但避免了一些 moltiplication,
Vertex vertexData[360];
float rad = 3.14159;
float angIncr = rad / 180.0;
if (mode == Type::CIRCLE) {
for (int i = 0, float angle = 0.0; i < 359; ++i, angle += angIncr) {
vertexData[i].setPosition(x + scale * cos(angle), y + scale * sin(angle));
}
}
但是 width
和 heigth
呢?
p.s.: 对不起我的英语不好
--- 根据 Rodrigo 的建议修改 --
我一直在尝试使用 openGL 在 C++ 中绘制一个圆。 So far i have a compresses circle and it just has a random line going across the screen。 这是我用来获得这个形状的函数。
void Sprite::init(int x, int y, int width, int height, Type mode, float scale) {
_x = x;
_y = y;
_width = width;
_height = height;
//generate buffer if it hasn't been generated
if (_vboID == 0) {
glGenBuffers(1, &_vboID);
}
Vertex vertexData[360];
if (mode == Type::CIRCLE) {
float rad = 3.14159;
for (int i = 0; i < 359; i++) {
vertexData[i].setPosition((rad * scale) * cos(i), (rad * scale) * sin(i));
}
}
//Tell opengl to bind our vertex buffer object
glBindBuffer(GL_ARRAY_BUFFER, _vboID);
//Upload the data to the GPU
glBufferData(GL_ARRAY_BUFFER, sizeof(vertexData), vertexData, GL_STATIC_DRAW);
//Unbind the buffer
glBindBuffer(GL_ARRAY_BUFFER, 0);
}
出现这条线的原因是什么?为什么我的圈子被压缩了?
抱歉,如果这是一个愚蠢的问题,或者如果这个问题不属于这个网站,我对 c++ 和这个网站都很陌生。
如果不亲自测试代码,很难确定,但无论如何我都会猜测。
你的奇怪行可能是由于缓冲区未完全初始化造成的。这是错误的:
Vertex vertexData[360];
for (int i = 0; i < 359; i++) {
应该是:
for (int i = 0; i < 360; i++) {
否则 vertexData[359]
处的位置未初始化并且包含一些遥远的点。
关于椭圆而不是圆形,这可能是由于您的视口在水平和垂直方向上的比例不相同造成的。如果将视口加变换矩阵配置为具有 X=-10..10、Y=-10..10 的视锥体,但实际视口为 X=0..800 和 Y=0..600,例如,比例会有所不同,您的图像就会失真。
解决方案是以下之一:
- 创建方形视口而不是矩形。检查
glViewport()
. 的参数
- 定义一个视图矩阵以考虑您的视口具有的相同比率。您没有显示如何设置 view/world 矩阵,也许您甚至没有使用矩阵...如果是这样,您可能应该使用一个。
我不明白,确切地说,你想要得到什么,但是...... cos()
和 sin()
收到了一个光芒四射的争论;所以,我想你需要的不是 cos(i)
和 sin(i)
,而是 cos((2*rad*i)/360.0))
和 sin((2*rad*i)/360.0))
,或者更简单地说,cos((rad*i)/180.0))
和 cos((rad*i)/180.0))
那么圆心和半径呢?
(x
, y
)应该是圆心吧?
scale
是半径吗?
在这种情况下,我想你应该这样写(注意:未测试)
Vertex vertexData[360];
float rad = 3.14159;
if (mode == Type::CIRCLE) {
for (int i = 0; i < 359; ++i) {
float angle = (rad / 180) * i; // (thanks Rodrigo)
vertexData[i].setPosition(x + scale * cos(angle), y + scale * sin(angle));
}
}
或者,失去精度但避免了一些 moltiplication,
Vertex vertexData[360];
float rad = 3.14159;
float angIncr = rad / 180.0;
if (mode == Type::CIRCLE) {
for (int i = 0, float angle = 0.0; i < 359; ++i, angle += angIncr) {
vertexData[i].setPosition(x + scale * cos(angle), y + scale * sin(angle));
}
}
但是 width
和 heigth
呢?
p.s.: 对不起我的英语不好
--- 根据 Rodrigo 的建议修改 --