简单阵列相机效果(threejs array camera例子实现)

ArrayCamera,阵列相机,其本质应该是shift camera原理(成像平面投射偏离)的应用。WebGL中的ArrayCamera设计意图是为VR场景高效渲染提供支持,但是目前实际上只是提供了多子视口(sub view port)的渲染支持。

webgl_array_camera例子

webgl_array_camera例子只是实现了类似九宫格效果的多视口(viewport)画面渲染。其实现方式是通过在unit square [0..1]区间按照比例定义每个子视口的参数,同时还有子视口对应的投射矩阵参数。在渲染时,对每个子视口参数根据实际的窗口尺寸进行对应的glViewport调用,然后根据对应的投射矩阵渲染场景到对应的视口。

在OpenGL ES上的C++渲染实现

webgl的arraycamera渲染例子实现起来比较简单。首先定义相机接口,包含子视口参数,投射矩阵参数。其次在渲染前实现对相机列表中每个视口和投射矩阵的应用。

iOS版本实现源码可以从github上获取。

1. 定义PerspectiveCamera接口


//sub view port参数,使用比例设置
struct SubViewPort
{
    float x;
    float y;
    float width;
    float height;
    
    SubViewPort(float x,float y,float width,float height):x(x),y(y),width(width),height(height){};
};

class PerspectiveCamera{
public:
    Matrix4 projMat;
    float aspect;
    float fov;
    float near;
    float far;
    SubViewPort subview;
    
public:
    PerspectiveCamera(float aspect=1.0,float fov=50.0,float near=-0.1,float far=-10000.0):aspect(aspect),fov(fov),near(near),far(far),subview(SubViewPort(0.,0.,0.,0.)){

        updatePorjectonMatrix();
    };
    ~PerspectiveCamera(){};
    
    void updatePorjectonMatrix(){
        //make a right handed projection matrix
        projMat = Matrix4::makeProjection(fov,aspect,near, far);
    }
   
};

2. 设置子视口参数和对应的投射矩阵

每个子视口和对应的投射矩阵实现为一个PerspectiveCamera实例,所有的PerspectiveCamera实例存储在一个容器中。

    //6*6阵列相机
     vector<PerspectiveCamera> arrayCamera;
    
    int amount = 6;
    float size = (float)1/amount;
    
    for ( int y = 0; y < amount; y ++ ) {
        for ( int x = 0; x < amount; x ++ ) {
            PerspectiveCamera subcamera;
            subcamera.subview = SubViewPort((float)x/amount,(float)y/amount,size,size);
            arrayCamera.push_back(subcamera);
        }      
    }
    
    ...
    //设置每个投射矩阵参数
    float aspect = g_windowWidth / static_cast <double> (g_windowHeight);
    for(auto &camera : arrayCamera){
        //注意:camera必须为reference,否则参数无法存储到arrayCamera的实例中
        camera.aspect = aspect;
        camera.far = g_frustFar;
        camera.near = g_frustNear;
        camera.fov = g_frustFovY;
        //生成投射矩阵
        camera.updatePorjectonMatrix();
    }

3. 渲染时应用多个子视口

在渲染时,每个子视口被设置到window的一个特定区域,每个视口都可以实现独立的场景渲染。

for(auto &camera:arrayCamera){
        //由于每个子视口以比例方式设置,应用时要根据窗口尺寸进行适当的缩放。
        SubViewPort svPort = camera.subview;
        int x = svPort.x * g_windowWidth;
        int y = svPort.y * g_windowHeight;
        int width = svPort.width * g_windowWidth;
        int height = svPort.height * g_windowHeight;
        glViewport(x, y, width, height);
        
        //背景渲染
        planeModel->setPerspectiveCamera(make_shared<PerspectiveCamera>(camera));
        planeModel->Render();
        //teapot渲染
        teapotModel->setPerspectiveCamera(make_shared<PerspectiveCamera>(camera));
        teapotModel->Render();
    }

4. 渲染效果

arraycamera_example_20200329.jpg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容