2016-03-27 83 views
0

我是新来的JavaScript和three.js,并试图为我已加载的这个凳子的框架做一个“铬材料”。从我读过的东西中我需要一个立方体相机来创造一种反射的幻觉。经过几天的在线搜索,我无法想象为什么我无法实现它的工作。它只是渲染框架黑色(和座位是黑色的,但这是一个单独的问题)。有人能帮忙吗?多维数据集相机不工作

//webGL 

var scene = new THREE.Scene(); 
var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000); 

camera.position.set(0, 16, 25); 
camera.rotation.x += -0.32; 

var renderer = new THREE.WebGLRenderer(); 
renderer.setSize(window.innerWidth, window.innerHeight); 
document.body.appendChild(renderer.domElement); 

cubeCamera = new THREE.CubeCamera(1, 1000, 256); // parameters: near, far, resolution 
cubeCamera.renderTarget.texture.minFilter = THREE.LinearMipMapLinearFilter; // mipmap filter 
scene.add(cubeCamera); 

///LOADERS 
var loadTexture = new THREE.TextureLoader(); 
var loaderJs = new THREE.JSONLoader(); 


///TEXTURES 
var skyTexture = loadTexture.load("textures/background.jpg"); 
var seatTexture = loadTexture.load("textures/Maharam_Mister_Notice_Diffuse.jpg"); 

///MATERIALS 
var skyMaterial = new THREE.MeshBasicMaterial({ 
    side: THREE.DoubleSide, 
    map: skyTexture 
}); 
var frameMaterial = new THREE.MeshLambertMaterial({ 
    //envMap: cubeCamera.renderTarget, 
    color: 0xffffff 
}); 
var seatMaterial = new THREE.MeshLambertMaterial({ 
     map: seatTexture 
}); 


///GEOMETRY and MESHES 
var frameGeo; 

var skyGeo = new THREE.SphereGeometry(30, 30, 30); 
var skySphere = new THREE.Mesh(skyGeo, skyMaterial); 
scene.add(skySphere); 

loaderJs.load("models/stoolFrame.js", function(){ 
    frameGeo = new THREE.Mesh(frameGeo, frameMaterial); 
    frameGeo.scale.set(.5, .5, .5); 
    barStool.add(frameGeo); 
}); 

loaderJs.load("models/stoolSeat.js", function (seatGeo){ 
    seatGeo = new THREE.Mesh(seatGeo, seatMaterial); 
    seatGeo.scale.set(.5, .5, .5); 
    barStool.add(seatGeo); 
}); 


var barStool = new THREE.Object3D(); 
scene.add(barStool); 

    var render = function() { 

     requestAnimationFrame(render); 
     barStool.rotation.y += 0.01; 

     frameGeo.visible = false; 
     cubeCamera.position.copy(frameGeo.position); 
     cubeCamera.updateCubeMap(renderer, scene); 
     frameGeo.visible = true; 


     renderer.render(scene, camera); 
    }; 



render(); 

回答

0

我试图帮助你,因为我在你的场景中看到很多错误。

如果你添加一个对象到object3d中,你不必将它添加到场景中,当你添加barStool的时候,你也添加了所有的孩子。

js加载后调用render函数是没有必要的,当你把对象放到场景中时它会自动呈现。

,如果你想添加与cubecamera你必须使它的反映,在渲染循环中,您必须插入下面的行隐藏更新镶边对象世界反射贴图:

requestAnimationFrame(render); 
barStool.rotation.y += 0.01; 

frameGeo.visible=false; 
cubeCamera.position.copy(frameGeo.position); 
cubeCamera.updateCubeMap(renderer, scene); 
frameGeo.visible = true; 

renderer.render(scene, camera); 

我建议你从一个简单的场景开始,检查它是否正确渲染,然后添加新的功能...一步一步...

+0

Thankyou为您的回应!您对cubeCamera的评论很有意义。但是,我收到一个错误“frameGeo未定义。”我遇到过类似的问题 - 我相信它是因为“frameGeo”是一个嵌套在加载函数中的变量。如果我无法自己解决,我可能需要发布有关该问题的另一个问题。 –

+0

你必须在脚本的顶部声明'var frameGeo;'。 –

+0

再次感谢您与我一起努力。我已经实现了你的建议(正确的我认为),但得到以下错误:WebGL:INVALID_OPERATION:bindTexture:纹理不能用于多个目标 localhost /:1 [.CommandBufferContext] RENDER WARNING:Render count或primcount为0 。 –