2016-04-05 167 views
0

我无法控制THREE.js中的阴影。首先,我场景中的阴影太暗了。从我读过的内容来看,有一个shadowDarkness属性,这个属性在three.js的当前版本中已知可用。有谁知道解决办法?Three.js控制阴影

此外,在附图中:“背面”几何不遮挡座位阴影上的光线 - 但是,您可以在球面反射中看到凳子的背面(cubeCamera)。有谁知道如何解决这个问题?

在一个侧面说明:铬给我一个错误“遗漏的类型错误:无法设置的未定义的属性‘可见的’,”关于我的代码

frameMesh.visible = false; 
    cubeCameraFrame.position.copy(frameMesh.position); 
    cubeCameraFrame.updateCubeMap(renderer, scene); 
    frameMesh.visible = true; 

一部分。这能否以某种方式影响阴影?我可以评论这部分代码,它对stoolframe“反射”外观几乎没有影响。然而,它不再反映在这个领域。任何帮助深表感谢。

///webGL - Locking down the Basics 
/////////////////////////////////////////////////////////////Environment Settings/////////////////////////////////////////////////////////////////////// 
///Renderer 
var scene = new THREE.Scene(); 

var renderer = new THREE.WebGLRenderer(); 
renderer.setSize(window.innerWidth, window.innerHeight); 
renderer.shadowMapType = THREE.PCFSoftShadowMap; 
renderer.shadowMapEnabled = true; 

document.body.appendChild(renderer.domElement); 

///Camera's 
var camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000); 
scene.add(camera); 

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

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

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

///Controls 



///Lights 


var lightSpot_Right = new THREE.SpotLight(0xffffff); 
lightSpot_Right.position.set(50, 50, 0); 
lightSpot_Right.intensity = 1.25; 
lightSpot_Right.castShadow = true; 

lightSpot_Right.shadowDarkness = 0.1; 

lightSpot_Right.shadowMapWidth = 2048; 
lightSpot_Right.shadowMapHeight = 2048; 

lightSpot_Right.shadowCameraNear = 1; 
lightSpot_Right.shadowCameraFar = 100; 
lightSpot_Right.shadowCameraFov = 65; 
scene.add(lightSpot_Right); 

var lightDirect_Left = new THREE.DirectionalLight(0xffffff, 0.25); 
lightDirect_Left.position.set(-1, 0, 0); 
scene.add(lightDirect_Left); 

///Loaders 
var loadTexture = new THREE.TextureLoader(); 
var loader = new THREE.JSONLoader(); 

///skyBox 
var imagePrefix = "textures/"; 
var directions = ["skyboxRight", "skyboxLeft", "skyboxTop", "skyboxBottom", "skyboxFront", "skyboxBack"]; 
var imageSuffix = ".jpg"; 

var skyMaterialArray = []; 
for (var i = 0; i < 6; i++) 
    skyMaterialArray.push(new THREE.MeshBasicMaterial({ 
     map: new THREE.TextureLoader().load(imagePrefix + directions[i] + imageSuffix), 
     side: THREE.BackSide 
    })); 
var skyMaterial = new THREE.MeshFaceMaterial(skyMaterialArray); 


var skyGeometry = new THREE.CubeGeometry(1000, 1000, 1000); 
var skyBox = new THREE.Mesh(skyGeometry, skyMaterial); 
scene.add(skyBox); 


////////////////////////////////////////////////////////Object Settings////////////////////////////////////////////////////////////////// 

//Textures 
var seatTexture = loadTexture.load("textures/Maharam_Mister_Notice_Diffuse.jpg"); 
seatTexture.wrapS = THREE.RepeatWrapping; 
seatTexture.wrapT = THREE.RepeatWrapping; 
seatTexture.repeat.set(3, 3); 

var conceteDiffuse = loadTexture.load("textures/Contrete_Diffuse.jpg"); 
conceteDiffuse.wrapS = THREE.RepeatWrapping; 
conceteDiffuse.wrapT = THREE.RepeatWrapping; 
conceteDiffuse.repeat.set(3, 3); 
var conceteNormal = loadTexture.load("textures/Contrete_Normal.jpg"); 
conceteNormal.wrapS = THREE.RepeatWrapping; 
conceteNormal.wrapT = THREE.RepeatWrapping; 
conceteNormal.repeat.set(3, 3); 
var conceteSpecular = loadTexture.load("textures/Contrete_Specular.jpg"); 
conceteSpecular.wrapS = THREE.RepeatWrapping; 
conceteSpecular.wrapT = THREE.RepeatWrapping; 
conceteSpecular.repeat.set(3, 3); 

