/////////////////////////////////////////////////////////////////////////////////////////////////////// // Create a matrix that maps geometry to the screen. 1 unit in the x direction equals one pixel // of width, same with the y direction. // It also depends on the size of the texture being displayed void GenerateOrtho2DMat(GLuint windowWidth, GLuint windowHeight, GLuint imageWidth, GLuint imageHeight) { float right = (float)windowWidth; float quadWidth = right; float left = 0.0f; float top = (float)windowHeight; float quadHeight = top; float bottom = 0.0f; float screenAspect = (float)windowWidth/windowHeight; float imageAspect = (float)imageWidth/imageHeight; if (screenAspect > imageAspect) quadWidth = windowHeight*imageAspect; else quadHeight = windowWidth*imageAspect; // set ortho matrix orthoMatrix[0] = (float)(2 / (right - left)); orthoMatrix[1] = 0.0; orthoMatrix[2] = 0.0; orthoMatrix[3] = 0.0; orthoMatrix[4] = 0.0; orthoMatrix[5] = (float)(2 / (top - bottom)); orthoMatrix[6] = 0.0; orthoMatrix[7] = 0.0; orthoMatrix[8] = 0.0; orthoMatrix[9] = 0.0; orthoMatrix[10] = (float)(-2 / (1.0 - 0.0)); orthoMatrix[11] = 0.0; orthoMatrix[12] = -1*(right + left) / (right - left); orthoMatrix[13] = -1*(top + bottom) / (top - bottom); orthoMatrix[14] = -1.0f; orthoMatrix[15] = 1.0; // set screen quad vertex array screenQuad.Reset(); screenQuad.Begin(GL_TRIANGLE_STRIP, 4, 1); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 0.0f, 0.0f); screenQuad.Vertex3f(0.0f, 0.0f, 0.0f); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 1.0f, 0.0f); screenQuad.Vertex3f(quadWidth, 0.0f, 0.0f); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 0.0f, 1.0f); screenQuad.Vertex3f(0.0f, quadHeight, 0.0f); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 1.0f, 1.0f); screenQuad.Vertex3f(quadWidth, quadHeight, 0.0f); screenQuad.End(); }
/////////////////////////////////////////////////////////////////////////////////////////////////////// // Create a matrix that maps geometry to the screen. 1 unit in the x directionequals one pixel // of width, same with the y direction. // void GenerateOrtho2DMat(GLuint imageWidth, GLuint imageHeight) { float right = (float)imageWidth; float quadWidth = right; float left = 0.0f; float top = (float)imageHeight; float quadHeight = top; float bottom = 0.0f; // set ortho matrix orthoMatrix[0] = (float)(2 / (right)); orthoMatrix[1] = 0.0; orthoMatrix[2] = 0.0; orthoMatrix[3] = 0.0; orthoMatrix[4] = 0.0; orthoMatrix[5] = (float)(2 / (top)); orthoMatrix[6] = 0.0; orthoMatrix[7] = 0.0; orthoMatrix[8] = 0.0; orthoMatrix[9] = 0.0; orthoMatrix[10] = (float)(-2 / (1.0 - 0.0)); orthoMatrix[11] = 0.0; orthoMatrix[12] = -1.0f; orthoMatrix[13] = -1.0f; orthoMatrix[14] = -1.0f; orthoMatrix[15] = 1.0; // set screen quad vertex array screenQuad.Reset(); screenQuad.Begin(GL_TRIANGLE_STRIP, 4, 1); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 0.0f, 0.0f); screenQuad.Vertex3f(0.0f, 0.0f, 0.0f); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 1.0f, 0.0f); screenQuad.Vertex3f(right, 0.0f, 0.0f); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 0.0f, 1.0f); screenQuad.Vertex3f(0.0f, top, 0.0f); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 1.0f, 1.0f); screenQuad.Vertex3f(right, top, 0.0f); screenQuad.End(); }
/////////////////////////////////////////////////////////////////////////////////////////////////////// // Create a matrix that maps geometry to the screen. 1 unit in the x directionequals one pixel // of width, same with the y direction. void gltGenerateOrtho2DMat(GLuint screenWidth, GLuint screenHeight, M3DMatrix44f &orthoMatrix, GLBatch &screenQuad) { float right = (float)screenWidth; float left = 0.0f; float top = (float)screenHeight; float bottom = 0.0f; // set ortho matrix orthoMatrix[0] = (float)(2 / (right - left)); orthoMatrix[1] = 0.0; orthoMatrix[2] = 0.0; orthoMatrix[3] = 0.0; orthoMatrix[4] = 0.0; orthoMatrix[5] = (float)(2 / (top - bottom)); orthoMatrix[6] = 0.0; orthoMatrix[7] = 0.0; orthoMatrix[8] = 0.0; orthoMatrix[9] = 0.0; orthoMatrix[10] = (float)(-2 / (1.0 - 0.0)); orthoMatrix[11] = 0.0; orthoMatrix[12] = -1*(right + left) / (right - left); orthoMatrix[13] = -1*(top + bottom) / (top - bottom); orthoMatrix[14] = -1.0f; orthoMatrix[15] = 1.0; // set screen quad vertex array screenQuad.Reset(); screenQuad.Begin(GL_TRIANGLE_STRIP, 4, 1); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 0.0f, 0.0f); screenQuad.Vertex3f(0.0f, 0.0f, 0.0f); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 1.0f, 0.0f); screenQuad.Vertex3f((float)screenWidth, 0.0f, 0.0f); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 0.0f, 1.0f); screenQuad.Vertex3f(0.0f, (float)screenHeight, 0.0f); screenQuad.Color4f(0.0f, 1.0f, 0.0f, 1.0f); screenQuad.MultiTexCoord2f(0, 1.0f, 1.0f); screenQuad.Vertex3f((float)screenWidth, (float)screenHeight, 0.0f); screenQuad.End(); }
void CreateSphere(float xShift, float yShift, float zShift) { float radius = 50.0f * scale; float diameter = radius * 2; GLfloat x, z; M3DVector3f* bodyVertices = new M3DVector3f[sphereArraySize * 2]; M3DVector4f* bodyColors = new M3DVector4f[sphereArraySize * 2]; m3dLoadVector3(bodyVertices[0], xShift, radius - diameter/tesselation + yShift, zShift); m3dLoadVector3(bodyVertices[1], 0.0f + xShift, radius - 2*diameter/tesselation + yShift, zShift); m3dLoadVector4(bodyColors[0], 0.91f, 0.70f, 0.54f, 1.0f); m3dLoadVector4(bodyColors[1], 0.91f, 0.70f, 0.54f, 1.0f); int i = 1; int colorIndex = 0; // Kugel vertikal entlang der Breitengrade durchlaufen for (GLfloat latitude = 0.0f; latitude <= GL_PI; latitude += (GL_PI / tesselation)) { float sliceRadius = radius * sin(latitude); GLfloat y = radius * cos(latitude) + yShift; // Kugelscheibe entlang der Laengengrade durchlaufen for (GLfloat longitude = 0.0f; longitude <= (2.0f*GL_PI); longitude += (GL_PI / tesselation)) { float upperRadius = sliceRadius; float lowerRadius = radius * sin(latitude + (GL_PI / tesselation)); x = cos(longitude); z = sin(longitude); m3dLoadVector3(bodyVertices[2 * i], x*upperRadius + xShift, y, z*upperRadius + zShift); m3dLoadVector3(bodyVertices[2 * i + 1], x*lowerRadius + xShift, radius * cos(latitude + GL_PI/tesselation), z*lowerRadius + zShift); //fuer Abgabe einkommentieren :) //if (colorIndex % 2 == 0) { // m3dLoadVector4(bodyColors[2 * i], 1.0f, 0.8f, 0.2f, 1.0f); // m3dLoadVector4(bodyColors[2 * i + 1], 1.0f, 0.8f, 0.2f, 1.0f); //} //else { // m3dLoadVector4(bodyColors[2 * i], 0.235f, 0.235f, 0.235f, 1.0f); // m3dLoadVector4(bodyColors[2 * i + 1], 0.235f, 0.235f, 0.235f, 1.0f); //} // fuer Maennchen einkommentieren :) m3dLoadVector4(bodyColors[2 * i], 0.91f, 0.70f, 0.54f, 1.0f); m3dLoadVector4(bodyColors[2 * i + 1], 0.91f, 0.70f, 0.54f, 1.0f); i++; } colorIndex++; } sphereBody.Reset(); sphereBody.Begin(GL_TRIANGLE_STRIP, sphereArraySize); sphereBody.CopyVertexData3f(bodyVertices); sphereBody.CopyColorData4f(bodyColors); sphereBody.End(); delete[] bodyVertices; delete[] bodyColors; }