Idi*_*tic 6 3d camera android canvas rotation
我试图使用Camera(android.graphics.Camera而不是硬件相机)围绕特定点旋转视图画布,在这个实例中是画布的中间.
在dispatchDraw(Canvas画布)中 - 为了简洁起见,我将所有非重要部分都省略了.
camera.save();
camera.rotateX(0);
camera.rotateY(0);
camera.rotateZ(angle);
camera.getMatrix(cameraMatrix);
camera.restore();
canvas.concat( cameraMatrix );
Run Code Online (Sandbox Code Playgroud)
画布旋转,但始终从左上角开始.
注意:因为画布的构造比显示区域大,我还需要翻译最终结果,使其在显示中居中,我可以用
canvas.translate(xOffset,yOffset) PRIOR to calling the camera methods
Run Code Online (Sandbox Code Playgroud)
要么
cameraMatrix.preTranslate(xOffset,yOffset) AFTER the camera methods
Run Code Online (Sandbox Code Playgroud)
两者都正确地将画布中心放在显示器中,但我似乎无法将旋转点作为camera.rotateZ(角度)调用的中心,尝试使用3D android示例中的方法但是它们似乎适用于它们的X/Y轴似乎不影响Z轴
任何帮助将不胜感激,文档并不完全冗长.
解决了这个问题,不确定它是否是最好的方式,但它有效.解决方案是
首先翻译画布,使较大的画布居中显示
然后应用相机旋转
然后在矩阵上使用pre和post translate方法来改变旋转点,类似于android示例所做的.
缺少的部分是首先进行画布翻译,我也没有使用更大的画布大小来计算翻译前和翻译后方法的偏移量.
这是修改后的代码,如果它可以帮助其他任何人.
// Center larger canvas in display (was made larger so
// corners will not show when rotated)
canvas.translate(-translateX, -translateY);
// Use the camera to rotate a view on any axis
camera.save();
camera.rotateX(0);
camera.rotateY(0);
camera.rotateZ(angle); // Rotate around Z access (similar to canvas.rotate)
camera.getMatrix(cameraMatrix);
// This moves the center of the view into the upper left corner (0,0)
// which is necessary because Matrix always uses 0,0, as it's transform point
cameraMatrix.preTranslate(-centerScaled, -centerScaled);
// NOTE: Camera Rotations logically happens here when the canvas has the
// matrix applied in the canvas.concat method
// This happens after the camera rotations are applied, moving the view
// back to where it belongs, allowing us to rotate around the center or
// any point we choose
cameraMatrix.postTranslate(centerScaled, centerScaled);
camera.restore();
canvas.concat(cameraMatrix);
Run Code Online (Sandbox Code Playgroud)
如果有人有更好的方法或看到问题,请发表评论.
归档时间: |
|
查看次数: |
10304 次 |
最近记录: |