好吧,所以我试图点击并拖动以使用C ++和OpenGL围绕一个对象旋转。我的方法是使用以原点为中心的gluLookAt,并通过使用球体的参数方程得到眼睛的坐标(eyex = 2 * cos(theta)* sin(phi); eyey = 2 * sin( theta)* sin(phi); eyez = 2 * cos(phi);)。这主要起作用,因为我可以单击并水平旋转,但是当我尝试垂直旋转时,它会产生紧密的圆圈而不是垂直旋转。我试图通过使用相机的位置和沿着x-z平面成90度角的矢量来获取向上矢量并获取它的交叉积。 我的代码如下:
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;
}
我有点基于this,但它没有用,所以我尝试了。
答案 0 :(得分:2)
这并不是解决方法,但我前几天做了类似的事情。我是通过使用DX的D3DXMatrixRotationAxis
和D3DXVec3TransformCoord
来完成的。D3DXMatrixRotationAxis
方法背后的数学可以在下一页的底部找到:D3DXMatrixRotationAxis Math如果你不能使用它使用DX。这将允许您围绕传入的任何轴旋转。在我的目标代码中,我跟踪方向和向上矢量,我只是围绕移动轴旋转每个(在您的情况下是偏航和俯仰)。
为了实现这样的固定距离相机,我只需要做当前相机位置和原点位置的点积(如果这不会改变,那么你可以简单地做一次。)然后将相机移动到原点旋转它是你需要的金额,然后用新的方向和值来移回它。