mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-05 09:15:33 +00:00
More fixes to the orbit manipulator
This commit is contained in:
parent
2903271331
commit
342d31de76
2 changed files with 24 additions and 34 deletions
|
@ -275,6 +275,7 @@ namespace CSVRender
|
|||
, mRollLeft(false)
|
||||
, mRollRight(false)
|
||||
, mCenter(0,0,0)
|
||||
, mDistance(0)
|
||||
, mCenterNode(new osg::PositionAttitudeTransform())
|
||||
{
|
||||
group->addChild(mCenterNode);
|
||||
|
@ -343,7 +344,7 @@ namespace CSVRender
|
|||
if (mode == "p-navi")
|
||||
{
|
||||
rotateHorizontal(x * getMouseScalar());
|
||||
rotateVertical(y * getMouseScalar());
|
||||
rotateVertical(-y * getMouseScalar());
|
||||
setModified();
|
||||
}
|
||||
else if (mode == "s-navi")
|
||||
|
@ -353,7 +354,7 @@ namespace CSVRender
|
|||
}
|
||||
else if (mode == "t-navi")
|
||||
{
|
||||
zoom(x * (mFast ? SpeedMultiplier : 1));
|
||||
zoom(-x * (mFast ? SpeedMultiplier : 1));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -392,8 +393,6 @@ namespace CSVRender
|
|||
|
||||
mCenterNode->setPosition(mCenter);
|
||||
|
||||
lookAtCenter();
|
||||
|
||||
// Normalize the matrix to counter drift
|
||||
getCamera()->getViewMatrix().orthoNormal(getCamera()->getViewMatrix());
|
||||
|
||||
|
@ -412,6 +411,8 @@ namespace CSVRender
|
|||
osg::Vec3d eye, up;
|
||||
getCamera()->getViewMatrixAsLookAt(eye, mCenter, up, DefaultStartDistance);
|
||||
|
||||
mDistance = DefaultStartDistance;
|
||||
|
||||
mInitialized = true;
|
||||
}
|
||||
|
||||
|
@ -430,26 +431,27 @@ namespace CSVRender
|
|||
|
||||
void OrbitCameraController::rotateHorizontal(double value)
|
||||
{
|
||||
osg::Vec3d position = getCamera()->getViewMatrix().getTrans();
|
||||
osg::Vec3d offset = position - mCenter;
|
||||
osg::Quat rotation = getCamera()->getViewMatrix().getRotate();
|
||||
osg::Vec3d eye, center, up;
|
||||
getCamera()->getViewMatrixAsLookAt(eye, center, up);
|
||||
|
||||
osg::Quat offsetRotation = osg::Quat(value, LocalUp);
|
||||
osg::Vec3d newOffset = (rotation * offsetRotation) * (rotation.inverse() * offset);
|
||||
osg::Quat rotation = osg::Quat(value, up);
|
||||
osg::Vec3d oldOffset = eye - mCenter;
|
||||
osg::Vec3d newOffset = rotation * oldOffset;
|
||||
|
||||
getCamera()->getViewMatrix().setTrans(mCenter + newOffset);
|
||||
getCamera()->setViewMatrixAsLookAt(mCenter + newOffset, mCenter, up);
|
||||
}
|
||||
|
||||
void OrbitCameraController::rotateVertical(double value)
|
||||
{
|
||||
osg::Vec3d position = getCamera()->getViewMatrix().getTrans();
|
||||
osg::Vec3d offset = position - mCenter;
|
||||
osg::Quat rotation = getCamera()->getViewMatrix().getRotate();
|
||||
osg::Vec3d eye, center, up;
|
||||
getCamera()->getViewMatrixAsLookAt(eye, center, up);
|
||||
|
||||
osg::Quat offsetRotation = osg::Quat(value, LocalLeft);
|
||||
osg::Vec3d newOffset = (rotation * offsetRotation) * (rotation.inverse() * offset);
|
||||
osg::Vec3d forward = center - eye;
|
||||
osg::Quat rotation = osg::Quat(value, up ^ forward);
|
||||
osg::Vec3d oldOffset = eye - mCenter;
|
||||
osg::Vec3d newOffset = rotation * oldOffset;
|
||||
|
||||
getCamera()->getViewMatrix().setTrans(mCenter + newOffset);
|
||||
getCamera()->setViewMatrixAsLookAt(mCenter + newOffset, mCenter, up);
|
||||
}
|
||||
|
||||
void OrbitCameraController::roll(double value)
|
||||
|
@ -465,24 +467,13 @@ namespace CSVRender
|
|||
|
||||
void OrbitCameraController::zoom(double value)
|
||||
{
|
||||
osg::Vec3d dir = mCenter - getCamera()->getViewMatrix().getTrans();
|
||||
double distance = dir.normalize();
|
||||
mDistance = std::max(10., mDistance + value);
|
||||
|
||||
if (distance > 1 || value < 0)
|
||||
{
|
||||
getCamera()->getViewMatrix() *= osg::Matrixd::translate(dir * value);
|
||||
}
|
||||
}
|
||||
osg::Vec3d eye, center, up;
|
||||
getCamera()->getViewMatrixAsLookAt(eye, center, up, 1.f);
|
||||
|
||||
void OrbitCameraController::lookAtCenter()
|
||||
{
|
||||
osg::Vec3d position = getCamera()->getViewMatrix().getTrans();
|
||||
osg::Vec3d offset = mCenter - position;
|
||||
osg::Quat rotation = getCamera()->getViewMatrix().getRotate();
|
||||
osg::Vec3d offset = (eye - center) * mDistance;
|
||||
|
||||
osg::Quat newRotation;
|
||||
newRotation.makeRotate(LocalForward, offset);
|
||||
|
||||
getCamera()->getViewMatrix().setRotate(newRotation);
|
||||
getCamera()->setViewMatrixAsLookAt(mCenter + offset, mCenter, up);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -119,11 +119,10 @@ namespace CSVRender
|
|||
void translate(const osg::Vec3d& offset);
|
||||
void zoom(double value);
|
||||
|
||||
void lookAtCenter();
|
||||
|
||||
bool mInitialized;
|
||||
bool mFast, mLeft, mRight, mUp, mDown, mRollLeft, mRollRight;
|
||||
osg::Vec3d mCenter;
|
||||
double mDistance;
|
||||
|
||||
osg::ref_ptr<osg::PositionAttitudeTransform> mCenterNode;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue