|
<html> |
|
|
|
<head> |
|
<title>THREE.6DOF - Image Viewer Example</title> |
|
<meta charset="utf-8"> |
|
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"> |
|
<style> |
|
body { |
|
background: #000; |
|
color: #fff; |
|
padding: 0; |
|
margin: 0; |
|
overflow: hidden; |
|
font-family: georgia; |
|
text-align: center; |
|
} |
|
|
|
a { |
|
color: skyblue; |
|
text-decoration: none |
|
} |
|
|
|
video { |
|
display: none; |
|
} |
|
|
|
#info { |
|
position: absolute; |
|
top: 15px; |
|
width: 100%; |
|
} |
|
|
|
#info_wrapper { |
|
background: rgba(0, 0, 0, 0.7); |
|
} |
|
</style> |
|
|
|
|
|
<link rel="apple-touch-icon" sizes="180x180" href="public/images/favicon/apple-touch-icon.png"> |
|
<link rel="icon" type="image/png" sizes="32x32" href="public/images/favicon/favicon-32x32.png"> |
|
<link rel="icon" type="image/png" sizes="16x16" href="public/images/favicon/favicon-16x16.png"> |
|
<link rel="manifest" href="public/site.webmanifest"> |
|
|
|
|
|
<script src="https://unpkg.com/three@0.147.0/build/three.min.js"></script> |
|
<script src="https://unpkg.com/three@0.147.0/examples/js/controls/OrbitControls.js"></script> |
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.7.6/dat.gui.min.js"></script> |
|
|
|
<script src="public/js/GUIHelper.js"></script> |
|
|
|
|
|
<script src="public/js/three-6dof.min.js"></script> |
|
</head> |
|
|
|
<body> |
|
<script> |
|
'use strict'; |
|
|
|
var rgbBase64Img = window.frameElement?.getAttribute('data-rgb'); |
|
var depthBase64Img = window.frameElement?.getAttribute('data-depth'); |
|
|
|
|
|
var gui = new dat.GUI({ closed: true, closeOnTop: true }); |
|
|
|
|
|
var sixDofViewer; |
|
|
|
|
|
var clock = new THREE.Clock(); |
|
|
|
let enableAnimation = true; |
|
|
|
var scene = new THREE.Scene(); |
|
const w = 1024 |
|
const h = 512 |
|
var renderer = new THREE.WebGLRenderer({ antialias: true }); |
|
|
|
renderer.setSize(window.innerWidth, window.innerHeight); |
|
|
|
document.body.appendChild(renderer.domElement); |
|
|
|
|
|
var camera = new THREE.PerspectiveCamera(55, w / h, 0.001, 1000); |
|
var cameraDolly = new THREE.Object3D(); |
|
cameraDolly.position.y = -1.7; |
|
|
|
cameraDolly.add(camera); |
|
scene.add(cameraDolly); |
|
|
|
|
|
var loadingManager = new THREE.LoadingManager(); |
|
var textureLoader = new THREE.TextureLoader(loadingManager); |
|
|
|
|
|
var colorTexture, depthTexture; |
|
|
|
if (rgbBase64Img && depthBase64Img) { |
|
|
|
textureLoader.load(rgbBase64Img, texture => { colorTexture = texture }); |
|
textureLoader.load(depthBase64Img, texture => { depthTexture = texture }); |
|
} else { |
|
textureLoader.load('public/images/equirectangular/kandao3.jpg', texture => { colorTexture = texture }); |
|
textureLoader.load('public/images/equirectangular/kandao3_depthmap.jpg', texture => { depthTexture = texture }); |
|
} |
|
|
|
|
|
loadingManager.onLoad = () => { |
|
sixDofViewer = new SixDOF.Viewer(colorTexture, depthTexture, |
|
{ |
|
'type': SixDOF.TextureType.SEPERATE, |
|
'style': SixDOF.Style.MESH, |
|
'density': SixDOF.MeshDensity.EXTRA_HIGH, |
|
'displacement': 4.0, |
|
'radius': 6 |
|
}) |
|
scene.add(sixDofViewer); |
|
|
|
|
|
var shaderParams = gui.addFolder('Shader'); |
|
shaderParams.add(sixDofViewer, 'displacement', 0, 7).name('Displacement'); |
|
shaderParams.add(sixDofViewer, 'opacity', 0, 1).name('Opacity'); |
|
shaderParams.add(sixDofViewer, 'pointSize', 0, 10).name('Point Size'); |
|
shaderParams.add(camera, 'fov', 1, 100).name('Camera FOV').onChange(val => { |
|
camera.updateProjectionMatrix(); |
|
}); |
|
shaderParams.add(camera.position, 'x', -10, 10).name('Camera X'); |
|
shaderParams.add(camera.position, 'y', -10, 10).name('Camera Y'); |
|
shaderParams.add(camera.position, 'z', -10, 10).name('Camera Z'); |
|
|
|
shaderParams.add({ 'debugDepth': false }, 'debugDepth') |
|
.name('Debug Depth') |
|
.onChange(val => { |
|
sixDofViewer.toggleDepthDebug(val); |
|
}); |
|
shaderParams.add({ |
|
'changeStyle': () => { } |
|
}, 'changeStyle', { |
|
'Mesh': SixDOF.Style[SixDOF.Style.MESH], |
|
'Wireframe': SixDOF.Style[SixDOF.Style.WIRE], |
|
'Pointcloud': SixDOF.Style[SixDOF.Style.POINTS] |
|
}) |
|
.name('Rendering Style') |
|
.onChange(val => { |
|
scene.remove(sixDofViewer); |
|
sixDofViewer = new SixDOF.Viewer(colorTexture, depthTexture, { |
|
'style': SixDOF.Style[val] |
|
}); |
|
scene.add(sixDofViewer); |
|
}); |
|
|
|
shaderParams.open(); |
|
} |
|
const controls = new THREE.OrbitControls(cameraDolly, renderer.domElement); |
|
controls.enableZoom = true |
|
controls.enableDamping = true; |
|
camera.rotation.x = Math.PI / 2; |
|
|
|
controls.autoRotate = true; |
|
controls.addEventListener('start', function () { |
|
controls.autoRotate = false; |
|
}); |
|
|
|
|
|
renderer.setAnimationLoop((time) => { |
|
|
|
controls.update(); |
|
renderer.render(scene, camera); |
|
}); |
|
|
|
|
|
|
|
window.addEventListener('resize', ev => { |
|
camera.aspect = window.innerWidth / window.innerHeight; |
|
camera.updateProjectionMatrix(); |
|
renderer.setSize(window.innerWidth, window.innerHeight); |
|
}); |
|
</script> |
|
</body> |
|
|
|
</html> |