arjs-anchor.js 4.8 KB
Newer Older
J
Jerome Etienne 已提交
1 2 3
// @namespace
var ARjs = ARjs || {}

4 5 6
// TODO this is a controls... should i give the object3d here ?
// not according to 'no three.js dependancy'

J
Jerome Etienne 已提交
7 8 9 10 11 12 13
/**
 * Create an anchor in the real world
 * 
 * @param {ARjs.Session} arSession - the session on which we create the anchor
 * @param {Object} markerParameters - parameter of this anchor
 */
ARjs.Anchor = function(arSession, markerParameters){
J
Jerome Etienne 已提交
14
	var _this = this
J
Jerome Etienne 已提交
15
	var arContext = arSession.arContext
J
Jerome Etienne 已提交
16 17
	var scene = arSession.parameters.scene
	var camera = arSession.parameters.camera
J
Jerome Etienne 已提交
18
	
J
Jerome Etienne 已提交
19
	this.arSession = arSession
J
Jerome Etienne 已提交
20
	this.parameters = markerParameters
21
	
J
Jerome Etienne 已提交
22 23 24
	// log to debug
	console.log('ARjs.Anchor -', 'changeMatrixMode:', this.parameters.changeMatrixMode, '/ markersAreaEnabled:', markerParameters.markersAreaEnabled)

J
Jerome Etienne 已提交
25 26 27
	var markerRoot = new THREE.Group
	scene.add(markerRoot)

J
Jerome Etienne 已提交
28
	// set controlledObject depending on changeMatrixMode
J
Jerome Etienne 已提交
29
	if( markerParameters.changeMatrixMode === 'modelViewMatrix' ){
J
Jerome Etienne 已提交
30
		var controlledObject = markerRoot
J
Jerome Etienne 已提交
31
	}else if( markerParameters.changeMatrixMode === 'cameraTransformMatrix' ){
J
Jerome Etienne 已提交
32
		var controlledObject = camera
J
Jerome Etienne 已提交
33 34
	}else console.assert(false)

J
Jerome Etienne 已提交
35 36 37
	if( markerParameters.markersAreaEnabled === false ){
		var markerControls = new THREEx.ArMarkerControls(arContext, controlledObject, markerParameters)		
	}else{
J
Jerome Etienne 已提交
38
		// sanity check - MUST be a trackingBackend with markers
J
Jerome Etienne 已提交
39 40 41
		console.assert( arContext.parameters.trackingBackend === 'artoolkit' || arContext.parameters.trackingBackend === 'aruco' )
		// for multi marker
		if( localStorage.getItem('ARjsMultiMarkerFile') === null ){
J
Jerome Etienne 已提交
42
			ARjs.MarkersAreaUtils.storeDefaultMultiMarkerFile(arContext.parameters.trackingBackend)
J
Jerome Etienne 已提交
43 44
		}
		
J
Jerome Etienne 已提交
45 46 47
		// get multiMarkerFile from localStorage
		console.assert( localStorage.getItem('ARjsMultiMarkerFile') !== null )
		var multiMarkerFile = localStorage.getItem('ARjsMultiMarkerFile')
J
Jerome Etienne 已提交
48

J
Jerome Etienne 已提交
49 50 51 52 53 54 55
		// set controlledObject depending on changeMatrixMode
		if( markerParameters.changeMatrixMode === 'modelViewMatrix' ){
			var parent3D = scene
		}else if( markerParameters.changeMatrixMode === 'cameraTransformMatrix' ){
			var parent3D = camera
		}else console.assert(false)
	
J
Jerome Etienne 已提交
56
		// build a multiMarkerControls
J
Jerome Etienne 已提交
57
		var multiMarkerControls = ARjs.MarkersAreaControls.fromJSON(arContext, parent3D, controlledObject, multiMarkerFile)
J
Jerome Etienne 已提交
58 59 60
		
		// honor markerParameters.changeMatrixMode
		multiMarkerControls.parameters.changeMatrixMode = markerParameters.changeMatrixMode
J
Jerome Etienne 已提交
61

J
Jerome Etienne 已提交
62 63 64 65 66 67
		// create ArMarkerHelper - useful to debug
		var markerHelpers = []
		multiMarkerControls.subMarkersControls.forEach(function(subMarkerControls){
			// add an helper to visuable each sub-marker
			var markerHelper = new THREEx.ArMarkerHelper(subMarkerControls)
			markerHelper.object3d.visible = false
J
Jerome Etienne 已提交
68
			// subMarkerControls.object3d.add( markerHelper.object3d )		
J
Jerome Etienne 已提交
69 70 71 72
			subMarkerControls.object3d.add( markerHelper.object3d )		
			// add it to markerHelpers
			markerHelpers.push(markerHelper)
		})
J
Jerome Etienne 已提交
73
		// define API specific to markersArea
J
Jerome Etienne 已提交
74 75
		this.markersArea = {}
		this.markersArea.setSubMarkersVisibility = function(visible){
J
Jerome Etienne 已提交
76 77 78 79 80
			markerHelpers.forEach(function(markerHelper){
				markerHelper.object3d.visible = visible
			})
		}
	}
J
Jerome Etienne 已提交
81
	
J
Jerome Etienne 已提交
82
	this.object3d = new THREE.Group()
J
Jerome Etienne 已提交
83 84 85 86 87 88 89
		
	//////////////////////////////////////////////////////////////////////////////
	//		THREEx.ArSmoothedControls
	//////////////////////////////////////////////////////////////////////////////
	
	var shouldBeSmoothed = true
	if( arContext.parameters.trackingBackend === 'tango' ) shouldBeSmoothed = false 
J
Jerome Etienne 已提交
90

J
Jerome Etienne 已提交
91 92 93 94 95 96 97 98 99
	if( shouldBeSmoothed === true ){
		// build a smoothedControls
		var smoothedRoot = new THREE.Group()
		scene.add(smoothedRoot)
		var smoothedControls = new THREEx.ArSmoothedControls(smoothedRoot)
		smoothedRoot.add(this.object3d)	
	}else{
		markerRoot.add(this.object3d)
	}
J
Jerome Etienne 已提交
100

J
Jerome Etienne 已提交
101 102 103 104 105

	//////////////////////////////////////////////////////////////////////////////
	//		Code Separator
	//////////////////////////////////////////////////////////////////////////////
	this.update = function(){	
106 107 108 109
		// update _this.object3d.visible
		_this.object3d.visible = _this.object3d.parent.visible

		// console.log('controlledObject.visible', _this.object3d.parent.visible)
J
Jerome Etienne 已提交
110 111 112 113 114
		if( smoothedControls !== undefined ){
			// update smoothedControls parameters depending on how many markers are visible in multiMarkerControls
			if( multiMarkerControls !== undefined ){
				multiMarkerControls.updateSmoothedControls(smoothedControls)
			}
J
Jerome Etienne 已提交
115

J
Jerome Etienne 已提交
116 117 118 119
			// update smoothedControls
			smoothedControls.update(markerRoot)			
		}
	}
J
Jerome Etienne 已提交
120 121 122 123 124 125
}


/**
 * Apply ARjs.Session.HitTestResult to the controlled object3d
 * 
J
Jerome Etienne 已提交
126
 * @param {ARjs.HitTesting.Result} hitTestResult - the result to apply
J
Jerome Etienne 已提交
127 128
 */
ARjs.Anchor.prototype.applyHitTestResult = function(hitTestResult){
J
Jerome Etienne 已提交
129 130
	
	
J
Jerome Etienne 已提交
131 132 133
	this.object3d.position.copy(hitTestResult.position)
	this.object3d.quaternion.copy(hitTestResult.quaternion)
	this.object3d.scale.copy(hitTestResult.scale)
J
Jerome Etienne 已提交
134

J
Jerome Etienne 已提交
135
	this.object3d.updateMatrix()
J
Jerome Etienne 已提交
136
}