Last active
May 12, 2017 17:45
-
-
Save kevinkraus92/b3ccaff202d746fe8048eaeaa32df0ca to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"> | |
<!-- three.js library --> | |
<script src='vendor/three.js/build/three.min.js'></script> | |
<script src="vendor/three.js/examples/js/libs/stats.min.js"></script> | |
<!-- ar.js --> | |
<script src="../build/ar.min.js"></script> | |
<script>THREEx.ArToolkitContext.baseURL = '../'</script> | |
<body style='margin : 0px; overflow: hidden; font-family: Monospace;'><div style='position: absolute; top: 10px; width:100%; text-align: center; z-index: 1;'> | |
<a href="https://github.com/jeromeetienne/AR.js/" target="_blank">AR.js</a> - three.js mobile performance | |
<br/> | |
Contact me any time at <a href='https://twitter.com/jerome_etienne' target='_blank'>@jerome_etienne</a> | |
</div><script> | |
////////////////////////////////////////////////////////////////////////////////// | |
// Init | |
////////////////////////////////////////////////////////////////////////////////// | |
// init renderer | |
var renderer = new THREE.WebGLRenderer({ | |
// antialias : true, | |
alpha: true | |
}); | |
renderer.setClearColor(new THREE.Color('lightgrey'), 0) | |
// renderer.setPixelRatio( 1/2 ); | |
renderer.setSize( window.innerWidth, window.innerHeight ); | |
renderer.domElement.style.position = 'absolute' | |
renderer.domElement.style.top = '0px' | |
renderer.domElement.style.left = '0px' | |
document.body.appendChild( renderer.domElement ); | |
// array of functions for the rendering loop | |
var onRenderFcts= []; | |
// init scene and camera | |
var scene = new THREE.Scene(); | |
////////////////////////////////////////////////////////////////////////////////// | |
// Initialize a basic camera | |
////////////////////////////////////////////////////////////////////////////////// | |
// Create a camera | |
var camera = new THREE.Camera(); | |
scene.add(camera); | |
//////////////////////////////////////////////////////////////////////////////// | |
// handle arToolkitSource | |
//////////////////////////////////////////////////////////////////////////////// | |
var arToolkitSource = new THREEx.ArToolkitSource({ | |
// to read from the webcam | |
sourceType : 'webcam', | |
// to read from an image | |
// sourceType : 'image', | |
// sourceUrl : THREEx.ArToolkitContext.baseURL + '../data/images/img.jpg', | |
// to read from a video | |
// sourceType : 'video', | |
// sourceUrl : THREEx.ArToolkitContext.baseURL + '../data/videos/headtracking.mp4', | |
}) | |
arToolkitSource.init(function onReady(){ | |
// handle resize of renderer | |
arToolkitSource.onResize(renderer.domElement) | |
}) | |
// handle resize | |
window.addEventListener('resize', function(){ | |
// handle arToolkitSource resize | |
arToolkitSource.onResize(renderer.domElement) | |
}) | |
//////////////////////////////////////////////////////////////////////////////// | |
// initialize arToolkitContext | |
//////////////////////////////////////////////////////////////////////////////// | |
// create atToolkitContext | |
var arToolkitContext = new THREEx.ArToolkitContext({ | |
cameraParametersUrl: THREEx.ArToolkitContext.baseURL + '../data/data/camera_para.dat', | |
detectionMode: 'mono', | |
maxDetectionRate: 30, | |
canvasWidth: 80*3, | |
canvasHeight: 60*3, | |
}) | |
// initialize it | |
arToolkitContext.init(function onCompleted(){ | |
// copy projection matrix to camera | |
camera.projectionMatrix.copy( arToolkitContext.getProjectionMatrix() ); | |
}) | |
// update artoolkit on every frame | |
onRenderFcts.push(function(){ | |
if( arToolkitSource.ready === false ) return | |
arToolkitContext.update( arToolkitSource.domElement ) | |
}) | |
//////////////////////////////////////////////////////////////////////////////// | |
// Create a ArMarkerControls | |
//////////////////////////////////////////////////////////////////////////////// | |
var markerRoot = new THREE.Group | |
scene.add(markerRoot) | |
var artoolkitMarker = new THREEx.ArMarkerControls(arToolkitContext, markerRoot, { | |
type : 'pattern', | |
patternUrl : THREEx.ArToolkitContext.baseURL + '../data/data/patt.hiro' | |
// patternUrl : THREEx.ArToolkitContext.baseURL + '../data/data/patt.kanji' | |
}) | |
////////////////////////////////////////////////////////////////////////////////// | |
// add an object in the scene | |
////////////////////////////////////////////////////////////////////////////////// | |
// add a torus knot | |
var geometry = new THREE.CubeGeometry(1,1,1); | |
var material = new THREE.MeshNormalMaterial({ | |
transparent : true, | |
opacity: 0.5, | |
side: THREE.DoubleSide | |
}); | |
var mesh = new THREE.Mesh( geometry, material ); | |
mesh.position.y = geometry.parameters.height/2 | |
markerRoot.add( mesh ); | |
var geometry = new THREE.TorusKnotGeometry(0.3,0.1,64,16); | |
var material = new THREE.MeshNormalMaterial(); | |
var mesh = new THREE.Mesh( geometry, material ); | |
mesh.position.y = 0.5 | |
markerRoot.add( mesh ); | |
onRenderFcts.push(function(){ | |
mesh.rotation.x += 0.1 | |
}) | |
////////////////////////////////////////////////////////////////////////////////// | |
// render the whole thing on the page | |
////////////////////////////////////////////////////////////////////////////////// | |
var stats = new Stats(); | |
document.body.appendChild( stats.dom ); | |
// render the scene | |
onRenderFcts.push(function(){ | |
renderer.render( scene, camera ); | |
stats.update(); | |
}) | |
// run the rendering loop | |
var lastTimeMsec= null | |
requestAnimationFrame(function animate(nowMsec){ | |
// keep looping | |
requestAnimationFrame( animate ); | |
// measure time | |
lastTimeMsec = lastTimeMsec || nowMsec-1000/60 | |
var deltaMsec = Math.min(200, nowMsec - lastTimeMsec) | |
lastTimeMsec = nowMsec | |
// call each update function | |
onRenderFcts.forEach(function(onRenderFct){ | |
onRenderFct(deltaMsec/1000, nowMsec/1000) | |
}) | |
}) | |
</script></body> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment