2

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

4

1 回答 1

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

于 2012-08-07T11:26:56.773 回答