2016-07-30 75 views
0

小さなゲームのために親子エンティティシステムを作成しましたが、子オブジェクトの場所を取得しようとすると問題が発生します。ローカル座標をグローバル座標に変換する

今のところ、エンティティの子は、親の座標空間で変形、回転、および拡大縮小されます。つまり、親が(2,3,0)の位置にあり、(1、2、1)の位置にその親に子を追加すると、そのワールド空間は(3,5,1)です。

私の問題は、ローカルスペース(1,2,1)からグローバルスペース(3,5,1)に変換する方法がわかりません。

開始する明白な場所は、親の位置と子の位置を追加することです。これは回転していないオブジェクトに対しても有効です。回転とスケールが適用されるときはいつも混乱しますが、これは私が理解できないものです。

私は行列の逆行列を使用するためにどこかを読んだが、それ以上の説明は明確ではなかった。任意のヘルプ/数学的な洞察/擬似コードは、大変感謝します!ありがとう!

答えて

1

誰かを助けた場合に備えてこれを投稿したかったので、かなり混乱してしまいました。

これは実際には非常に簡単です。あなたがしなければならないのは、親エンティティのモデル行列に子供のモデル行列を掛けて、そのように最下行から座標を復元するだけです。

以下の例では、親がある場合とない場合のエンティティのモデル行列から位置を取得する方法を確認できます。 (。。私は実際にこれはあなたが親を持って知っているし、ワールド空間での位置を必要とするエンティティのためだけに有用である私が個別に各エンティティの位置を保存するこれを行わない。)

Vector3f Entity::GetPosition() const { 
    Matrix4f matrix; 
    if (GetParent() != 0) { 
     matrix = GetParent()->GetModelMatrix() * GetModelMatrix(); 
    } else { 
     matrix = GetModelMatrix(); 
    } 

    float x = matrix[ 3 ][ 0 ]; 
    float y = matrix[ 3 ][ 1 ]; 
    float z = matrix[ 3 ][ 2 ]; 

    return Vector3f(x, y, z); 
} 

注:私は書きました私の独自の行列の実装は、どのように乗算して位置を抽出するかは、おそらく異なるでしょう。

関連する問題