arjs-anchor.js 4.9 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)

25

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

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

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

J
Jerome Etienne 已提交
50 51 52 53 54 55 56
		// 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 已提交
57
		// build a multiMarkerControls
J
Jerome Etienne 已提交
58
		var multiMarkerControls = ARjs.MarkersAreaControls.fromJSON(arContext, parent3D, controlledObject, multiMarkerFile)
J
Jerome Etienne 已提交
59 60 61
		
		// honor markerParameters.changeMatrixMode
		multiMarkerControls.parameters.changeMatrixMode = markerParameters.changeMatrixMode
J
Jerome Etienne 已提交
62

J
Jerome Etienne 已提交
63 64 65 66 67 68
		// 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 已提交
69
			// subMarkerControls.object3d.add( markerHelper.object3d )		
J
Jerome Etienne 已提交
70 71 72 73
			subMarkerControls.object3d.add( markerHelper.object3d )		
			// add it to markerHelpers
			markerHelpers.push(markerHelper)
		})
J
Jerome Etienne 已提交
74
		// define API specific to markersArea
J
Jerome Etienne 已提交
75 76
		this.markersArea = {}
		this.markersArea.setSubMarkersVisibility = function(visible){
J
Jerome Etienne 已提交
77 78 79 80 81
			markerHelpers.forEach(function(markerHelper){
				markerHelper.object3d.visible = visible
			})
		}
	}
J
Jerome Etienne 已提交
82
	
J
Jerome Etienne 已提交
83
	this.object3d = new THREE.Group()
J
Jerome Etienne 已提交
84 85 86 87 88 89 90
		
	//////////////////////////////////////////////////////////////////////////////
	//		THREEx.ArSmoothedControls
	//////////////////////////////////////////////////////////////////////////////
	
	var shouldBeSmoothed = true
	if( arContext.parameters.trackingBackend === 'tango' ) shouldBeSmoothed = false 
J
Jerome Etienne 已提交
91

J
Jerome Etienne 已提交
92 93 94 95 96 97 98 99 100
	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 已提交
101

J
Jerome Etienne 已提交
102 103 104 105 106

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

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

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


/**
 * Apply ARjs.Session.HitTestResult to the controlled object3d
 * 
J
Jerome Etienne 已提交
127
 * @param {ARjs.HitTesting.Result} hitTestResult - the result to apply
J
Jerome Etienne 已提交
128 129
 */
ARjs.Anchor.prototype.applyHitTestResult = function(hitTestResult){
130 131 132 133 134 135 136
	console.warn('obsolete anchro.applyHitTestResult - use hitTestResult.apply(object3d) instead')
	hitTestResult.apply(this.object3d)
	// object3d.position.copy(hitTestResult.position)
	// object3d.quaternion.copy(hitTestResult.quaternion)
	// object3d.scale.copy(hitTestResult.scale)
	// 
	// object3d.updateMatrix()
J
Jerome Etienne 已提交
137
}