首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Three.js,WebGL,渲染六幅图像的全景图

Three.js,WebGL,渲染六幅图像的全景图
EN

Stack Overflow用户
提问于 2015-03-31 18:15:48
回答 1查看 1.1K关注 0票数 1

我使用three.js和CSS3D渲染器构建了一个全景图,现在我想使用WebGL渲染器做同样的工作。

在CSS3D中,下面的代码为我提供了一个完美的刷新和开放的全景图:

代码语言:javascript
复制
var sides = [
{
url: '/assets/posx.jpg',
position: [ -644, 0, 0 ],
rotation: [ 0, Math.PI / 2, 0 ]
},
{
url: '/assets/negx.jpg',
position: [ 644, 0, 0 ],
rotation: [ 0, -Math.PI / 2, 0 ]
},
{
url: '/assets/posy.jpg',
position: [ 0, 644, 0 ],
rotation: [ Math.PI / 2, 0, Math.PI ]
},
{
url: '/assets/negy.jpg',
position: [ 0, -644, 0 ],
rotation: [ -Math.PI / 2, 0, Math.PI ]
},
{
url: '/assets/posz.jpg',
position: [ 0, 0, 644 ],
rotation: [ 0, Math.PI, 0 ]
},
{
url: '/assets/negz.jpg',
position: [ 0, 0, -644 ],
rotation: [ 0, 0, 0 ]
}
];
for (var i = 0; i < sides.length; i++) {
var side = sides[ i ];
var element = document.createElement('img');
element.width = 1300;
element.height = 1300;
element.src = side.url;
var object = new THREE.CSS3DObject(element);
object.position.fromArray(side.position);
object.rotation.fromArray(side.rotation);
scene.add(object);
}

附带问题:必须有更好的方式来格式化粘贴的代码,而不是一行一行地打4次空格,对吗?

下面是我为WebGL提供的等价代码,它呈现图像,但它一点也不干净,并且在图像重叠没有视觉意义的地方有一个明显的裂口:

代码语言:javascript
复制
var sides = [
        {
            url: '/assets/posx.jpg'
        },
        {
            url: '/assets/negx.jpg'
        },
        {
            url: '/assets/posy.jpg'
        },
        {
            url: '/assets/negy.jpg'
        },
        {
            url: '/assets/posz.jpg'
        },
        {
            url: '/assets/negz.jpg'
        }
    ];

    //i chose 8 for this because other numbers i tried rendered interesting
    //distortions into the images
    var k = 8
    for (var i = 0; i < sides.length; i++) {

        var side = sides[ i ];
        var geometry = new THREE.SphereGeometry(10, k, k);
        k += 8;
        geometry.applyMatrix(new THREE.Matrix4().makeScale(-1, 1, 1));

        var material = new THREE.MeshBasicMaterial({
            map: THREE.ImageUtils.loadTexture(side.url)
        });
        mesh = new THREE.Mesh(geometry, material);
        scene.add(mesh);

    }

那么,是否有使用Three.js和WebGl渲染引擎将六幅图像投影到全景图中的标准方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-01 14:22:50

你要找的是“天窗”。

有一个最简单的例子:https://stemkoski.github.io/Three.js/Skybox.html

在本部分中,您将插入图像:

代码语言:javascript
复制
var imagePrefix = "images/dawnmountain-";
var directions  = ["xpos", "xneg", "ypos", "yneg", "zpos", "zneg"];
var imageSuffix = ".png";
var skyGeometry = new THREE.CubeGeometry( 5000, 5000, 5000 );   

var materialArray = [];
for (var i = 0; i < 6; i++)
    materialArray.push( new THREE.MeshBasicMaterial({
        map: THREE.ImageUtils.loadTexture( imagePrefix + directions[i] + imageSuffix ),
        side: THREE.BackSide
    }));
var skyMaterial = new THREE.MeshFaceMaterial( materialArray );
var skyBox = new THREE.Mesh( skyGeometry, skyMaterial );
scene.add( skyBox );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29375594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档