|
我想通过设定关键帧在场景中指定一个漫游路径,然后实现一个自动漫游,其中的每一个关键帧中的相机所在的位置和朝向都事先在手工漫游过程中采集得到,采集的数据包括
mCamera->getPosition();
mCamera->getOrientation();
mCamera->getDirection();
通过关键帧生成自动漫游部分的代码如下:
struct TrackPoint
{
Ogre::Vector3 pos;
Ogre: uaternion orientation;
Ogre::Vector3 direction;
};
std::vector<TrackPoint> TourTrack; // 手工获取的关键帧中的相机位置、朝向等信息
SceneNode* nCameraNode; // 用来挂接相机的节点
void XDemoApp::createKeyFrames(void)
{
int timeSpan = 1.5; // 每两个关键帧之间的时间间隔
int tourTime = 0; // 当前时间
Vector3 pos, init_pos;
Vector3 direction, init_direction;
Quaternion quat;
Quaternion init_orientation;
// 创建关键帧动画
Animation* anim = mSceneMgr->createAnimation("HS_Track", TourTrack.size() * timeSpan);
anim->setInterpolationMode(Animation::IM_SPLINE);
// 获取初始的相机位置、朝向等信息
init_pos = TourTrack[0].pos;
init_direction = TourTrack[0].direction;
init_orientation = TourTrack[0].orientation;
// 设置相机初始位置和朝向
mCamera->setPosition(init_pos);
mCamera->setOrientation(init_orientation);
nCameraNode = mSceneMgr->getRootSceneNode()->createChildSceneNode();
NodeAnimationTrack* track = anim->createNodeTrack(0, nCameraNode);
// 设置各个关键帧
TransformKeyFrame* key = track->createNodeKeyFrame(0);
std::vector<TrackPoint>::iterator it;
for(it = TourTrack.begin() + 1; it != TourTrack.end(); it++)
{
tourTime += timeSpan; // 当前时间
key = track->createNodeKeyFrame(tourTime);
pos = (*it).pos;
key->setTranslate(pos - init_pos); // 设置当前关键帧的相对初始帧的相对位移
direction = (*it).direction;
quat = init_direction.getRotationTo(direction);
key->setRotation(quat); // 设置当前关键帧的相对初始帧的相对旋转位移
}
// 最后一帧
key = track->createNodeKeyFrame(TourTrack.size() * timeSpan);
key->setTranslate(Vector3::ZERO);
key->setRotation(Quaternion::ZERO);
mAnimState = mSceneMgr->createAnimationState("HS_Track");
mAnimState->setEnabled(true);
mCamera->setFixedYawAxis(false);
nCameraNode->attachObject(mCamera); // 将相机挂接到相机节点上
}
这里和Demo_CameraTrack例子不同的是:例子中有
mCamera->setAutoTracking(true, headNode);
的语句,相机在自动漫游过程中始终朝向怪兽头,但我希望相机在自动漫游过程中的朝向更加自由,能在各个关键帧相机朝向之间插值,而不是总是盯着某个物体。
程序的运行结果是:
如果不加key->setRotation(...)语句,则只能自动位移(位移正确),不能自动旋转,加了key->setRotation(...)语句之后,相机的位移、朝向就全不对了。
请问诸位:
相机自动漫游过程中的朝向不正确问题是什么原因造成的?该如何解决?
|
|