本文目录导读:

- 核心思路
- 方案一:使用 Photo Sphere Viewer(推荐,简单高效)
- 方案二:使用 Three.js 手动实现(灵活度高)
- 方案三:使用库 Panolens.js(功能全面)
- 完整PHP项目结构示例
- 注意事项
- 推荐路径
在PHP项目中实现全景展示,通常需要结合前端3D渲染库,因为PHP本身主要负责后端数据处理和页面渲染,以下是几种常见且成熟的实现方案:
核心思路
PHP生成包含全景图片(或视频)URL的HTML/JavaScript代码,前端使用WebGL库(如Three.js、Panolens.js)或轻量级库(如Photo Sphere Viewer)进行渲染。
使用 Photo Sphere Viewer(推荐,简单高效)
这是一个专门为全景图片设计的轻量级HTML5/JavaScript库,无需复杂3D知识。
步骤:
-
准备全景图片
- 图片需为等距柱状投影格式(长宽比2:1,如 8192x4096px)。
- 使用PHP处理上传和存储。
-
后端PHP代码(upload.php)
<?php if ($_FILES['panorama']['error'] === UPLOAD_ERR_OK) { $uploadDir = 'uploads/'; $filename = uniqid() . '.jpg'; move_uploaded_file($_FILES['panorama']['tmp_name'], $uploadDir . $filename); // 返回图片URL给前端 echo json_encode(['url' => $uploadDir . $filename]); } ?> -
前端HTML + JavaScript
<!DOCTYPE html> <html> <head> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@photo-sphere-viewer/core@5/dist/photo-sphere-viewer.min.css"/> <script src="https://cdn.jsdelivr.net/npm/three@0.159.0/build/three.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/@photo-sphere-viewer/core@5/dist/photo-sphere-viewer.min.js"></script> </head> <body> <div id="viewer"></div> <script> // 从PHP获取图片URL(假设通过API或直接嵌入) const panoramaUrl = 'uploads/example.jpg'; // 或通过PHP动态输出:<?php echo $imageUrl; ?> const viewer = new PhotoSphereViewer.Viewer({ container: document.getElementById('viewer'), panorama: panoramaUrl, caption: '我的全景视图', loadingImg: 'https://cdn.jsdelivr.net/npm/@photo-sphere-viewer/core@5/assets/spinner.svg' }); </script> </body> </html>
优点:代码量少,支持陀螺仪、自动旋转、注释标记(Markers)、VR模式等。
使用 Three.js 手动实现(灵活度高)
如果需要自定义交互或混合其他3D元素(如热点、导航箭头),推荐Three.js。
核心代码示例(PHP嵌入):
<?php
$imageUrl = 'uploads/panorama.jpg'; // 从数据库获取
?>
<script type="importmap">
{
"imports": {
"three": "https://unpkg.com/three@0.159.0/build/three.module.js"
}
}
</script>
<script type="module">
import * as THREE from 'three';
import { OrbitControls } from 'https://unpkg.com/three@0.159.0/examples/jsm/controls/OrbitControls.js';
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.body.appendChild(renderer.domElement);
// 创建全景球体
const geometry = new THREE.SphereGeometry(500, 60, 40);
// 注意:球体需要内表面可见
geometry.scale(-1, 1, 1); // 翻转法线
const texture = new THREE.TextureLoader().load('<?php echo $imageUrl; ?>');
const material = new THREE.MeshBasicMaterial({ map: texture });
const sphere = new THREE.Mesh(geometry, material);
scene.add(sphere);
// 添加控件(允许拖拽查看)
const controls = new OrbitControls(camera, renderer.domElement);
controls.enableZoom = true;
controls.rotateSpeed = 0.5;
camera.position.set(0, 0, 0.1);
function animate() {
requestAnimationFrame(animate);
controls.update();
renderer.render(scene, camera);
}
animate();
</script>
注意:需要确保图片CORS跨域问题,以及球体内部摄像机位置。
使用库 Panolens.js(功能全面)
适合需要快速集成热点、注释、陀螺仪的场景。
<?php
$panoramaUrl = 'uploads/scene1.jpg';
?>
<script src="https://cdn.jsdelivr.net/npm/three@0.159.0/build/three.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/panolens@0.11.0/build/panolens.min.js"></script>
<div id="panorama"></div>
<script>
const panorama = new PANOLENS.ImagePanorama('<?php echo $panoramaUrl; ?>');
const viewer = new PANOLENS.Viewer({
container: document.getElementById('panorama'),
autoRotate: true,
autoRotateSpeed: 0.3,
controlBar: true
});
viewer.add(panorama);
</script>
完整PHP项目结构示例
project/
│
├── uploads/ # 全景图片存储
│ └── panorama_123.jpg
│
├── index.php # 展示页面
├── upload.php # 图片上传处理
└── view.php # 全景查看页面(接收图片ID)
view.php 关键代码(从数据库获取图片路径):
<?php
// 假设从数据库获取
$imageId = $_GET['id'];
$imageUrl = 'uploads/panorama_'.$imageId.'.jpg';
?>
<!DOCTYPE html>
<html>
<!-- 引入Photo Sphere Viewer或Three.js -->
<!-- 使用PHP动态输出$imageUrl -->
<script>
const viewer = new PhotoSphereViewer.Viewer({
panorama: '<?php echo $imageUrl; ?>',
// ...
});
</script>
</html>
注意事项
- 性能优化:
- 使用多分辨率切片(如Google Photo Sphere标准),大图加载更快,可用工具(如KrPano、Marzipano)生成,PHP负责提供JSON配置。
- 启用CDN或使用WebP格式图片。
- 移动端适配:
- 使用
DeviceOrientationControls实现陀螺仪随手机转动。 - 设置
touchAction: 'none'防止触摸滚动冲突。
- 使用
- 互动热点:
- 在全景中添加可点击的标记(跳转到另一个场景、显示信息框)。
- 库支持:Photo Sphere Viewer的
MarkersPlugin,Three.js通过Raycaster检测。
- 视频全景:
- 使用
VideoTexture(Three.js)或EquirectangularReflectionMapping。 - 库:
@photo-sphere-viewer/video-plugin。
- 使用
推荐路径
- 简单图片展示 → Photo Sphere Viewer(最快实现)
- 需要复杂交互/游戏化 → Three.js
- 多场景漫游 → Panolens.js(支持场景间切换动画)
如果需要动态生成全景数据(如房产3D漫游),可以结合PHP读取数据库中的场景列表,前端通过API获取并初始化多个全景视图。