8

奥行きがあるように見えるように、ビットマップをゆがめたい (これが正しい言葉でない場合は訂正してください)。私が求めていることを視覚化する良い方法は、スターウォーズのクレジットがどのように角度を付けて深さを示すかということです.

私は次のことを試しました:

canvas.getMatrix().postSkew(kx,ky,px,py);

canvas.skew(sx,sy);

しかし、私はあまり成功していません。上記のメソッドは常にビットマップを平行四辺形に変換するようです。代わりにビットマップを台形に変換する方法はありますか?

これは、Romain が指摘してくれた例から取ったコードのスニペットです。

canvas.rotate(-mOrientation[0] + mHeading, mCenterX, mCenterY);

camera.save();

if (mReverse) {
    camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);
} else {
    camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));
}

camera.rotateX(mOrientation[1]);
camera.applyToCanvas(canvas);
canvas.drawPath(mPath, mPaint);
canvas.drawCircle(mCenterX, mCenterY, mRadius - 37, mPaint);

camera.restore();
4

3 に答える 3

13

私は今日、これに多くの時間を費やし (同じ問題に遭遇しました)、以下のコードを思いつきました。

注意すべき重要なことは、 preTranslate() と postTranslate() を Canvas 領域の中央 (または別の場所) に設定する必要があることです。デフォルトでは左上隅(x = 0、y = 0)ではなく、画像の中心を使用して変換を適用することを意味しているようです。これが、予想される台形ではなく、平行四辺形を取得する理由です (それらの名前を教えてくれてありがとう)。

私が取り上げたもう 1 つの重要な点は、キャンバス/カメラの保存/復元機能です。基本的に、毎回状態を復元せずに Rotate 関数を 3 回連続して呼び出すと、描画するたびにオブジェクトを何度も何度も回転させ続けることになります。それはあなたが望むものかもしれませんが、私の場合は確かにそうしませんでした. 基本的に Camera オブジェクトから Canvas に Matrix を適用しているため、キャンバスにも同じことが当てはまり、リセットする必要があります。それ以外の場合は同じことが起こります。

これが誰かの役に立てば幸いです。これは初心者向けに十分に文書化されていません。これを読んでいる人へのヒントとして、SDK サンプルの APIDemos フォルダーを確認してください。これを示す Rotate3dAnimation.java ファイルもあります。

//Snippet from a function used to handle a draw
mCanvas.save(); //save a 'clean' matrix that doesn't have any camera rotation in it's matrix
ApplyMatrix(); //apply rotated matrix to canvas
Draw(); //Does drawing
mCanvas.restore(); //restore clean matrix
//    

public void ApplyMatrix() {
  mCamera.save();
  mCamera.rotateX(-66);
  mCamera.rotateY(0);
  mCamera.rotateZ(0);
  mCamera.getMatrix(mMatrix);

  int CenterX = mWidth / 2;
  int CenterY = mHeight / 2; 
  mMatrix.preTranslate(-CenterX, -CenterY); //This is the key to getting the correct viewing perspective
  mMatrix.postTranslate(CenterX, CenterY); 

  mCanvas.concat(mMatrix);
  mCamera.restore();    
}
于 2011-05-19T04:38:57.187 に答える
6

Skew() では、必要な効果を得ることができません。ただし、カメラ オブジェクトと 3D 回転を使用して、この効果を実現できます。カメラは、キャンバスに適用できるマトリックスを生成します。結果は正しいパースペクティブではありませんが、目的には十分であることに注意してください。これは、たとえば Honeycomb の Launcher (および他の多くのアプリ) で 3D 回転が行われる方法です。

于 2011-03-18T17:11:56.837 に答える
1

「スターウォーズ効果」はアフィン変換ではないと思いますMatrix.

于 2011-03-18T15:44:51.193 に答える