请帮助我让相机跟随目标点。我已经为我公司的新原型项目做了2天了。目前我有:
void Camera::followTargetPoint(CIwVec3 target, int32 distance, int32 height)
{
CIwVec3 viewSpaceLocation = (CIwVec3)IwGxGetModelViewMatrix().TransformVec(target);
IwTrace(SCOOTER, ("viewSpaceLocation: x: %d, y: %d, z: %d", viewSpaceLocation.x, viewSpaceLocation.y, viewSpaceLocation.z));
// set the viewspace origin to the camera location in viewspace
//IwGxSetViewSpaceOrg(&viewSpaceLocation);
CIwVec3 pos = CIwVec3(viewSpaceLocation.x, viewMatrix.t.y, viewSpaceLocation.z);
viewMatrix.SetTrans(pos);
//viewMatrix.LookAt(CIwVec3(0,0,-100), target, CIwVec3(0,-100,0));
IwGxSetViewMatrix(&viewMatrix);
}
这个方法在我的渲染器中调用,如:
p->Render();
cam->followTargetPoint(p->getModelMatrix().GetTrans(), 3, 100);
我需要的是第三人称视角相机,它位于由followTargetPoint方法指定的距离和高度。当我试图从目标矢量的z坐标减去一个距离时,我只能得到第一人称视图,因为我得到一个闪烁的模型,我知道原因,但问题是我如何摆脱它?
答案 0 :(得分:1)
您需要知道您的观点在哪个方向,以便能够遵循它。除非您可以对此做出假设,例如这是一款自上而下的2D游戏吗?
无论如何,给定一个方向,你在世界空间的相机位置将是这样的:
CIwVec3 camPos = ( target - ( targetDirection * distance ) );
camPos.z += height; // assuming Z is up
然后您需要使用此位置构建矩阵,但您还需要3个轴。前进轴是:
( target - camPos ).Normalized();
然后你可以使用一些假设粗糙向量为0,0,1的交叉积来构造其他2个轴。您应该能够找出/谷歌如何在给定点和前向矢量的情况下构建该矩阵。我不能用勺子喂你整个事情;)
然后,您可以将新构造的矩阵的逆设置为新的视图矩阵:
viewMatrix = viewMatrix.Inverse();
IwGxSetViewMatrix(&viewMatrix);
抱歉,我不熟悉IwGx API,所以我可能错误地键入了一些函数名称。