与橘子酱SDK的第三人称视图相机

时间:2012-08-01 07:09:30

标签: opengl-es airplay marmalade

请帮助我让相机跟随目标点。我已经为我公司的新原型项目做了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坐标减去一个距离时,我只能得到第一人称视图,因为我得到一个闪烁的模型,我知道原因,但问题是我如何摆脱它?

1 个答案:

答案 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,所以我可能错误地键入了一些函数名称。