我正在使用Three.js和recenlty进行增强现实我尝试将WebGL和CSS3渲染结合起来同时渲染3D内容和DOM对象(主要用于视频播放)。我已经开始使用Closing the gap between html and webgl教程,但我无法使用CSS获得正确的可视化(尽管WebGL工作正常)。
基本上,在进行AR时,我们必须将两个矩阵应用于场景:投影矩阵和相机矩阵。投影矩阵(行主要)通常如下所示:
var projectionMatrix = [ 1.820090055466, 0, -0.000550820783, 0,
0, 3.227676868439, -0.036605358124, 0,
0, 0, -1.000199913979,-0.200020000339,
0, 0, -1, 0
];
相机矩阵(row-major)代表一个严格的3D变换(R | t组合),代表虚拟世界中的相机变换:
var cameraMatrix = [ 0.790828585625,0.296402275562,-0.535477280617,-0.309822082520,
-0.612037420273,0.382129371166,-0.692378044128,-0.447699964046,
-0.000600785017,0.875284433365,0.483608126640,-0.637073278427,
0.000000000000,0.000000000000,0.000000000000,1.000000000000];
使用WebGL,将这些矩阵应用于管道非常容易:
self.wglCamera.matrixAutoUpdate = false;
self.wglCamera.projectionMatrix.set(
pm[0], pm[1], pm[2], pm[3],
pm[4], pm[5], pm[6], pm[7],
pm[8], pm[9], pm[10], pm[11],
pm[12], pm[13], pm[14], pm[15]);
self.wglCamera.matrix.set(
cm[0], cm[1], cm[2], cm[3],
cm[4], cm[5], cm[6], cm[7],
cm[8], cm[9], cm[10], cm[11],
cm[12], cm[13], cm[14], cm[15]);
当我对CSS3相机做同样的事情时,我得到的渲染结果不正确(VIDEO):
有两个问题:
在分析CSS3Renderer实现后,我发现只有相机FOV属性用于设置透视效果,但在使用CSS3Renderer 渲染时, projectionMatrix属性完全被忽略。这是打算吗?
// https://github.com/mrdoob/three.js/blob/master/examples/js/renderers/CSS3DRenderer.js#L225
this.render = function ( scene, camera ) {
var fov = 0.5 / Math.tan( THREE.Math.degToRad( camera.fov * 0.5 ) ) * _height;
...
camera.matrixWorldInverse.getInverse( camera.matrixWorld );
// Why we don't use camera.projection Matrix here?
var style = "translate3d(0,0," + fov + "px)" + getCameraCSSMatrix( camera.matrixWorldInverse ) +
" translate3d(" + _widthHalf + "px," + _heightHalf + "px, 0)";
...
};
如果是的话,我怎么能达到预期的效果?
我试图将PM * CM传递给相机矩阵,但这两个问题仍然存在。主要是我更担心忽略翻译,因为轮换看起来很好。
我很感激任何想法/建议!感谢。