[英]Drawing a circle in c++ using openGL
我一直在尝试使用openGL在c ++中画一个圆。 到目前为止,我有一个压缩圆圈,它只有一条随机的线穿过屏幕 。 这是我用来获得此形状的功能。
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()
参数。 我不确切地知道您想要获得什么,但是... cos()
和sin()
收到一个光辉的参数; 所以,不是cos(i)
和sin(i)
,我想你需要cos((2*rad*i)/360.0))
和sin((2*rad*i)/360.0))
或semplified, 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));
}
}
或者,失去精确度,但避免一些赘肉,
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
呢?
ps:对不起,我的英语不好。
---根据Rodrigo的建议进行了修改-
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.