Ваша проблема с отображением сферы, скорее всего, связана с тем, как вы заполняете массив координат `buf` и с тем, как вы используете переменную `count`. Давайте рассмотрим ваш код и исправим его.
Сначала разберем вашу формулу для координат сферы. Вы используете сферические координаты, где:
- `x = r * sin(φ) * cos(θ)`
- `y = r * sin(φ) * sin(θ)`
- `z = r * cos(φ)`
где `φ` (phi) — это полярный угол (от 0 до π), а `θ` (theta) — это азимутальный угол (от 0 до 2π).
### Исправление кода
1. Вам нужно корректно заполнять массив `buf`. В текущем коде вы каждый раз перезаписываете его с данными `arr1`, в результате у вас получаются только последние координаты. Вместо этого вам нужно поочередно заполнять его.
2. Переменная `count` должна быть использована для индексации массива `buf`, а не для этапа подсчета.
3. Можно упростить использование `std::copy` и не выделять отдельный массив `arr1`.
Вот исправленный код:
```cpp
GLfloat *buf = new GLfloat[197820 * 9];
GLfloat x, y, z, r = 0.5;
int count = 0;
for (GLfloat i = 0; i <= 3.14; i += 0.01) {
for (GLfloat j = 0; j <= 2.0 * 3.14; j += 0.01) {
x = r * (GLfloat)sin(i) * (GLfloat)cos(j);
y = r * (GLfloat)sin(i) * (GLfloat)sin(j);
z = r * (GLfloat)cos(i);
// Здесь мы заполняем buf
buf[count * 9] = x; // X
buf[count * 9 + 1] = y; // Y
buf[count * 9 + 2] = z; // Z
buf[count * 9 + 3] = 1.0; // R
buf[count * 9 + 4] = 0.0; // G
buf[count * 9 + 5] = 0.0; // B
buf[count * 9 + 6] = 1.0; // A
buf[count * 9 + 7] = 0.0; // S
buf[count * 9 + 8] = 0.0; // T
count++;
}
}
std::cout << "count: " << count << std::endl;
f->glDrawArrays(GL_POINTS, 0, count);
```
### Важные моменты:
1. Мы используем `count` для правильного индексации массива `buf`.
2. Мы увеличиваем диапазон `i` с небольшим шагом для получения более плотного представления сферы.
3. Убедитесь, что у вас достаточно места в массиве `buf` и что он был правильно инициализирован для заданного количества точек. В вашем коде вы выделяете память для 197820 точек, но не забудьте проверить, что `count` не превышает это значение.
4. Возможно, в вашей системе также необходимо переключить режим глубины, чтобы правильно отображались все точки.
Теперь, запустив этот исправленный код, вы должны увидеть, что рисуется не просто точка, а сфера.