Newer
Older
AegisforEcosystem / next / AR.js-3.4.0 / three.js / examples / arjs-session.html
@KAOKA Daisuke KAOKA Daisuke on 31 May 2022 8 KB into AR.js
<!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='../examples/vendor/three.js/build/three.js'></script>
<!-- include ar.js -->
<script src="../build/ar.js"></script>

<script>ARjs.Context.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/AR-js-org/AR.js/' target='_blank'>AR.js</a> - Session API demo with multi
        tracking and hit testing
        - by <a href='https://twitter.com/nicolocarp' target='_blank'>@nicolocarp</a>
        <br />
        <a href='../../three.js/examples/multi-markers/markers-page/' target='_blank'>Markers page</a>
        <br />
        <strong>Tracking Backend:</strong>
        <a href='?artoolkit'>artoolkit</a>
        /
        <a href='?area-artoolkit'>area artoolkit</a>
        /
        <a href='?best'>best</a>
    </div>
    <script>
            ; (function () {
                // get tracking method from location.search
                var trackingMethod = location.search.substring(1) ? location.search.substring(1) : 'best'


                //////////////////////////////////////////////////////////////////////////////////
                //		Init
                //////////////////////////////////////////////////////////////////////////////////

                // init renderer
                var renderer = new THREE.WebGLRenderer({
                    antialias: true,
                    alpha: true
                });
                renderer.autoClear = false;
                renderer.setClearColor(new THREE.Color('lightgrey'), 0)
                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 the camera
                //////////////////////////////////////////////////////////////////////////////////

                var camera = ARjs.Utils.createDefaultCamera(trackingMethod)
                scene.add(camera)

                ////////////////////////////////////////////////////////////////////////////////
                //          	Set up Arjs.Profile
                ////////////////////////////////////////////////////////////////////////////////

                var arProfile = new ARjs.Profile()
                    .sourceWebcam()
                    .trackingMethod(trackingMethod)
                    // .changeMatrixMode('modelViewMatrix')
                    // .changeMatrixMode('cameraTransformMatrix')
                    .defaultMarker()
                    .checkIfValid()

                //////////////////////////////////////////////////////////////////////////////
                //		build ARjs.Session
                //////////////////////////////////////////////////////////////////////////////

                var arSession = new ARjs.Session({
                    scene: scene,
                    renderer: renderer,
                    camera: camera,
                    sourceParameters: arProfile.sourceParameters,
                    contextParameters: arProfile.contextParameters
                })
                onRenderFcts.push(function () {
                    arSession.update()
                })

                ////////////////////////////////////////////////////////////////////////////////
                //          Create a ARjs.Anchor
                ////////////////////////////////////////////////////////////////////////////////

                var arAnchor = new ARjs.Anchor(arSession, arProfile.defaultMarkerParameters)
                onRenderFcts.push(function () {
                    arAnchor.update()
                })

                //////////////////////////////////////////////////////////////////////////////
                //                handle Hit Tester
                //////////////////////////////////////////////////////////////////////////////

                var hitTesting = new ARjs.HitTesting(arSession)
                onRenderFcts.push(function () {
                    hitTesting.update(camera, arAnchor.object3d, arAnchor.parameters.changeMatrixMode)
                })

                //////////////////////////////////////////////////////////////////////////////////
                //		add an object to the arAnchor
                //////////////////////////////////////////////////////////////////////////////////
                var arWorldRoot = arAnchor.object3d

                var mesh = new THREE.AxesHelper()
                arWorldRoot.add(mesh)

                // add a torus knot
                var geometry = new THREE.BoxGeometry(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
                arWorldRoot.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
                arWorldRoot.add(mesh);

                onRenderFcts.push(function (delta) {
                    mesh.rotation.x += Math.PI * delta
                })

                //////////////////////////////////////////////////////////////////////////////
                //		DebugUI
                //////////////////////////////////////////////////////////////////////////////

                // create arjsDebugUIContainer if needed
                if (document.querySelector('#arjsDebugUIContainer') === null) {
                    var domElement = document.createElement('div')
                    domElement.id = 'arjsDebugUIContainer'
                    domElement.setAttribute('style', 'position: fixed; bottom: 10px; width:100%; text-align: center; z-index: 1;color: grey;')
                    document.body.appendChild(domElement)
                }


                var sessionDebugUI = new ARjs.SessionDebugUI(arSession, null)
                document.querySelector('#arjsDebugUIContainer').appendChild(sessionDebugUI.domElement)

                var anchorDebugUI = new ARjs.AnchorDebugUI(arAnchor)
                document.querySelector('#arjsDebugUIContainer').appendChild(anchorDebugUI.domElement)

                //////////////////////////////////////////////////////////////////////////////////
                //		render the whole thing on the page
                //////////////////////////////////////////////////////////////////////////////////

                // render the scene
                onRenderFcts.push(function () {
                    // Render the see through camera scene
                    renderer.clear()

                    // render hitTesting pickingPlane - for debug
                    var renderHitTestingPickingPlane = true
                    if (renderHitTestingPickingPlane && hitTesting._hitTestingPlane) {
                        hitTesting._hitTestingPlane.renderDebug(renderer)
                    }

                    renderer.render(scene, camera);
                })

                // 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>