Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用OpenGL的第三人称视图_Opengl_Matrix_Graphics_Camera_Transformation - Fatal编程技术网

使用OpenGL的第三人称视图

使用OpenGL的第三人称视图,opengl,matrix,graphics,camera,transformation,Opengl,Matrix,Graphics,Camera,Transformation,我整天都在绞尽脑汁想让它工作起来 我在VisualStudio中使用OpenGL制作了一个播放器可以驾驶的车辆。当然,相机应该在上面和后面保持固定的距离 我想我可以在自己的局部y轴上旋转摄像头,以匹配车辆的旋转,然后围绕车辆的y轴旋转摄像头。(就像它绕着飞行器运行一样)但是它产生了很多不可预测的影响。我有第一个旋转工作,第二个,围绕着车辆,这导致了问题。以下是相关位: mat4 view = identity_mat4(); mat4 vehicle = identity_mat4(); ve

我整天都在绞尽脑汁想让它工作起来

我在VisualStudio中使用OpenGL制作了一个播放器可以驾驶的车辆。当然,相机应该在上面和后面保持固定的距离

我想我可以在自己的局部y轴上旋转摄像头,以匹配车辆的旋转,然后围绕车辆的y轴旋转摄像头。(就像它绕着飞行器运行一样)但是它产生了很多不可预测的影响。我有第一个旋转工作,第二个,围绕着车辆,这导致了问题。以下是相关位:

mat4 view = identity_mat4();
mat4 vehicle = identity_mat4();

vehicle = translate(vehicle, vec3(x_position, 0.f, z_position)); // User input values

view = rotate_about_y(vec3(0.f, 0.f, 0.f), view, y_rotation); // Rotate camera , this works
// view = rotate_about_y(vec3(x_position, 0.f, z_position), view, y_rotation); // Stay behind vehicle
glUniformMatrix4fv(view_mat_location, 1, GL_FALSE, view.m);

glUniformMatrix4fv(matrix_location, 1, GL_FALSE, tank_global.m);
这是我绕点旋转的方法。我意识到我最有可能要做的是——调整这个方法,这样我就可以给它任何点,而不仅仅是原点,它会绕着它旋转。你可以在“中心”向量中看到我最近尝试的证据


或者可能有一种完全不同的更好的方法来实现这一点?

旋转可能会变得复杂-通常更容易处理点。您能否编写一个函数,用于获取相机位置和正确定位相机的目标点?计算汽车后面的位置,并将摄像机对准汽车。@orlp我之前实际上试图使用y_旋转变量的sin/cos,这也给我带来了麻烦。我想这会容易些/我建议采用与orlp类似的策略——不要用这种“旋转然后向后平移”的方式,试着用点来找到/制作一种方法——摄像机位置和注视目标。这应该很容易单独测试,以确保它正常工作,如果它正常工作,那么在您的软件库中解决这类问题应该会容易得多——至少在您对转换和矩阵更熟悉之前,以避免花费太多时间调试这类事情。
mat4 rotate_about_y(vec3 center, mat4 in, float deg)
{
    vec3 returnToPoint = vec3(in.m[12], in.m[13], in.m[14]);
    vec3 toOrigin = center - vec3(in.m[12], in.m[13], in.m[14]);
    in = translate(in, toOrigin);
    in = rotate_y_deg(in, deg);
    in = translate(in, returnToPoint);
    return in;
}