CSS3Renderer是否忽略projectonMatrix属性?

时间:2014-12-12 14:49:36

标签: three.js

我正在使用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):

Wrong CSS3Renderer results

有两个问题:

  • 红色纹理(CSS3Object)非均匀缩放(事实上它是正方形)
  • 它始终位于屏幕中心,但它应位于蓝色网格的位置。

在分析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传递给相机矩阵,但这两个问题仍然存在。主要是我更担心忽略翻译,因为轮换看起来很好。

我很感激任何想法/建议!感谢。

0 个答案:

没有答案