php 全景vr 实现
使用 Three.js 实现 PHP 全景 VR
PHP 本身不直接处理全景 VR 渲染,但可以结合前端库如 Three.js 实现。PHP 负责存储和提供全景图片资源。
安装 Three.js 库
npm install three
HTML 基础结构
<div id="panorama-container"></div>
<script src="path/to/three.min.js"></script>
JavaScript 核心代码
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.getElementById('panorama-container').appendChild(renderer.domElement);
const geometry = new THREE.SphereGeometry(500, 60, 40);
geometry.scale(-1, 1, 1);
const texture = new THREE.TextureLoader().load('panorama.jpg');
const material = new THREE.MeshBasicMaterial({ map: texture });
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
camera.position.set(0, 0, 0.1);
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera);
}
animate();
PHP 后端处理全景图片
创建图片上传接口
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$targetDir = "panoramas/";
$targetFile = $targetDir . basename($_FILES["panorama"]["name"]);
move_uploaded_file($_FILES["panorama"]["tmp_name"], $targetFile);
echo json_encode(['status' => 'success', 'path' => $targetFile]);
}
?>
获取图片列表接口

<?php
$panoramas = glob("panoramas/*.{jpg,jpeg,png,gif}", GLOB_BRACE);
echo json_encode(array_map('basename', $panoramas));
?>
添加 VR 设备支持
检测 VR 设备并启用
import { VRButton } from 'three/examples/jsm/webxr/VRButton.js';
renderer.xr.enabled = true;
document.body.appendChild(VRButton.createButton(renderer));
function render() {
renderer.render(scene, camera);
}
renderer.setAnimationLoop(render);
性能优化技巧
使用等距矩形投影格式的图片(2:1宽高比) 推荐分辨率 4096×2048 或 8192×4096
启用渐进式加载
const texture = new THREE.TextureLoader().load(
'panorama.jpg',
undefined,
undefined,
() => console.error('Error loading texture')
);
添加加载进度指示器

const manager = new THREE.LoadingManager();
manager.onProgress = (url, loaded, total) => {
console.log(`Loading ${url}: ${(loaded/total)*100}%`);
};
const texture = new THREE.TextureLoader(manager).load('panorama.jpg');
移动端适配处理
添加陀螺仪控制
window.addEventListener('deviceorientation', (event) => {
camera.rotation.set(
THREE.MathUtils.degToRad(event.beta) - Math.PI/2,
THREE.MathUtils.degToRad(event.alpha),
THREE.MathUtils.degToRad(event.gamma)
);
}, true);
触摸控制实现
const controls = new THREE.OrbitControls(camera, renderer.domElement);
controls.enableZoom = false;
controls.enablePan = false;
高级功能扩展
添加热点标记
const hotspotGeometry = new THREE.SphereGeometry(0.5, 16, 16);
const hotspotMaterial = new THREE.MeshBasicMaterial({color: 0xff0000});
const hotspot = new THREE.Mesh(hotspotGeometry, hotspotMaterial);
hotspot.position.set(1, 1, -3);
scene.add(hotspot);
多场景切换
function loadNewPanorama(newTextureUrl) {
new THREE.TextureLoader().load(newTextureUrl, (texture) => {
mesh.material.map = texture;
mesh.material.needsUpdate = true;
});
}






