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 从水晶球界面转换为FPS风格的相机?_Opengl_Graphics_Camera_Frame Rate - Fatal编程技术网

Opengl 从水晶球界面转换为FPS风格的相机?

Opengl 从水晶球界面转换为FPS风格的相机?,opengl,graphics,camera,frame-rate,Opengl,Graphics,Camera,Frame Rate,我目前有一个水晶球界面相机设置,相机总是看着原点,按下左、右、上、下键只是围绕对象移动 我想改变这一点,使相机可以在3D环境中自由移动 我目前有两个函数,LEFT和UP,它们已经实现为我提到的CB接口 我想让左右键向左/向右扫射,而上/下则上升和下降相机。我到底该如何改变它呢 还有,怎样才能使相机前后移动?我在想拖动鼠标可能等同于向前/向后移动 void Transform::left(float degrees, vec3& eye, vec3& up) { eye = eye

我目前有一个水晶球界面相机设置,相机总是看着原点,按下左、右、上、下键只是围绕对象移动

我想改变这一点,使相机可以在3D环境中自由移动

我目前有两个函数,LEFT和UP,它们已经实现为我提到的CB接口

我想让左右键向左/向右扫射,而上/下则上升和下降相机。我到底该如何改变它呢

还有,怎样才能使相机前后移动?我在想拖动鼠标可能等同于向前/向后移动

void Transform::left(float degrees, vec3& eye, vec3& up) {
eye = eye*rotate(degrees, up);
}


void Transform::up(float degrees, vec3& eye, vec3& up) {
vec3 ortho_axis = glm::cross(eye, up);
ortho_axis = glm::normalize(ortho_axis);

eye = eye*rotate(degrees, ortho_axis);
up = up*rotate(degrees, ortho_axis);
}

基本上扔掉整个代码,重新开始。场景中的摄影机的行为与任何其他对象类似,因此具有位置和方向。(或一个变换矩阵。)只需应用与摄影机变换相反的变换即可

glTransformf(-camera.x, -camera.y, -camera.z);
glRotatef(-camera.angle, camera.axis.x, camera.axis.y, camera.axis.z);
你明白了

我在我的代码中所做的是,因为我有四元数用于旋转,并且将其转换为矩阵或轴&角度非常昂贵,所以我计算相机的正向和向上矢量,并将其输入gluLookAt

Vector3f f = transform(camera.orientation, Vector3f(1, 0, 0));
Vector3f u = transform(camera.orientation, Vector3f(0, 0, 1));
Vector3f p = camera.position;
Vector3f c = p + f;
gluLookAt(p.x, p.y, p.z, c.x, c.y, c.z, u.x, u.y. u.z);

基本上扔掉整个代码,重新开始。场景中的摄影机的行为与任何其他对象类似,因此具有位置和方向。(或一个变换矩阵。)只需应用与摄影机变换相反的变换即可

glTransformf(-camera.x, -camera.y, -camera.z);
glRotatef(-camera.angle, camera.axis.x, camera.axis.y, camera.axis.z);
你明白了

我在我的代码中所做的是,因为我有四元数用于旋转,并且将其转换为矩阵或轴&角度非常昂贵,所以我计算相机的正向和向上矢量,并将其输入gluLookAt

Vector3f f = transform(camera.orientation, Vector3f(1, 0, 0));
Vector3f u = transform(camera.orientation, Vector3f(0, 0, 1));
Vector3f p = camera.position;
Vector3f c = p + f;
gluLookAt(p.x, p.y, p.z, c.x, c.y, c.z, u.x, u.y. u.z);

FPS控件的常见设置是将移动绑定到关键点(左/右扫射、向前/向后移动)并将环视绑定到鼠标(x轴:左/右旋转,y轴:上/下俯仰)


HTH

FPS控件的常见设置是将移动绑定到关键点(左/右扫射、向前/向后移动)并将环视绑定到鼠标(x轴:左/右旋转,y轴:上/下俯仰)


HTH

所以在您发布的代码中,您点引用的相机本身就是一个对象?是的,相机的一般情况是可以像任何其他对象一样在空间中自由移动的相机。我甚至认为它是场景管理结构的一部分(例如,场景图)。要使其成为FPS,您只需将其连接到您的玩家头像。渲染设置对于摄影机的任何行为都是相同的,无论是飞行摄影机、球摄影机还是其他;你所要做的就是在空间中以不同的方式移动相机。我一直不明白为什么大多数教程都会显示特殊情况设置…所以在您发布的代码中,您点引用的相机本身就是一个对象?是的,相机的一般情况是可以像任何其他对象一样在空间中自由移动的相机。我甚至认为它是场景管理结构的一部分(例如,场景图)。要使其成为FPS,您只需将其连接到您的玩家头像。渲染设置对于摄影机的任何行为都是相同的,无论是飞行摄影机、球摄影机还是其他;你所要做的就是在空间中以不同的方式移动相机。我一直不明白为什么大多数教程显示特殊情况设置。。。