js vr实现
VR 实现的基本方法
使用 JavaScript 实现 VR(虚拟现实)体验通常需要结合 WebXR API 和 Three.js 等 3D 库。WebXR 是浏览器提供的原生 API,用于处理 VR 和 AR 设备输入与渲染,而 Three.js 简化了 3D 场景的创建。
环境准备
确保浏览器支持 WebXR API(如 Chrome、Firefox 或 Edge)。现代浏览器已内置支持,但可能需要启用标志或更新至最新版本。安装 Three.js 库:

npm install three
或通过 CDN 引入:

<script src="https://cdn.jsdelivr.net/npm/three@0.132.2/build/three.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/three@0.132.2/examples/js/controls/VRControls.js"></script>
<script src="https://cdn.jsdelivr.net/npm/three@0.132.2/examples/js/effects/VREffect.js"></script>
初始化 WebXR 场景
创建一个基础的 Three.js 场景,并启用 WebXR 支持:
import * as THREE from 'three';
import { VRButton } from 'three/examples/jsm/webxr/VRButton.js';
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// 启用 WebXR
renderer.xr.enabled = true;
document.body.appendChild(VRButton.createButton(renderer));
// 添加立方体测试对象
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
camera.position.z = 5;
// 动画循环
function animate() {
renderer.setAnimationLoop(function() {
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
});
}
animate();
处理用户交互
通过 WebXR 的输入源(如手柄)实现交互。添加手柄控制器并检测输入事件:
const controller = renderer.xr.getController(0);
scene.add(controller);
controller.addEventListener('selectstart', () => {
console.log('Trigger pressed');
});
controller.addEventListener('selectend', () => {
console.log('Trigger released');
});
优化与发布
- 性能优化:减少多边形数量,使用压缩纹理,避免频繁的垃圾回收。
- 跨设备测试:在 Oculus Quest、HTC Vive 等设备上测试兼容性。
- 部署 HTTPS:WebXR 要求站点运行在安全上下文(HTTPS 或 localhost)。
完整示例代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WebXR with Three.js</title>
<style>body { margin: 0; }</style>
</head>
<body>
<script src="https://cdn.jsdelivr.net/npm/three@0.132.2/build/three.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/three@0.132.2/examples/js/webxr/VRButton.js"></script>
<script>
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
renderer.xr.enabled = true;
document.body.appendChild(VRButton.createButton(renderer));
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
camera.position.z = 5;
renderer.setAnimationLoop(function() {
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
});
</script>
</body>
</html>
通过以上步骤,可以快速搭建一个基础的 WebXR VR 场景。进一步扩展可添加物理引擎、复杂模型或多人协作功能。






