понято - вот он - если есть лучший вариант - с удовольствием приму
| Код | void drawPlanet(GLuint texture, GLint orbit, GLfloat fromSun, GLfloat size) { glEnable(GL_TEXTURE_2D); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glBindTexture(GL_TEXTURE_2D, texture); glPushMatrix(); glRotatef((GLfloat)orbit, 0.0, 1.0, 0.0); glTranslatef(fromSun, 0.0, 0.0); glRotatef((GLfloat)day, 0.0, 1.0, 0.0); glRotatef(90.0, 1.0, 0.0, 0.0); drawSphere(size, 20, 16); glPopMatrix(); glDisable(GL_TEXTURE_2D); } . . . float static PI = 3.14159;
void drawPolCaps(float radius, int longitudesNumber, int latitudesNumber);
void drawSphere(float radius, int longitudesNumber, int latitudesNumber) { float angleBetweenLongitudesOnCap = 2.0 * PI / longitudesNumber; float angleBetwLongAndLatOnCap = PI / latitudesNumber; float angleBetwLongAndLatNotOnCap_1; float angleBetwLongAndLatNotOnCap_2; float pointOnZ_1; float pointOnZ_2; float radiusLat_1; float radiusLat_2; float phi; for (int counter_1 = 1; counter_1 <= latitudesNumber - 2; counter_1++) { angleBetwLongAndLatNotOnCap_1 = counter_1 * angleBetwLongAndLatOnCap; angleBetwLongAndLatNotOnCap_2 = (counter_1 + 1) * angleBetwLongAndLatOnCap; pointOnZ_1 = radius * cos(angleBetwLongAndLatNotOnCap_1); pointOnZ_2 = radius * cos(angleBetwLongAndLatNotOnCap_2); radiusLat_1 = radius * sin(angleBetwLongAndLatNotOnCap_1); radiusLat_2 = radius * sin(angleBetwLongAndLatNotOnCap_2); glBegin(GL_TRIANGLE_STRIP); for (int counter_2 = 0; counter_2 <= longitudesNumber; counter_2++) { phi = counter_2 * angleBetweenLongitudesOnCap; glNormal3f(sin(angleBetwLongAndLatNotOnCap_1) * cos(phi), sin(angleBetwLongAndLatNotOnCap_1) * sin(phi), cos(angleBetwLongAndLatNotOnCap_1)); glTexCoord2f(static_cast<float>(counter_2) / longitudesNumber, static_cast<float>(latitudesNumber - 1 - counter_1) / (latitudesNumber - 2)); glVertex3f(radiusLat_1 * cos(phi), radiusLat_1 * sin(phi), pointOnZ_1); glNormal3f(sin(angleBetwLongAndLatNotOnCap_2) * cos(phi), sin(angleBetwLongAndLatNotOnCap_2) * sin(phi), cos(angleBetwLongAndLatNotOnCap_2)); glTexCoord2f(static_cast<float>(counter_2) / longitudesNumber, static_cast<float>(latitudesNumber - 2 - counter_1) / (latitudesNumber - 2)); glVertex3f(radiusLat_2 * cos(phi), radiusLat_2 * sin(phi), pointOnZ_2); } glEnd(); } drawPolCaps(radius, longitudesNumber, latitudesNumber); }
void drawPolCaps(float radius, int longitudesNumber, int latitudesNumber) { float radiusLatitude; float pointOnZ_1; float pointOnZ_2; float phi; float angleBetwLongAndLatOnCap = PI / latitudesNumber; float angleBetweenLongitudesOnCap = 2.0 * PI / longitudesNumber; radiusLatitude = radius * sin(angleBetwLongAndLatOnCap); pointOnZ_1 = radius; pointOnZ_2 = radius * cos(angleBetwLongAndLatOnCap); glBegin(GL_TRIANGLE_FAN); glNormal3f(0.0, 0.0, 1.0); glVertex3f(0.0, 0.0, pointOnZ_1); for (int counter = 0; counter <= longitudesNumber; counter++) { phi = counter * angleBetweenLongitudesOnCap; glNormal3f(sin(angleBetwLongAndLatOnCap) * cos(phi), sin(angleBetwLongAndLatOnCap) * sin(phi), cos(angleBetwLongAndLatOnCap)); glVertex3f(radiusLatitude * cos(phi), radiusLatitude * sin(phi), pointOnZ_2); } glEnd(); radiusLatitude = radius * sin(angleBetwLongAndLatOnCap); pointOnZ_1 = -radius; pointOnZ_2 = -radius * cos(angleBetwLongAndLatOnCap); glBegin(GL_TRIANGLE_FAN); glNormal3f(0.0, 0.0, -1.0); glVertex3f(0.0, 0.0, pointOnZ_1); for (int counter = longitudesNumber; counter >= 0; counter--) { phi = counter * angleBetweenLongitudesOnCap; glNormal3f(sin(angleBetwLongAndLatOnCap) * cos(phi), sin(angleBetwLongAndLatOnCap) * sin(phi), -cos( angleBetwLongAndLatOnCap)); glVertex3f(radiusLatitude * cos(phi), radiusLatitude * sin(phi), pointOnZ_2); } glEnd(); }
|
|