GLUSvoid GLUSAPIENTRY glusQuaternionRotateRzf(GLUSfloat quaternion[4], const GLUSfloat angle) { GLUSfloat halfAngleRadian = glusMathDegToRadf(angle) * 0.5f; quaternion[0] = 0.0f; quaternion[1] = 0.0f; quaternion[2] = sinf(halfAngleRadian); quaternion[3] = cosf(halfAngleRadian); }
GLUSvoid GLUSAPIENTRY glusQuaternionRotatef(GLUSfloat quaternion[4], const GLUSfloat angle, const GLUSfloat x, const GLUSfloat y, const GLUSfloat z) { GLUSfloat halfAngleRadian = glusMathDegToRadf(angle) * 0.5f; GLUSfloat s = sinf(halfAngleRadian); GLUSfloat normalized[3] = { x, y, z }; glusVector3Normalizef(normalized); quaternion[0] = normalized[0] * s; quaternion[1] = normalized[1] * s; quaternion[2] = normalized[2] * s; quaternion[3] = cosf(halfAngleRadian); }
GLUSboolean update(GLUSfloat time) { static GLfloat angle = 0.0f; GLfloat angleRadians; GLfloat viewProjectionMatrix[16]; GLfloat viewMatrix[16]; GLfloat modelMatrix[16]; GLfloat normalMatrix[9]; GLfloat camera[4] = {0.0, 0.0, 0.0, 1.0}; angleRadians = glusMathDegToRadf(angle); camera[0] = g_circleRadius * -sinf(angleRadians); camera[2] = g_circleRadius * cosf(angleRadians); // Circle with the camera around the origin by looking at it. glusMatrix4x4LookAtf(viewMatrix, camera[0], 0.0f, camera[2], 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); glusMatrix4x4Multiplyf(viewProjectionMatrix, g_projectionMatrix, viewMatrix); glusMatrix4x4Identityf(modelMatrix); glusMatrix4x4Translatef(modelMatrix, 0.0f, -0.5f, 0.0f); glusMatrix4x4RotateRxf(modelMatrix, 45.0f); glusMatrix4x4ExtractMatrix3x3f(normalMatrix, modelMatrix); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // // First render the background. glUseProgram(g_programBackground.program); glUniformMatrix4fv(g_viewProjectionMatrixBackgroundLocation, 1, GL_FALSE, viewProjectionMatrix); glUniformMatrix4fv(g_modelMatrixBackgroundLocation, 1, GL_FALSE, modelMatrix); glBindVertexArray(g_vaoBackground); glFrontFace(GL_CW); glDrawElements(GL_TRIANGLES, g_numberIndicesBackground, GL_UNSIGNED_INT, 0); // Now render the sphere. glUseProgram(g_program.program); glUniformMatrix4fv(g_viewProjectionMatrixLocation, 1, GL_FALSE, viewProjectionMatrix); glUniformMatrix4fv(g_modelMatrixLocation, 1, GL_FALSE, modelMatrix); glUniformMatrix3fv(g_normalMatrixLocation, 1, GL_FALSE, normalMatrix); glUniform4fv(g_cameraLocation, 1, camera); glBindVertexArray(g_vao); glFrontFace(GL_CCW); glDrawElements(GL_TRIANGLES, g_numberIndicesSphere, GL_UNSIGNED_INT, 0); // Increase the angle 30 degree per second. angle += 30.0f * time; return GLUS_TRUE; }