使用 OpenGL 和 gluLookAt 围绕球体旋转
Rotating around a sphere using OpenGL and gluLookAt
好吧,所以我尝试使用 C++ 和 OpenGL 单击并拖动以围绕对象旋转。我拥有它的方法是使用 gluLookAt 以原点为中心,我通过使用球体的参数方程来获得眼睛的坐标(eyex = 2* cos(theta) * sin(phi); eyey = 2* sin(theta) * sin(phi); eyez = 2* cos(phi);)。这主要有效,因为我可以水平单击和旋转,但是当我尝试垂直旋转时,它会形成紧密的圆圈而不是垂直旋转。我试图通过使用相机的位置和一个沿 x-z 平面成 90 度角的 vecter 并取其交叉乘积来获取向上矢量。我拥有的代码如下:
double dotProduct(double v1[], double v2[]) {
return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2];
}
void mouseDown(int button, int state, int x, int y) {
if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN ) {
xpos = x;
ypos = y;
}
}
void mouseMovement(int x, int y) {
diffx = x - xpos;
diffy = y - ypos;
xpos = x;
ypos = y;
}
void camera (void) {
theta += 2*PI * (-diffy/glutGet(GLUT_SCREEN_HEIGHT));
phi += PI * (-diffx/glutGet(GLUT_WINDOW_WIDTH));
eyex = 2* cos(theta) * sin(phi);
eyey = 2* sin(theta) * sin(phi);
eyez = 2* cos(phi);
double rightv[3], rightt[3], eyes[3];
rightv[0] = 2* cos(theta + 2/PI) * sin(phi);
rightv[1] = 0;
rightv[2] = 2* cos(phi);
rightt[0] = rightv[0];
rightt[1] = rightv[1];
rightt[2] = rightv[2];
rightv[0] = rightv[0] / sqrt(dotProduct(rightt, rightt));
rightv[1] = rightv[1] / sqrt(dotProduct(rightt, rightt));
rightv[2] = rightv[2] / sqrt(dotProduct(rightt, rightt));
eyes[0] = eyex;
eyes[1] = eyey;
eyes[2] = eyez;
upx = (eyey/sqrt(dotProduct(eyes,eyes)))*rightv[2] + (eyez/sqrt(dotProduct(eyes,eyes)))*rightv[1];
upy = (eyez/sqrt(dotProduct(eyes,eyes)))*rightv[0] + (eyex/sqrt(dotProduct(eyes,eyes)))*rightv[2];
upz = (eyex/sqrt(dotProduct(eyes,eyes)))*rightv[1] + (eyey/sqrt(dotProduct(eyes,eyes)))*rightv[0];
diffx = 0;
diffy = 0;
}
我在某种程度上基于此,但它不起作用,所以我尝试了我的方式。
这并不完全是你这样做的方式的解决方案,但我前几天做了类似的事情。我通过使用DX的D3DXMatrixRotationAxis
和D3DXVec3TransformCoord
D3DXMatrixRotationAxis
方法背后的数学可以在以下页面的底部找到:D3DXMatrixRotationAxis Math 如果您无法使用DX,请使用此选项。这将允许您围绕您传入的任何轴旋转。在我的目标代码中,我跟踪方向和向上向量,我只是围绕运动轴(在您的情况下是偏航和俯仰)旋转它们中的每一个。
要像这样实现固定距离相机,我只需做当前相机位置和原点位置的点积(如果这永远不会改变,那么你可以简单地做一次),然后将相机移动到原点,将其旋转到您需要的数量,然后用新的方向和向上值将其移回。
相关文章:
- 发布旋转矩阵(openGL/glm)
- 如何在OpenGL中正确旋转和缩放对象?
- 使用 C++在 OpenGL 中移动自动旋转的 3D 多边形
- 按时间自动旋转形状,同时在 OpenGL 中使用C++移动它们
- 如何在 openGL 中围绕全局轴旋转模型?
- 如何在 opengl 中仅旋转特定对象而不影响其他对象?
- 在OpenGL(GLM/C++)中使用四元数旋转时出现问题
- 鼠标单击 OpenGL 时无法围绕其自己的中心旋转对象
- OpenGL:在那个方向上旋转和移动
- 在 OpenGL 中旋转一个正方形
- 如何使用gluLookAt围绕OpenGL中的点旋转相机视图
- 如何在 opengl 中旋转矢量?
- 现代 OpenGL 多维数据集旋转未按预期工作
- 在使用PI上的OpenGL ES绘制之前,如何旋转纹理
- C++ OpenGL 如何从 quaterion 获取旋转 x,y,z
- Opengl 旋转不起作用
- 绕摄影机旋转opengl c++/设置旋转中心
- 使用 GLM 围绕点旋转 OpenGL
- 第一人称相机,旋转OPENGL
- 立方体旋转- OpenGL