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 C++ +设置中心旋转_C++_Opengl_Rotation - Fatal编程技术网

旋转相机OpenGL C++ +设置中心旋转

旋转相机OpenGL C++ +设置中心旋转,c++,opengl,rotation,C++,Opengl,Rotation,Opengl始终围绕0,0,0旋转。但我需要绕着摄像机转。 我知道在GL中没有摄影机,但如果我转换回0,0,-6.0,它会绕着0,0,0旋转,而不是绕着0,0,-6.0旋转 所以我的问题是:如何在opengl和c中设置旋转中心++ 我已经找到了这个帖子: 在显示此解决方案的地方: 旋转函数通常围绕原点旋转。轮换 在另一点P附近,您必须: translate-P旋转translateP 我现在不知道该如何实现 翻译 因为在旋转之后,平移是相对于旋转的 例如: 我想绕着1,1,1旋转。我翻译-1,-

Opengl始终围绕0,0,0旋转。但我需要绕着摄像机转。 我知道在GL中没有摄影机,但如果我转换回0,0,-6.0,它会绕着0,0,0旋转,而不是绕着0,0,-6.0旋转

所以我的问题是:如何在opengl和c中设置旋转中心++

我已经找到了这个帖子:

在显示此解决方案的地方:

旋转函数通常围绕原点旋转。轮换 在另一点P附近,您必须: translate-P旋转translateP

我现在不知道该如何实现

翻译

因为在旋转之后,平移是相对于旋转的

例如: 我想绕着1,1,1旋转。我翻译-1,-1,-1。现在我绕x轴旋转90度。是的。但现在我得把它翻译回去。如果我平移1,1,1,它将不起作用,因为它现在已旋转,并且移动是相对于旋转的矩阵的

附言:我不想用gluLookAt

所以我的代码是:

//set rotation to zero
glRotatef(-yr,0.0f,1.0f,0.0f);  
glRotatef(-xr,1.0f,0.0f,0.0f);
//set points relative to camera
glTranslatef(cam_pos[0],cam_pos[1],cam_pos[2]);
//rotate back
glRotatef(yr,0.0f,1.0f,0.0f);   
glRotatef(xr,1.0f,0.0f,0.0f);
//rotate
glRotatef(angley,0.0f,1.0f,0.0f);   
glRotatef(anglex,1.0f,0.0f,0.0f);
//and now, how to translate back,
//movement is relative to the cam ?
//I would simply use :  
//glTranslatef(-cam_pos[0],-cam_pos[1],-cam_pos[2]);
//which wont work because its relative to the new rotation.

非常感谢您的帮助

所以,我实际上发现运动与旋转无关,这使得一切都很容易实现。 代码:


谢谢@derhass,他告诉我这是倒退。

你说的根本不是真的,即使是用黑体字写的,而且是第二次问。你的数学倒过来了,对GL的矩阵堆栈的工作原理有一些误解。我建议你读一本关于线性代数的好书。而且,我建议你也放弃你试图在这里使用的这个可怕的过时的GL。如果我能找到回去的方法,我可以让它工作。这是我唯一的问题。你可以把它向后移动一点,只是方向不对,中间有奇怪的复位旋转。实际上,在旋转之前不会移动它。就像我说的,你的数学倒过来了。好的,谢谢你的建议
glTranslatef(point_to_rotate_around_x,point_to_rotate_around_y,point_to_rotate_around_z);
glRotatef(anglex,1,0,0);
glRotatef(angley,0,1,0);
glTranslatef(-point_to_rotate_around_x,-point_to_rotate_around_y,-point_to_rotate_around_z);