///Materials 
var seatMaterial = new THREE.MeshLambertMaterial({ 
    map: seatTexture, 
    side: THREE.DoubleSide 
}); 
var frameMaterial = new THREE.MeshPhongMaterial({ 
    envMap: cubeCameraFrame.renderTarget, 
    color: 0xcccccc, 
    emissive: 0x404040, 
    shininess: 10, 
    reflectivity: .8 
}); 
var frameHardwareMat = new THREE.MeshPhongMaterial({ 
    color: 0x000000 
}); 
var feetMat = new THREE.MeshPhongMaterial({ 
    color: 0x050505, 
    shininess: 99 
}); 

var sphereMat = new THREE.MeshPhongMaterial({ 
    envMap: cubeCameraSphere.renderTarget 

}); 

var groundMat = new THREE.MeshPhongMaterial({ 
    map: conceteDiffuse, 
    specularMap: conceteSpecular, 
    normalMap: conceteNormal, 
    normalScale: new THREE.Vector2(0.0, 0.6), 
    shininess: 50 
}); 

///Geometry and Meshes 
var barStool = new THREE.Object3D(); 
scene.add(barStool); 

var seatMesh; 
loader.load("models/stoolSeat.js", function (geometry, material) { 
    seatMesh = new THREE.Mesh(geometry, seatMaterial); 
    seatMesh.scale.set(.5, .5, .5); 
    seatMesh.castShadow = true; 
    seatMesh.receiveShadow = true; 
    barStool.add(seatMesh); 

}); 

var frameMesh; 
loader.load("models/stoolFrame.js", function (geometry, material) { 
    frameMesh = new THREE.Mesh(geometry, frameMaterial); 
    frameMesh.scale.set(.5, .5, .5); 
    frameMesh.castShadow = true; 
    barStool.add(frameMesh); 
}); 

var frameFeetMesh; 
loader.load("models/stoolFeet.js", function (geometry, material) { 
    frameFeetMesh = new THREE.Mesh(geometry, feetMat); 
    frameFeetMesh.scale.set(.5, .5, .5); 
    frameFeetMesh.castShadow = true; 
    barStool.add(frameFeetMesh); 
}); 

var frameHardwareMesh; 
loader.load("models/stoolHardware.js", function (geomtry, material) { 
    frameHardwareMesh = new THREE.Mesh(geomtry, frameHardwareMat); 
    frameHardwareMesh.scale.set(.5, .5, .5); 
    barStool.add(frameHardwareMesh); 
}); 


var sphereGeo = new THREE.SphereGeometry(2.5, 50, 50); 
var sphereMesh = new THREE.Mesh(sphereGeo, sphereMat); 
scene.add(sphereMesh); 

sphereMesh.position.set(-10, 5, 0); 

var groundGeo = new THREE.PlaneGeometry(100, 50, 1); 
var groundMesh = new THREE.Mesh(groundGeo, groundMat); 
scene.add(groundMesh); 

groundMesh.rotation.x = -90 * Math.PI/180; 
groundMesh.receiveShadow = true; 

///Render Scene 

var render = function() { 

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

    sphereMesh.visible = false; 
    cubeCameraSphere.position.copy(sphereMesh.position); 
    cubeCameraSphere.updateCubeMap(renderer, scene); 
    sphereMesh.visible = true; 

    //frameMesh.visible = false; 
    //cubeCameraFrame.position.copy(frameMesh.position); 
    //cubeCameraFrame.updateCubeMap(renderer, scene); 
    //frameMesh.visible = true; 

    renderer.render(scene, camera); 
}; 

render(); 

enter image description here

回答

2

阴影黑暗中已被删除。最好的解决方法是将环境光添加到场景中。

scene.add(new THREE.AmbientLight(0xffffff, 0.3); 

您可能想要同时降低您的SpotLight的强度。

只有后面的面孔才能投射阴影,阴影实际上是正确的。看起来座椅下方的凳子是空的 - 换句话说,座椅不是封闭的空间。在座位底部添加一个底部。

或者,您也可以留下您的模型,是与实验

renderer.shadowMap.cullFace = THREE.CullFaceNone; 

最后,你是因为你是在动画循环访问frameMesh它在装载机回调定义之前得到错误。回调是异步的。

if (frameMesh !== undefined) { 
    // your code 
} 

three.js所r.75

+1

你建议的工作!非常感谢你。我已经阅读了关于环境光的解决方法 - 它是一个令人失望的,他们带走了阴影黑暗功能。你能详细说明一下你的意思吗?“最后,你正在接收错误,因为你正在动画循环中访问frameMesh,然后它在加载器回调中定义,回调是异步的。” –

+0

我是新来的JavaScript和脚本的一般,所以一些像“在加载程序回调中定义”的术语在我在这方面的知识的这一点回避我。 –

+0

关于环境光解决方法:是否有办法隐藏环境光线中的物体?我添加环境光线的唯一原因是为了减轻阴影的灵魂目的 - 并且将来不希望这会影响场景中的其他元素。 –