2016-04-05 22 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; 

一部について「キャッチされない例外TypeErrorは、プロパティ 『目に見える』未定義のを設定できません」。それが何らかの形で影に影響しているのでしょうか?私はコードのその部分をコメントすることができ、それはstoolframes "反射"の外観にほとんど影響を与えません。しかし、それはもはや球に反映されなくなります。どんな助けも大歓迎です。

///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の強度を同時に低下させたい場合があります。

シャドウは、バックフェースだけがシャドウを投げている場合には、実際には正しいです。スツールはシートの下に空洞があるように見えます。言い換えれば、シートは閉じたボリュームではありません。あなたの座席の下側に底を追加してください。

また、あなたはそれがローダコールバックで定義される前に、あなたはアニメーションループでframeMeshにアクセスしているので、最後に、あなたがエラーを取得している

renderer.shadowMap.cullFace = THREE.CullFaceNone; 

を使用して、そのままモデルと実験を残すことができます。コールバックは非同期です。

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

three.js r.75

+1

はあなただ提案が働いていました!どうもありがとうございました。私は周りの光の動きを知りました - 彼らは影の暗闇の特徴を取り除いた愚か者です。 「最後に、アニメーションループのframeMeshがローダーコールバックで定義される前にアクセスしているため、エラーが発生しています。コールバックは非同期です。」 –

+0

私はjavascriptとスクリプティングには一般的ではないので、 "ローダーコールバックで定義された"のような用語のいくつかは、この分野の知識のこの時点で私を逃れます。周辺光に関しては –

+0

となります。周辺光からオブジェクトを隠す方法はありますか?私が環境光を追加する唯一の理由は、影を明るくする目的のためであり、将来はシーン内の他の要素に影響を与えたくありません。 –

関連する問題