Не похоже, чтобы кто-то до сих пор обращался к реальной проблеме с вашим исходным кодом, поэтому я подумал, что сделаю это, даже если вопрос довольно старый на данный момент.
Проблема изначально имеладелать с проекцией в отношении радиуса и положения сферы.Я думаю, вы обнаружите, что проблема не слишком сложна.Программа на самом деле работает правильно, просто то, что рисуется, очень трудно увидеть.
Сначала была создана ортогональная проекция с использованием вызова
gluOrtho2D(0.0, 499.0, 0.0, 499.0);
, что "эквивалентно вызову glOrtho с ближним = -1 и дальним = 1."Это означает, что просмотр усеченного имеет глубину 2. Таким образом, сфера с радиусом чего-либо больше 1 (диаметр =2) не будет полностью вписываться в область просмотра.
Затем используются вызовы
glLoadIdentity();
glutSolidSphere(5.0, 20.0, 20.0);
, которые загружают матрицу тождественности матрицы вида модели и затем " [r] вводит сферу, центрированную в начале координат координат моделирования указанного радиуса."Значение, сфера отображается в начале координат, (x, y, z) = (0, 0, 0) и с радиусомиз 5.
Теперь проблема состоит из трех частей:
- Так как окно имеет размер 500x500 пикселей, а ширина и высота области просмотра составляет почти 500 (499,0),малый радиус сферы (5.0) делает только ее проектируемую площадьчуть более одной пятидесятой (2 * 5/499) размера окна в каждом измерении.Это означает, что видимый размер сферы будет примерно 1/2500-й (на самом деле
pi*5^2/499^2
, что ближе к 1/3170-й) всего окна, поэтому может быть трудно увидеть .Это при условии, что весь круг нарисован в пределах области окна.Однако это не так, как мы увидим в пункте 2. - Поскольку область обзора имеет левую плоскость при x = 0 и нижнюю плоскость при y = 0, сфера будет визуализирована с геометрическим центром вв самом нижнем левом углу окна, так что будет виден только один квадрант проецируемой сферы!Это означает, что то, что будет видно, будет еще меньше, примерно 1/10 000-й (на самом деле
pi*5^2/(4*499^2)
, что ближе к 1/12 682-й) от размера окна.Это сделает еще труднее увидеть .Тем более, что сфера отображается так близко к краям / углу экрана, где вы можете и не подумать смотреть. - Поскольку глубина поля зрения значительно меньше диаметра сферы (меньше половины), только осколок сферы будет внутри области просмотра, отображая только эту часть.Таким образом, вы получите больше похожий на полый круг на экране, чем на сплошную сферу / круг.Так получилось, что толщина этого осколка может составлять менее 1 пикселя на экране, что означает, что мы можем даже увидеть ничего на экране, даже если часть сферы действительно находится в пределах области просмотра.
Решение заключается в том, чтобы просто изменить угол обзора и радиус сферы.Например,
gluOrtho2D(-5.0, 5.0, -5.0, 5.0);
glutSolidSphere(5.0, 20, 20);
отображает следующее изображение.
Как видите, вокруг "экватора" видна лишь небольшая частьсфера с радиусом 5. (Я изменил проекцию, чтобы заполнить окно сферой.) Другой пример,
gluOrtho2D(-1.1, 1.1, -1.1, 1.1);
glutSolidSphere(1.1, 20, 20);
отображает следующее изображение.
На изображении выше показано больше сферы внутри усеченной области обзора, но сфера все еще на 0,2 глубины больше, чем усеченная область просмотра.Как видите, «ледяные шапки» сферы отсутствуют как на севере, так и на юге.Итак, если мы хотим, чтобы вся сфера вписывалась в усеченный зрачок с глубиной 2, мы должны сделать радиус меньше или равным 1.
gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
glutSolidSphere(1.0, 20, 20);
отображает следующее изображение.
Надеюсь, это кому-то помогло.Береги себя!