我正在尝试实现一个遵循移动对象的相机。我已经实施了这些功能:
void Camera::espheric_yaw(float degrees, glm::vec3 center_point)
{
float lim_yaw = glm::radians(89.0f);
float radians = glm::radians(degrees);
absoluteYaw += radians;
... clamp absoluteYaw
float radius = 10.0f;
float camX = cos(absoluteYaw) * cos(absoluteRoll) * radius;
float camY = sin(absoluteRoll)* radius;
float camZ = sin(absoluteYaw) * cos(absoluteRoll) * radius;
eyes.x = camX;
eyes.y = camY;
eyes.z = camZ;
lookAt = center_point;
view = glm::normalize(lookAt - eyes);
up = glm::vec3(0, 1, 0);
right = glm::normalize(glm::cross(view, up));
}
我想将此功能(和音高版本(用于遵循移动3D模型的相机。现在,当中心_point为(0,1,0(时,它起作用。我认为我的位置正确,但UP向量显然并不总是(0,1,0(。
如何为相机抬起,查看和正确的向量?然后,如果我以这种方式更新相机的眼睛位置,当另一个对象(以Center_position参数为中心(移动时,我的相机将如何移动?
这个想法是每次我使用centered_value =移动对象中心的鼠标输入时进行更新。然后将glulookat与视图,眼睛和我的相机的值(以及将是眼睛 视图的lookat(。
遵循移动对象之后是将相机指向该对象的问题。这就是典型的lookAt
函数所做的。请参阅此处的数学,然后使用glm::lookAt()
。
"弧球"技术用于用鼠标旋转。在这里查看一些数学。
这个想法是从屏幕上的位置获得两个向量(第一,第二(。对于每个向量,X,Y
都取决于鼠标"旅行"的像素和窗口的大小。Z
通过"轨迹球"数学计算。使用这两个向量(在标准化之后(,其交叉产物在相机坐标中给出了旋转轴,其点产物给出了角度。现在,您可以通过glm::rotate()
如果您走另一个路线(例如,自己计算相机矩阵(,则必须自己更新相机的"向上"方向。请记住,它垂直于相机的其他两个轴。