首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >three.js -重置摄像头以查看VR中的特定方向

three.js -重置摄像头以查看VR中的特定方向
EN

Stack Overflow用户
提问于 2018-02-27 03:56:53
回答 1查看 981关注 0票数 1

我有一个有多个导航点的场景。当我使用头盔(Oculus rift)传送到VR中的任何位置时,相机会记住它应该在新位置看的方向,这在逻辑上是正确的行为。

但我想要的是让相机指向其他方向(主要是原点)。

为此,当我传送到新位置时,我将摄像机位置重置为(0,0,0)。它可以在台式机上工作,但当我使用HMD (Oculus Rift)时,相机不会重置为(0,0,0)。

任何建议都会非常有帮助。

EN

回答 1

Stack Overflow用户

发布于 2018-02-27 04:48:53

首先,不是直接重置相机,而是将相机添加到装备中并进行操作。您还必须做一些数学计算,以说明用户的方向和位置相对于他们的游戏空间。

下面是一个有效的演示:

代码语言:javascript
复制
const camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );
const scene = new THREE.Scene();

const subject = box(1, 1, 1);
subject.position.set(2, 0, 4);
scene.add(subject);

camera.position.y = 1;
const rig = new THREE.Object3D();
rig.add(camera);
scene.add(rig);

const teleportAndLook = (function () {
  const cameraDirection = new THREE.Vector3();
  const teleportToLook = new THREE.Vector3();
  const cameraOffset = new THREE.Vector3();
  return function (teleportPos, lookPos, rig, camera){
    cameraDirection.set(0, 0, -1);
    cameraDirection.applyQuaternion(camera.quaternion);
    cameraDirection.y = 0;
    cameraDirection.normalize();

    teleportToLook.subVectors(lookPos, teleportPos)
    teleportToLook.normalize();
    
    rig.quaternion.setFromUnitVectors(cameraDirection, teleportToLook);
    
    cameraOffset.copy(camera.position);
    cameraOffset.applyQuaternion(rig.quaternion);
    cameraOffset.y = 0;
    rig.position.subVectors(teleportPos, cameraOffset);
  }
})();

function randomTeleport() { 
  const teleportPos = new THREE.Vector3();
  teleportPos.x = (Math.random() - 0.5) * 2 * 5;
  teleportPos.z = (Math.random() - 0.5) * 2 * 5;
  teleportAndLook(teleportPos, subject.position, rig, camera);
}
randomTeleport();

const renderer = new THREE.WebGLRenderer({antialias: true});
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.vr.enabled = true;
renderer.shadowMap.enabled = true;
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
document.body.appendChild( renderer.domElement );
document.body.appendChild(WEBVR.createButton(renderer));

function box(w, h, d) {
  const box = new THREE.Mesh(
    new THREE.BoxGeometry(w, h, d),
    new THREE.MeshLambertMaterial({color: new THREE.Color().setHSL(Math.random(), 0.2, 0.2)})
  );
  box.castShadow = true;
  box.receiveShadow = true;
  return box;
}

const light = new THREE.DirectionalLight();
light.position.set(8, 10, 5)
light.castShadow = true;
light.shadow.mapSize.setScalar(2048);
scene.add(light)
scene.add(new THREE.AmbientLight('white', 0.4));

const floor = box(20, 0.01, 20)
floor.position.y = -0.01;
scene.add(floor);
scene.add(new THREE.GridHelper()); 

renderer.domElement.addEventListener("click", randomTeleport);
setInterval(randomTeleport, 3000)

function animate() {
  renderer.render( scene, camera );
};

renderer.setAnimationLoop(animate);

window.addEventListener("resize", () => {
  renderer.setSize(window.innerWidth, window.innerHeight);
  camera.aspect = window.innerWidth / window.innerHeight;
  camera.updateProjectionMatrix();
});
代码语言:javascript
复制
body { margin: 0; font-size: 0; }
代码语言:javascript
复制
<script src="https://unpkg.com/three@0.94.0/examples/js/vr/WebVR.js"></script>
<script src="https://unpkg.com/three@0.94.0/build/three.min.js"></script>

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48996130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档