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 つの軸を構築できます。ポイントと前方ベクトルを指定してそのマトリックスを作成する方法については、/google を理解できるはずです。私はあなたにすべてをスプーンで与えることはできません;)

次に、新しく構築した行列の逆行列を新しいビュー行列として設定できます。

viewMatrix = viewMatrix.Inverse();
IwGxSetViewMatrix(&viewMatrix);

申し訳ありませんが、私は IwGx API に慣れていないため、関数名を間違って入力した可能性があります。

于 2012-08-07T11:26:56.773 に答える