好的,我正在尝试使用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的,但它不起作用,所以我尝试了我的方法。
发布于 2012-05-09 14:26:18
这并不是你正在做的事情的解决方案,但是我前几天做了类似的事情。我是通过使用DX的D3DXMatrixRotationAxis和D3DXVec3TransformCoord实现的,D3DXMatrixRotationAxis方法背后的数学可以在下面的页面底部找到:D3DXMatrixRotationAxis Math如果你不能使用DX,就使用这个。这将允许您围绕传入的任何轴进行旋转。在我的目标代码中,我跟踪一个方向和向上向量,我只是简单地围绕移动轴旋转它们(在你的例子中是偏航和俯仰)。
要实现像这样的固定距离相机,我将简单地做当前相机位置和原点位置的点积(如果这永远不会改变,那么你可以只做一次)。然后将相机移动到原点,旋转所需的量,然后使用新的方向和向上值将其移回。
https://stackoverflow.com/questions/10510186
复制相似问题