android camera擷取matrix作用於canvas的研究
網上查了一下相關的文章,認為自己看懂了,但是實際測試時和網上說的並不一樣(後來研究發現,那個人寫的是錯的!!!),所以,在此提醒大家,要勇於質疑,勇於提出問題。
首先說明camera類,這個類位於package android.graphics 包下,用於映像3D變換,通過旋轉、位移等方式,最終通過getMatrix(Matrix)方法拿到矩陣,作用於canvas,使得畫面呈現出立體效果。
camera的源碼沒什麼看的,這裡列舉他的主要方法:
public native void save(); public native void restore(); public native void translate(float x, float y, float z); public native void rotateX(float deg); public native void rotateY(float deg); public native void rotateZ(float deg); public native void rotate(float x, float y, float z); public native float getLocationX(); public native float getLocationY(); public native float getLocationZ(); public native void setLocation(float x, float y, float z); public void getMatrix(Matrix matrix) { nativeGetMatrix(matrix.native_instance); } public void applyToCanvas(Canvas canvas) { nativeApplyToCanvas(canvas.mNativeCanvas); } public native float dotWithNormal(float dx, float dy, float dz);
這些方法看起來都不難,通過字面意思可以大致進行瞭解,其中最後幾個方法目前還未研究,後面研究了補上。
接著我們來看看Camera變換的幾個軸座標,圖有點難看哈。
這個才是正確的x, y ,Z 軸座標,而另外一個文章說的左手座標系,經過我的驗證那個作者寫的是錯誤的。
<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+Y2FtZXJhzrvT2tf4seq140+146OoMCwwLDCjqaOs0rK+zcrHzbzW0LXE1/PJz73HPC9wPgo8cD5yb3RhdGU8L3A+CjxwPr3T18XO0sPHv7TI57rO0P3XqqOsztLDx7zZyei/ydLU16q2r8281tDX+LHqz7WjrM7Sw8fQ/deq1/ix6s+1o6zIw1jW4dX9t73P8ta4z/LO0sPHo6zSsr7NysfLtdXiyrG68s7Sw8e/tLn9yKVBteO6zU+149bYus/By6OoxNzA7b3iw7Sjv7K7xNzA7b3ixMO49re9v+m2q87316rXxdfUvLq/tKOpoaPIu7rzo6zV4sqxuvLR2NfFy7PKsdXrvfjQ0ND916qjrMi7uvPO0sPHtNPK1rv6xsHEu7e9z/K527Lso6y+zbvht6LP1rHku6/By6GjPC9wPgo8cD7Ex87Sw8fU2b+00ru49sD919OjumNhbWVyYS5yb3RhdGVZKDQ1KTwvcD4KPHA+y/vS4su8ysfIxnnW4cuzyrHV69D916o0NbbIoaPI57n7zu/M5dbQvOTP37rNedbh1ti6z6Os1f3IxnnW4cuzyrHV69D916o0NbbIvs3Kx9a4zu/M5dPSsOuyv7fWz/LA77et16qjrNfzsOuyv7fWz/LN4ret16qjuzwvcD4KPHA+Y2FtZXJhLnJvdGF0ZVgoNDUptcTS4su8ysfIxnjW4cuzyrHV69D916o0NbbIoaO+2cD9wLTLtaOsyOe5+87vzOXW0Lzkz9+6zXjW4dbYus+1xLuwo6zIxnjW4cuzyrHV69D916o0NbbIvs3Kx9a4zu/M5cnPsOuyv7fWz/LA77et16qjrM/CsOuyv7fWz/LN4ret16qjuzwvcD4KPHA+Y2FtZXJhLnRyYW5zbGF0ZSg0MCwgMzAsIDMwKbXE0uLLvKOs1NrNvNbQv7S+zcrHsNG527Lszu/M5dPS0sY0MKOsz8LSxjMwo6zP8nrW4dX9t73P8tLGMjCjqLy0yMPO78zl1LbA68bBxLujrLy0zu/M5b2ru+Gx5NCho6mjuzxicj4KPC9wPgo8cD48YnI+CjwvcD4KPHA+ztLDx7+0vLi49s28wLS808nuwO294qO6PC9wPgo8cD7K18/I1K3NvKO6PC9wPgo8cD48aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20150117/20150117092512162.png" alt="\">
進行變換:camera.rotateX(60);
進行變換: camera.rotateY(60);
進行變換:camera.rotateZ(-60); (這裡是-60哈)
translate和canvas的位移類似,這裡不再示意。