void TPCamera::update() { look = glm::vec3(character->getPosition().x, height, character->getPosition().y); glm::vec3 newEye(character->getPosition().x - character->getFacing().x*3.7, height + 1.0, character->getPosition().y - character->getFacing().y*3.7); newEye = checkCollisionWithSquares(newEye, houseLocations, houseWidth / 2); newEye = checkCollisionWithSquares(newEye, treeLocations, treeRadius); eye = newEye; }
/********************************** now i use the first 4 cameras to update the view, because these 4 cameras locate in the same side. void gluLookAt( GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ, GLdouble centerX, GLdouble centerY, GLdouble centerZ, GLdouble upX, GLdouble upY, GLdouble upZ); 第一组eyex, eyey,eyez 相机在世界坐标的位置 第二组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置 第三组upx,upy,upz 相机向上的方向在世界坐标中的方向 你把相机想象成为你自己的脑袋: 第一组数据就是脑袋的位置 第二组数据就是眼睛看的物体的位置 第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)。 **********************************/ void ThreeDWidget::UpdateView() { int minCamera = _numCameras > 4 ? 4 : _numCameras; Vector3f newEye(0, 0, 0); Vector3f newCenter(0, 0, 0); for(int i = 0; i < minCamera; i++) { newEye += _cameraCenters[i]; } newEye(0, 0) = newEye(0, 0) / minCamera * 3; newEye(1, 0) /= newEye(1, 0) / minCamera * 3; newEye(2, 0) = newEye(2, 0) / minCamera * 3; newCenter(1, 0) = newEye(1, 0) / 2; //set view _eye.x = newEye(0, 0); _eye.y = newEye(1, 0); _eye.z = newEye(2, 0); _center.x = newCenter(0, 0); _center.y = newCenter(1, 0); _center.z = newCenter(2, 0); }