void GameLoop(HWND hwnd) { render_context->ClearFrameBuffer(); static Mat4f mrot; // general rotation matrix static float x_ang = 0.0f, y_ang = 0.2f, z_ang = 0.0f; //每秒执行60次部分 if (timer.Elapsed() - updateTimer > updateTick) { updateTimer = updateTimer + updateTick; // reset angles //x_ang = 0.0f; if (KEY_DOWN(VK_UP)) obj.world_pos.z = obj.world_pos.z - 0.5f; if (KEY_DOWN(VK_DOWN)) obj.world_pos.z = obj.world_pos.z + 0.5f; /*if (KEY_DOWN(VK_LEFT)) x_ang = 0.2f; if (KEY_DOWN(VK_RIGHT)) x_ang = -0.2f;*/ } //尽快执行部分 { // 重设剔除、裁剪、隐面标志位 obj.Reset(); // 产生绕三轴旋转矩阵 mrot = Mat4f::Rotation(x_ang, y_ang, z_ang); // 直接对局部坐标变换,存入局部坐标 obj.Transform(mrot, TRANSFORM_LOCAL_ONLY, 1); // 模型坐标到世界坐标变换 obj.ModelToWorld(); // 建立相机变换矩阵,此例中一般为单位矩阵 //cam.BuildMatrixEuler(CAM_ROT_SEQ_ZYX); // 执行隐面剔除 obj.RemoveBackFaces(cam); // 世界坐标到相机坐标变换 obj.WorldToCamera(cam); //获得三角形的法向量 obj.GetTriangleNormal(); // 相机坐标投影变换 obj.CameraToPerspective(cam); obj.ClipUDLR(); // 投影坐标到屏幕坐标 obj.PerspectiveToScreen(cam); // 光照纹理方式绘制 obj.DrawPlane(render_context, WINDOW_WIDTH); window_hdc = GetDC(hwnd); SelectObject(buffer_hdc, now_bitmap); BitBlt(window_hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, buffer_hdc, 0, 0, SRCCOPY); ReleaseDC(hwnd, window_hdc); } //每秒执行1次部分 frames++; if (timer.Elapsed() - elapsed > 1.0f) { elapsed += 1.0f; cout << frames << "fps" << endl; frames = 0; } }