我一直在尝试使用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 ++和本网站都很新。
答案 0 :(得分:2)
如果不自行测试代码很难确定,但无论如何我都会猜测。
您的奇怪行可能是由于缓冲区未完全初始化造成的。这是错的:
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()
。答案 1 :(得分:0)
我完全不明白你想要获得的东西,但...... 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:抱歉我的英语不好。
---根据罗德里戈的建议修改 -