/** * Entities with LookAt component looks to targetPosition (default up is 0,1,0) * @param graphics R3.GraphicsRuntime * @param apiLookAt R3.D3.API.LookAt * @constructor */ R3.D3.LookAt = function ( graphics, apiLookAt ) { this.graphics = graphics; this.graphics.isNotThreeThrow(); if (R3.Utils.UndefinedOrNull(apiLookAt)) { apiLookAt = {}; } if (apiLookAt instanceof R3.D3.LookAt) { return apiLookAt; } R3.D3.API.LookAt.call( this, apiLookAt.id, apiLookAt.name, apiLookAt.currentComponent, apiLookAt.targetComponent, apiLookAt.targetPositionOffset, apiLookAt.rotationSpeed, apiLookAt.parentEntity ); this.targetPositionOffset = new R3.Vector3( this.graphics, this.targetPositionOffset, this ); this.lookAtMatrix = new R3.Matrix4( this.graphics, this.lookAtMatrix, this ); this.up = new R3.Vector3( this.graphics, this.up, this ); this.currentRotation = new R3.Quaternion( this.graphics, this.currentRotation, this ); this.targetPosition = new R3.Vector3( this.graphics, this.targetPosition, this ); R3.Component.call( this, R3.Component.COMPONENT_LOOK_AT, { 'currentComponent' : R3.Component, 'targetComponent' : R3.Component } ); }; R3.D3.LookAt.prototype = Object.create(R3.D3.API.LookAt.prototype); R3.D3.LookAt.prototype.constructor = R3.D3.LookAt; R3.D3.LookAt.prototype.createInstance = function() { this.instance = true; R3.Component.prototype.createInstance.call(this); }; R3.D3.LookAt.prototype.updateInstance = function() { }; /** * to API object * @returns {R3.D3.API.LookAt} */ R3.D3.LookAt.prototype.toApiObject = function() { var apiLookAt = new R3.D3.API.LookAt( this.id, this.name, R3.Utils.IdOrNull(this.currentComponent), R3.Utils.IdOrNull(this.targetComponent), this.targetPositionOffset.toApiObject(), this.rotationSpeed, R3.Utils.IdOrNull(this.parentEntity) ); return apiLookAt; }; R3.D3.LookAt.FromObject = function(graphics, objectComponent) { var apiLookAt = R3.D3.API.LookAt.FromObject(objectComponent); return new R3.D3.LookAt( graphics, apiLookAt ); }; /** * Looks at using time * @param deltaTime */ R3.D3.LookAt.prototype.update = function(deltaTime) { if (this.currentComponent && this.targetComponent) { this.targetPosition.x = this.targetComponent.position.x + this.targetPositionOffset.x; this.targetPosition.y = this.targetComponent.position.y + this.targetPositionOffset.y; this.targetPosition.z = this.targetComponent.position.z + this.targetPositionOffset.z; this.targetPosition.updateInstance(); // this.lookAtMatrix.lookAt( // this.currentComponent.position, // this.targetPosition, // this.up // ); // // this.currentRotation = new R3.Quaternion(this.graphics, this, new R3.API.Quaternion()); // // this.currentRotation.setFromRotationMatrix(this.lookAtMatrix); // var t = deltaTime * this.rotationSpeed; // t = t * t * t * (t * (6.0 * t - 15.0) + 10.0); // this.currentRotation.slerp(this.currentRotation, t); // this.currentRotation.normalize(); // // this.currentComponent.quaternion.x = this.currentRotation.x; // this.currentComponent.quaternion.y = this.currentRotation.y; // this.currentComponent.quaternion.z = this.currentRotation.z; // this.currentComponent.quaternion.w = this.currentRotation.w; // this.currentComponent.lookAt.x = this.targetPosition.x; this.currentComponent.lookAt.y = this.targetPosition.y; this.currentComponent.lookAt.z = this.targetPosition.z; this.currentComponent.lookAt.updateInstance(); } };