0

私は行列の数学がひどいですが、1つをスケーリングする必要がある状況があります。マトリックスはここで定義されたカスタムクラスのインスタンスであり、私のスケーリングオブジェクトは3つのfloat(x、y、z)を含むベクトルです。私はすでにその道を進んでいて、関係する数学を理解していないので、一般的な説明ではなく、実際に必要なコードが欲しいです。幸いなことに、マトリックスをスケーリングできれば、私が達成しようとしていることはかなり簡単です。

ここで明確にするために、私が更新しているコードがあります。リンクされたオブジェクトの階層を相対変換で繰り返し、mat&を絶対変換に更新します。

void LocalModelPiece::GetPiecePosIter(CMatrix44f* mat) const
{
if (parent) {
    parent->GetPiecePosIter(mat);
}

if (pos.x || pos.y || pos.z) { mat->Translate(pos.x, pos.y, pos.z); }
// --> My problem is here. There is no Scale() method, I need one. <--
if (scale.x!=1.0f || scale.y!=1.0f || scale.z!=1.0f) { mat->Scale(scale.x, scale.y, scale.z); }
if (rot[1]) { mat->RotateY(-rot[1]); }
if (rot[0]) { mat->RotateX(-rot[0]); }
if (rot[2]) { mat->RotateZ(-rot[2]); }

}

4

2 に答える 2

2

何をスケーリングしたいかは私にはわかりません。それはマトリックス自体ですか、それとも別のベクトルをスケーリングするために使用するつもりですか?

3D空間のベクトルについて話している場合、4x4マトリックスがどのように必要なものになるかわかりません。行列を使用して3D空間でベクトルをスケーリングすることは、スケーリング係数を行列の対角線に配置することを意味します。非対角要素はゼロです。

4x4マトリックスにリンクすると、私を混乱させます。それがあなたが望むものであると確信していますか?

私はあなたがこれを望んでいると思います:

代替テキスト

これがどのように行われるかを示すためのいくつかの擬似コードです:

for (int i = 0; i < 3; ++i)
{
    v_prime[i] = c[i]*v[i];
}

3x3マトリックスをスケーリングする場合は、次のようになります。

代替テキスト

これがどのように行われるかを示すためのいくつかの擬似コードです:

for (int i = 0; i < 3; ++i)
{
    for (int j = 0; j < 3; ++j)
    {
        m_prime[i][j] = c[i]*m[i][j];
    }
}

これらのソリューションは両方とも、スケーリングベクトルには3つのコンポーネントがあるというステートメントに基づいていることに注意してください。そうでない場合は、すべての賭けが無効になります。

于 2010-11-28T02:05:41.877 に答える
0

提供されたAPIリンクを確認しました。これに基づいて、既存のTranslate()およびRotate()メソッドと一貫性を保つために、マトリックスクラスのスケーリングメソッドを実装する方法を説明します。つまり、スケーリング行列を使用して右側の乗算を実行します。

個人的には少し奇妙だと思いますが、APIはOpenGLスタイルのマトリックスを使用しているためです。つまり、右側の乗算は、マトリックスに存在する他のすべての変換の前に新しい変換を適用しますが、左側の乗算は、他の変換の後に適用します。だから、それがあなたがここで望んでいるものかどうかはわかりません。すべての変換を逆の順序で実行するか、左側の乗算を自分で実行する必要がある場合があります。

void CMatrix44f::Scale(float scalex, float scaley, float scaley) 
{
  /* the function should be equivalent to doing this:
  CMatrix44f scalemat;
  scalemat[0] = scalex;
  scalemat[5] = scaley;
  scalemat[10] = scalez;
  *this = Mul(scalemat);
  */

  m[0] *= scalex;
  m[1] *= scalex;
  m[2] *= scalex;
  m[3] *= scalex;

  m[4] *= scaley;
  m[5] *= scaley;
  m[6] *= scaley;
  m[7] *= scaley;

  m[8] *= scalez;
  m[9] *= scalez;
  m[10] *= scalez;
  m[11] *= scalez;
}
于 2010-11-28T05:32:29.813 に答える