2016-12-09 10 views
0

私はThree.jsを使用してWebVR環境を作成しようとしています。私はCinema4Dからいくつかのシーンをエクスポートし、Three.jsのColladaloaderでそれらをロードしました。今私のGoogle Cardboardでこの環境を試したかったのですが、私は両方の目に分割画面を用意する必要がありました。WebVRを使用した目の分離

VR効果を達成するためにnpmモジュールthree-stereo-effectを使用しましたが、ダンボールで使用するとオーバーラップしています。私はそれを見て、WebVRの例の多くは、各目(example of what I mean)の丸い四角形ではなく、直線の四角形ではないことを見て、私はそれを修正するために行列を見つける必要があると思った(this repositoryの例を見ると)。しかし、その後、私はVRトンネルレースゲームをダウンロードし、直方体を使用していることを見て、ビジョンはうまくいきました。

私はステレオ効果のeyeSeparationが間違っていると思っています。私はStereoEffectモジュールでeyeSeparationプロパティを使用してみましたが、それを試しましたが、値を推測してはいけないと思います...

私は正しい解決策を見つけるためにここにいるのですか?または、なぜ私の3Dシーンがダンボールを使用するときに良いビジョンを与えていないのか、間違った方向を見ていますか?

これは私が実験しているコードです。 PDF "Scalable Multi-view Stereo Camera Array for Real World Real-Time Image Capture and Three-Dimensional Displays"から

import {sets} from './data/'; 

import * as THREE from 'three'; 
import threeOrbitControls from 'three-orbit-controls'; 
import ColladaLoader from 'three-collada-loader'; 
import threeStereoEffect from 'three-stereo-effect'; 

import {BufferLoader} from './modules/sound'; 
import {SpawnObject} from './modules/render'; 

const OrbitControls = threeOrbitControls(THREE); 
const StereoEffect = threeStereoEffect(THREE); 

let scene, camera, renderer; 
let audioCtx, bufferLoader; 

const notes = []; 
let stereoEffect = null; 

const init =() => { 
    window.AudioContext = window.AudioContext || window.webkitAudioContext; 

    audioCtx = new AudioContext(); 
    bufferLoader = new BufferLoader(audioCtx); 

    bufferLoader.load(sets.drums) 
    .then(data => spawnObject(data)); 


    initEnvironment(); 

}; 

const spawnObject = data => { 

    for (let i = 0;i < 5;i ++) { 
    const bol = new SpawnObject(`object.dae`, audioCtx, data[0], scene, false); 
    notes.push(bol); 
    } 

    // console.log(notes); 
}; 

const initEnvironment =() => { 

    scene = new THREE.Scene(); 
    camera = new THREE.PerspectiveCamera(
    45, window.innerWidth/window.innerHeight, 
    1, 10000 
); 

    renderer = new THREE.WebGLRenderer(); 
    renderer.setSize(window.innerWidth, window.innerHeight); 

    stereoEffect = new StereoEffect(renderer); 
    // stereoEffect.eyeSeparation = 1; 
    stereoEffect.setSize(window.innerWidth, window.innerHeight); 

    console.log(stereoEffect); 

    document.querySelector(`main`).appendChild(renderer.domElement); 

    camera.position.set(0, 0, 2); 
    camera.lookAt(scene.position); 

    new OrbitControls(camera); 

    //LIGHTS 
    const light = new THREE.PointLight(0xFFFFFF); 
    light.position.set(0, 0, 9); 
    light.castShadow = true; 
    light.shadow.mapSize.width = 1024; 
    light.shadow.mapSize.height = 1024; 
    light.shadow.camera.near = 10; 
    light.shadow.camera.far = 100; 
    scene.add(light); 

    // const hemiLight = new THREE.HemisphereLight(0xffffff, 0xffffff, 0.6); 
    // hemiLight.color.setHSL(0.6, 1, 0.6); 
    // hemiLight.groundColor.setHSL(0.095, 1, 0.75); 
    // hemiLight.position.set(0, 500, 0); 
    // scene.add(hemiLight); 
    // 
    // const dirLight = new THREE.DirectionalLight(0xffffff, 1); 
    // dirLight.color.setHSL(0.1, 1, 0.95); 
    // dirLight.position.set(- 1, 1.75, 1); 
    // dirLight.position.multiplyScalar(50); 
    // scene.add(dirLight); 
    // dirLight.castShadow = true; 


    //FLOOR 
    const matFloor = new THREE.MeshPhongMaterial(); 
    const geoFloor = new THREE.BoxGeometry(2000, 1, 2000); 
    const mshFloor = new THREE.Mesh(geoFloor, matFloor); 

    matFloor.color.set(0x212E39); 
    mshFloor.receiveShadow = true; 
    mshFloor.position.set(0, - 1, 0); 

    scene.add(mshFloor); 


    //ENVIRONMENT 
    const loader = new ColladaLoader(); 

    loader.load(`../assets/environment.dae`, collada => { 
    collada.scene.traverse(child => { 
     child.castShadow = true; 
     child.receiveShadow = true; 
    }); 

    scene.add(collada.scene); 
    render(); 
    }); 
}; 

const render =() => { 

    // stereoEffect.render(scene, camera); 
    // effect.render(scene, camera); 

    renderer.shadowMap.enabled = true; 
    renderer.shadowMap.type = THREE.PCFSoftShadowMap; 

    renderer.gammaInput = true; 
    renderer.gammaOutput = true; 

    renderer.setClearColor(0xdddddd, 1); 
    stereoEffect.render(scene, camera); 

    requestAnimationFrame(render); 
}; 



init(); 

答えて

0

2.1.1両眼視差

両眼視差は、空間内の所与の点の2つの網膜突起の位置の差です。この位置の相違は、2つの眼が横方向に分離され、したがって、2つのわずかに異なる視点から世界を見ることに起因する。平均的な人にとって、横方向の分離は、眼間距離としても知られており、65mmである。集団の大部分は、平均眼内距離の±10mm以内に眼の分離を有する。

さまざまな顔の形をした友人と少しテストしたところ、デバイスとそれを使用しているユーザーのためにeyeSeparationの値が幸せだったようです。私はまた、彼らがステレオ体験において不一致または重複を見つけた場合にユーザーが選択できるように、eyeSeparationのいくつかの異なる設定を可能にするいくつかの設定パネルを提供する。通常は、これはステレオのアライメントでダイヤルするために同じシステムに接続されたキーボードで行われると思いますが、あなたはボール紙になっているので、ユーザーは正しく試行錯誤する必要があります。

関連する問題