void Trackball::UpdateBall(double x, double y) { Vec3d toPos = MouseOnSphere(x,y); Vec4d newQuat = Qt_FromBallPoints(mStartPos, toPos); mStartPos = toPos; mCurrQuat = Qt_Mul(newQuat, mCurrQuat); }
void ArcBall_Update (void) { int setSize = setSizes[axisSet]; HVect *set = (HVect *)(sets[axisSet]); vFrom = MouseOnSphere(vDown, center, radius); vTo = MouseOnSphere(vNow, center, radius); if (dragging) { if (axisSet!=NoAxes) { vFrom = ConstrainToAxis(vFrom, set[axisIndex]); vTo = ConstrainToAxis(vTo, set[axisIndex]); } qDrag = Qt_FromBallPoints(vFrom, vTo); qNow = Qt_Mul(qDrag, qDown); } else { if (axisSet!=NoAxes) axisIndex = NearestConstraintAxis(vTo, set, setSize); } Qt_ToBallPoints(qDown, &vrFrom, &vrTo); Qt_ToMatrix(Qt_Conj(qNow), mNow); /* Gives transpose for GL. */ }