问题与arcball

我制作graphics浏览器,我想用“arcball”来操作对象。 我使用OpenGL + CML(math)。 我的弧球不想工作,它倾斜不旋转:/而我不知道为什么,我使用公式http://www.csi.ucd.ie/staff/hcarr/home/teaching/comp4004/slides /05_arcball.pdf 。

My code: cml::vector3f u,v; u[0] = 2.0 - prevX/(0.5f * width()); u[1] = 2.0 - prevY/(0.5f * height()); u[2] = sqrt(u[0]*u[0] + u[1]*u[1]); v[0] = 2.0 - currentX/(0.5f * width()); v[1] = 2.0 - currentY/(0.5f * height()); v[2] = sqrt(v[0]*v[0] * v[1]*v[1]); cml::quaternionf qu,qv,q; qu[0] = 0; qu[1] = u[0]; qu[2] = u[1]; qu[3] = u[2]; qv[0] = 0; qv[1] = v[0]; qv[2] = v[1]; qv[3] = v[2]; q = qv * ( qu.inverse()); cml::matrix44f matrix; matrix.identity(); cml::matrix_rotation_quaternion(matrix,q); //Drawing glLoadIdentity(); qlTranslate(0,0,-zoom); qlMultMatrixf(matrix.data()); 

我会假设你正在操纵相机,但是解释也适用于对象。

它没有正确旋转的原因是因为你不假定有一个fixed yaw axis (通常是Y)。 那么最终发生的事情是,每一帧新的偏航轴会稍稍扭曲下一帧的计算。 在几帧的相机经历了一个意外的运动,我相信是你的情况发生了什么。

为了正确/可预测的弧球旋转,例如在Autodesk Maya / Max中看到的旋转,您将不得不假设您的up vector对于计算directionright vectors up vector是固定的(在3×3旋转matrix中,每列代表3个orthonormal vectors ,完全取决于你如何设置你的坐标系统,通常在OpenGL中它是正确的,向上的,方向的),然后计算一个新的up vector ,使摄像机正常工作。 每一帧,你都假设你的向上vector是不变的,并保持固定(例如) [0,1,0]

当直视或直线向上看时,上面提出了一个问题,在这种情况下,您的“向上”现在与您的导演平行,并且使您无法正确计算正交向量。 这是一个特例,你将不得不绕过它。 您可以限制相机旋转超过该点,或者可以跳过特定的旋转。