2015-01-18 3 views
1

나는 three.js를 배우기 시작합니다. 웹 사이트의 시작하기 섹션을 공부하고 예제를 살펴 보았지만 많은 것들을 알 수는 없습니다.three.js 큐브 안에 카메라 위치

내가하고 싶은 것은 큐브 (상자)를 만들고 그 가운데에 카메라를 넣어서 각면의 안쪽을 볼 수있게하려는 것입니다. 이것은 실제로 가능합니까?

var camera, scene, renderer; 

var isUserInteracting = false, 
    onMouseDownMouseX = 0, onMouseDownMouseY = 0, 
    lon = 0, onMouseDownLon = 0, 
    lat = 0, onMouseDownLat = 0, 
    phi = 0, theta = 0; 

init(); 
animate(); 

function init() { 

    var container, mesh; 

    container = document.getElementById('container'); 

    camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 1, 1100); 
    camera.target = new THREE.Vector3(1, 1, 1); 

    scene = new THREE.Scene(); 

    var geometry = new THREE.BoxGeometry(7, 7, 7); 
    geometry.applyMatrix(new THREE.Matrix4().makeScale(-1, 1, 1)); 


var material = [ 
    new THREE.MeshBasicMaterial({ color: 0x8bf2a7 }), 
    new THREE.MeshBasicMaterial({ color: 0x1ad9a5 }), 
    new THREE.MeshBasicMaterial({ color: 0xdadcad }), 
    new THREE.MeshBasicMaterial({ color: 0xb1b1b1 }), 
    new THREE.MeshBasicMaterial({ color: 0x3a3a3a }), // front 
    new THREE.MeshBasicMaterial({ color: 0xf5f5f5 }) 
    ]; 
    mesh = new THREE.Mesh(geometry, new THREE.MeshFaceMaterial(material)); 

    scene.add(mesh); 

    renderer = new THREE.WebGLRenderer(); 
    renderer.setPixelRatio(window.devicePixelRatio); 
    renderer.setSize(window.innerWidth, window.innerHeight); 
    container.appendChild(renderer.domElement); 

    document.addEventListener('mousedown', onDocumentMouseDown, false); 
    document.addEventListener('mousemove', onDocumentMouseMove, false); 
    document.addEventListener('mouseup', onDocumentMouseUp, false); 

    document.addEventListener('dragover', function (event) { 

     event.preventDefault(); 
     event.dataTransfer.dropEffect = 'copy'; 

    }, false); 

    document.addEventListener('dragenter', function (event) { 

     document.body.style.opacity = 0.5; 

    }, false); 

    document.addEventListener('dragleave', function (event) { 

     document.body.style.opacity = 1; 

    }, false); 

    document.addEventListener('drop', function (event) { 

     event.preventDefault(); 

     var reader = new FileReader(); 
     reader.addEventListener('load', function (event) { 

      material.map.image.src = event.target.result; 
      material.map.needsUpdate = true; 

     }, false); 
     reader.readAsDataURL(event.dataTransfer.files[ 0 ]); 

     document.body.style.opacity = 1; 

    }, false); 

    // 

    window.addEventListener('resize', onWindowResize, false); 

} 

function onWindowResize() { 

    camera.aspect = window.innerWidth/window.innerHeight; 
    camera.updateProjectionMatrix(); 

    renderer.setSize(window.innerWidth, window.innerHeight); 

} 

function onDocumentMouseDown(event) { 

    event.preventDefault(); 

    isUserInteracting = true; 

    onPointerDownPointerX = event.clientX; 
    onPointerDownPointerY = event.clientY; 

    onPointerDownLon = lon; 
    onPointerDownLat = lat; 

} 

function onDocumentMouseMove(event) { 

    if (isUserInteracting === true) { 

     lon = (onPointerDownPointerX - event.clientX) * 0.1 + onPointerDownLon; 
     lat = (event.clientY - onPointerDownPointerY) * 0.1 + onPointerDownLat; 

    } 

} 

function onDocumentMouseUp(event) { 

    isUserInteracting = false; 

} 

function onDocumentMouseWheel(event) { 

    // WebKit 

    if (event.wheelDeltaY) { 

     camera.fov -= event.wheelDeltaY * 0.05; 

     // Opera/Explorer 9 

    } else if (event.wheelDelta) { 

     camera.fov -= event.wheelDelta * 0.05; 

     // Firefox 

    } else if (event.detail) { 

     camera.fov += event.detail * 1.0; 

    } 

    camera.updateProjectionMatrix(); 

} 

function animate() { 

    requestAnimationFrame(animate); 
    update(); 

} 

function update() { 

    if (isUserInteracting === false) { 

     // lon += 0.1; 

    } 

    lat = Math.max(- 85, Math.min(85, lat)); 
    phi = THREE.Math.degToRad(90 - lat); 
    theta = THREE.Math.degToRad(lon); 

    camera.target.x = 500 * Math.sin(phi) * Math.cos(theta); 
    camera.target.y = 500 * Math.cos(phi); 
    camera.target.z = 500 * Math.sin(phi) * Math.sin(theta); 

    camera.lookAt(camera.target); 

    camera.position.z = 3; 
    /* 
    // distortion 
    camera.position.copy(camera.target).negate(); 
    */ 

    renderer.render(scene, camera); 

} 

내가 실제로 내부에서 큐브를 볼 수 있지만 정확히 내가 원하는 게 아니에요 :

지금 나는이 점에있어, 문서, 다양한 예에서와 유래에 찾고. 방의 정확한 중앙에 카메라를 놓으려는 중이고 카메라 자체를 회전시킬 것입니다. 정확하게 움직이는 방법이 정확하지 않습니다.

+0

에서 자세한 내용을보실 수 있습니다? – gaitat

+0

아니요, 그냥 생각 THREE.WebGLRenderer 70, 내가 정상적인 것 같아요 – Carlo

답변

1

당신이 이것을 보면 fiddle이 유일한 차이점입니다.

다음 줄을 주석 처리하고 그 효과를 확인하십시오.

THREE.ImageUtils.crossOrigin = ''; 

또한 당신은 당신이 콘솔에서 오류 메시지를받을 수 있나요이 issue

+0

내가 그것을 변경하려고하면 기존의 이미지를 퍼팅, 나는 콘솔에 오류가 발생하기 때문에 경로가 올바른 것 같아요 – Carlo

+0

이것은 실제로 나를 도왔습니다 텍스처를 사용하지만 여전히 카메라를 상자의 중앙에 배치하는 것이 주된 문제입니다. 나는 다른 코드를 함께 넣었고 나는 거의 그곳에 있다고 생각한다. 그래서 나는 상자가 (0,0,0) 주위에 중심에 있고 그 아웃 사이즈 만이 렌더되도록 내 질문 – Carlo

+0

을 업데이트 할 것이다. 따라서 (0, 0, 0)에 카메라를 올려 놓으면 아무 것도 볼 수 없습니다. – gaitat

관련 문제