/// // Update a triangle using the shader pair created in Init() // static void Update ( ESContext *esContext, float deltaTime) { UserData *userData = (UserData*) esContext->userData; ESMatrix perspective; ESMatrix modelview; float aspect; // Compute a rotation angle based on time to rotate the cube userData->angle += 1;//( deltaTime * 40.0f ); if( userData->angle >= 360.0f ) userData->angle -= 360.0f; // Compute the window aspect ratio aspect = 1;//(GLfloat) esContext->width / (GLfloat) esContext->height; // Generate a perspective matrix with a 60 degree FOV esMatrixLoadIdentity( &perspective ); esPerspective( &perspective, 50.0f, aspect, 1.0f, 20.0f ); // Generate a model view matrix to rotate/translate the cube esMatrixLoadIdentity( &modelview ); // Translate away from the viewer esTranslate( &modelview, 0.0, 0.0, -2.0 ); esScale( &modelview,.2,.2,.2); // Rotate the cube esRotate( &modelview, userData->angle, .0, 1.0, .0 ); // Compute the final MVP by multiplying the modevleiw and perspective matrices together esMatrixMultiply( &userData->mvpMatrix, &modelview, &perspective ); #if 1 userData->normalMatrix = processNormalMatrix(modelview); #else // Normal Matrix // Transform normals from object-space to eye-space bool invertible; GLKMatrix3 normalMatrix = GLKMatrix4GetMatrix3(GLKMatrix4InvertAndTranspose(modelViewMatrix, &invertible)); if(!invertible) NSLog(@"MV matrix is not invertible"); glUniformMatrix3fv(self.phongShader.uNormalMatrix, 1, 0, normalMatrix.m); #endif }
JNIEXPORT void JNICALL Java_org_nzdis_example03_GLESView_mySurfaceChanged (JNIEnv *env, jclass c, jint width, jint height) { glViewport(0, 0, width, height); aspect = (float)width / (float)height; // Generate a perspective matrix with a 60 degree FOV esMatrixLoadIdentity(&perspective); //LOGI("%f %d %d", aspect, width, height); esPerspective(&perspective, 60.0f, aspect, 1.0f, 30.0f); esTranslate(&perspective, 0.0f, 0.0f, -5.0f); //esRotate(&perspective, 45.0f, 1.0f, 0.0f, 0.0f); //esRotate(&perspective, -5.0f, 0.0f, 1.0f, 0.0f); origin.init(width, height); sphere.init(width, height); terrain.init(width, height); }
//+----------------------------------------------------------------------------- //| Renders the geoset //+----------------------------------------------------------------------------- VOID MODEL_GEOSET::Render(CONST SEQUENCE_TIME& time, BOOL Animated) { BuildMesh(); glUseProgram(Graphics.Program()); ESMatrix modelviewMatrix; ESMatrix perspectiveMatrix; ESMatrix mvpMatrix; int aspect; aspect = (GLfloat) 600 / (GLfloat) 800; esMatrixLoadIdentity(&perspectiveMatrix); esPerspective(&perspectiveMatrix, 60.0f, aspect, 1.0f, 20.0f); esMatrixLoadIdentity(&modelviewMatrix); esScale(&modelviewMatrix, 1.0f, 1.0f, 1.0f); esTranslate(&modelviewMatrix, 0.0f, 0.0f, 0.0f); static float angle = 0.0f; esRotate(&modelviewMatrix,angle, 1.0f, 0.0f, 0.0f); angle += 0.2f; esMatrixLoadIdentity(&mvpMatrix); esMatrixMultiply(&mvpMatrix, &modelviewMatrix, &perspectiveMatrix); glUniformMatrix4fv(Graphics.WVPMatrix(), 1, GL_FALSE, (GLfloat*) mvpMatrix.m); glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE0); glActiveTexture(GL_TEXTURE0); glEnableVertexAttribArray(Graphics.Position()); glEnableVertexAttribArray(Graphics.TexturePosition()); glUniform1i(Graphics.Texture(), 0); glVertexAttribPointer(Graphics.Position(), 3, GL_FLOAT, GL_FALSE, sizeof(FLOAT) * 3, vertices); glVertexAttribPointer(Graphics.TexturePosition(), 2, GL_FLOAT, GL_FALSE, 2 * sizeof(FLOAT), TexturePositions); glDrawElements(GL_TRIANGLES, GeosetData.FaceContainer.GetTotalSize() * 3, GL_UNSIGNED_INT, indices); glDisable(GL_TEXTURE_2D); glDisable(GL_TEXTURE0); glDisableVertexAttribArray(Graphics.TexturePosition()); glDisableVertexAttribArray(Graphics.Texture()); }
//固定不变的矩阵 void SetFixedMatrix(GLContext *_context) { UserData *_user = (UserData*)_context->userObject; Size _size = _context->getWinSize(); esPerspective(&_user->projMatrix, 50.0f, _size.width / _size.height, 1.0f, 100.0f); // esOrtho(&_user->projMatrix, -4.0f, 4.0f, -4.0f, 4.0f, 0.0f, 8.0f); //光源的视野 // esMatrixLookAt(&_user->viewMatrix, &GLVector3(4.0f, 2.5f, -4.0f), &GLVector3(0.0f, 0.0f, -4.0f), &GLVector3(0.0f, 1.0f, 0.0f)); esMatrixLookAt(&_user->viewMatrix, &GLVector3(2.3f, 2.5f, -4.0f), &GLVector3(2.0f, 0.0f, -4.0f), &GLVector3(0.0f, 1.0f, 0.0f)); //光线的方向 ESMatrix3 trunkMatrix; esMatrixTrunk(&trunkMatrix, &_user->viewMatrix); _user->lightVector = esMatrixMultiplyVector3(&GLVector3(2.3f - 2.0f, 2.5f - 0.0f, -4.0f + 4.0f), &trunkMatrix);// normalize(&GLVector3(2.3f - 2.0f, 2.5f - 0.0f, -4.0f + 4.0f)); _user->lightVector = normalize(&_user->lightVector); ESMatrix identity; ///////////////////地面////////////////// //旋转 esRotate(&_user->lightGroundMatrix, -90.0f, 1.0f, 0.0f, 0.0f); //平移 esTranslate(&_user->lightGroundMatrix, 0.0f, -1.0f, -4.0f); //视图矩阵 esMatrixMultiply(&_user->lightGroundMatrix, &_user->lightGroundMatrix, &_user->viewMatrix); //获取法线矩阵 esMatrixTrunk(&_user->normalGroundMatrix, &_user->lightGroundMatrix); GLVector3 rotatevector = esMatrixMultiplyVector3(&GLVector3(0.0f, 0.0f, 1.0f), &_user->normalGroundMatrix); esMatrixMultiply(&_user->lightGroundMatrix, &_user->lightGroundMatrix, &_user->projMatrix); //////////////////// //旋转 esRotate(&_user->eyeGroundMatrix, -90.0f, 1.0f, 0.0f, 0.0f); //平移 esTranslate(&_user->eyeGroundMatrix, 0.0f, -1.0f, -4.0f); //视图矩阵 esMatrixLookAt(&_user->eyeViewMatrix, &GLVector3(0.0f, 1.0f, 0.0f), &GLVector3(0.0f, 0.0f, -8.0f), &GLVector3(0.0f, 1.0f, 0.0f)); esMatrixMultiply(&_user->eyeGroundMatrix, &_user->eyeGroundMatrix, &_user->eyeViewMatrix); //MVP矩阵 esMatrixMultiply(&_user->eyeGroundMatrix, &_user->eyeGroundMatrix, &_user->projMatrix); }