3

postScale メソッドがマトリックスの値を正確に計算する方法について少し混乱しています。コードは次のとおりです。

Matrix m1 = new Matrix();
float[] values = { 1f, 2f, 3f, 4f, 5f, 6f, 7f, 8f, 9f };
m1.setValues(values);
Matrix m2 = new Matrix(m1);

m1.preScale(2f, 3f); //result: 2, 6, 3, 8, 15, 6, 14, 24, 9
m2.postScale(2f, 3f); //result: 1, 2, 3, 6, 7.5, 9, 3.5, 4, 4.5

ドキュメントによると、preScale の結果は (Matrix * scale) であり、postScale の結果は (scale * Matrix) です。しかし、行列を手動で計算すると、結果は異なります。

右から乗算:

1 2 3 | 2 0 0   2   6 3
4 5 6 | 0 3 0 = 8  15 6
7 8 9 | 0 0 1   14 24 9

左から乗算:

2 0 0 | 1 2 3    2  4  6
0 3 0 | 4 5 6 = 12 15 18
0 0 1 | 7 8 9    7  8  9

...左の乗算 (postScale) は、予想とは異なる結果を返します

ネイティブ実装 (Matrix_Delegate.java) も調べました。しかし、どこに問題があるのか​​ わかりません。足りないものはありますか?

4

1 に答える 1

2

setConcat ( android/external/skia/src/core/SkMatrix.cpp 内) が、少なくとも 1 つが透視行列である 2 つの行列を乗算した後、「normalize_perspective」というメソッドを呼び出します。行列の最後のセル (右下隅、インデックスがゼロの場合は mat[2][2]、この表現では mat[8]) が 1 より大きい場合、行列内のすべての数値を 2 で除算します。それは確かに私たちがここで見ているものを説明しています.

しかし、私たちの親しみやすいマトリックスは、どのようにしてパースペクティブ マトリックスと見なされるようになったのでしょうか? 良い。setValues() を実行すると、タイプは不明として設定されます。setConcat が getType を呼び出すと、「unknown」が表示され、それに対して何かを行うことが決定されます。これは、computeTypeMask を呼び出します。computeTypeMask は 3 番目の列を見て、それが [ 0 0 1 ] ではないことを確認し、行列の型に Perspective ラベルを付けます。これはあなたのm2に起こります。

しかし、なぜこれらすべてが postScale だけの問題なのでしょうか? preScale (Skia ライブラリが固定小数点モードでコンパイルされていない限り) 自体がスケーリングを行うため、setConcat に入ってこれらの岩礁を攻撃することはありません。

なぜ normalize_perspective が良い考えなのですか? 私が知っていればくそー。これはおそらく、これらの特定のルーチンに対して予想される 2D グラフィックス アプリケーションと関係があります。

このすべてについて何ができますか?API レベル 11 以上をターゲットにしている場合は、おそらく renderscript の Matrix3f が役に立ちます。そうでない場合は、申し訳ありません、D-Fox、あなたのマトリックスの実装は別の城にあります。

于 2012-07-02T14:50:09.337 に答える