only look attractor if close

This commit is contained in:
James B. Pollack 2016-03-01 17:44:21 -08:00
parent 24da3b1019
commit 1bcd85d106
2 changed files with 232 additions and 47 deletions

View file

@ -1,5 +1,6 @@
var fishtank, bubbleSystem, bubbleSound; var fishtank, bubbleSystem, bubbleSound, bubbleInjector;
var CLEANUP = true;
var TANK_DIMENSIONS = { var TANK_DIMENSIONS = {
x: 1.3393, x: 1.3393,
y: 1.3515, y: 1.3515,
@ -15,7 +16,7 @@ var DEBUG_COLOR = {
blue: 255 blue: 255
} }
var center = Vec3.sum(MyAvatar.position, Vec3.multiply(Quat.getFront(MyAvatar.orientation), 2 * TANK_WIDTH)); var center = Vec3.sum(MyAvatar.position, Vec3.multiply(Quat.getFront(MyAvatar.orientation), 1 * TANK_WIDTH));
var TANK_POSITION = center; var TANK_POSITION = center;
@ -23,9 +24,9 @@ var TANK_SCRIPT = Script.resolvePath('tank.js?' + Math.random())
var TANK_MODEL_URL = "http://hifi-content.s3.amazonaws.com/DomainContent/Home/fishTank/aquarium-6.fbx"; var TANK_MODEL_URL = "http://hifi-content.s3.amazonaws.com/DomainContent/Home/fishTank/aquarium-6.fbx";
var BUBBLE_SYSTEM_FORWARD_OFFSET = 0.2; var BUBBLE_SYSTEM_FORWARD_OFFSET = 0.0;
var BUBBLE_SYSTEM_LATERAL_OFFSET = 0.2; var BUBBLE_SYSTEM_LATERAL_OFFSET = TANK_DIMENSIONS.x - 0.25;
var BUBBLE_SYSTEM_VERTICAL_OFFSET = -0.2; var BUBBLE_SYSTEM_VERTICAL_OFFSET = -1;
var BUBBLE_SYSTEM_DIMENSIONS = { var BUBBLE_SYSTEM_DIMENSIONS = {
x: TANK_DIMENSIONS.x / 8, x: TANK_DIMENSIONS.x / 8,
@ -65,7 +66,7 @@ function createFishTank() {
function createBubbleSystem() { function createBubbleSystem() {
var tankProperties = Entities.getEntityProperties(fishTank); var tankProperties = Entities.getEntityProperties(fishtank);
var bubbleProperties = { var bubbleProperties = {
"color": {}, "color": {},
"isEmitting": 1, "isEmitting": 1,
@ -130,31 +131,100 @@ function createBubbleSystem() {
finalOffset = Vec3.sum(finalOffset, frontOffset); finalOffset = Vec3.sum(finalOffset, frontOffset);
finalOffset = Vec3.sum(finalOffset, rightOffset); finalOffset = Vec3.sum(finalOffset, rightOffset);
print('final bubble offset:: ' + JSON.stringify(finalOffset));
bubbleProperties.position = finalOffset; bubbleProperties.position = finalOffset;
bubbleSystem = Entities.addEntity(bubbleProperties); bubbleSystem = Entities.addEntity(bubbleProperties);
createBubbleSound(finalOffset); // createBubbleSound(finalOffset);
} }
function createBubbleSound(position) { function createBubbleSound(position) {
var audioProperties = { var audioProperties = {
volume: 0.2, volume: 1,
position: position, position: position,
loop: true loop: true
}; };
Audio.playSound(bubbleSound, audioProperties); bubbleInjector = Audio.playSound(bubbleSound, audioProperties);
} }
function cleanup() { function cleanup() {
Entities.deleteEntity(fishTank); Entities.deleteEntity(fishTank);
Entities.deleteEntity(bubbleSystem);
bubbleInjector.stop();
bubbleInjector = null;
} }
function createInnerContainer(){
var containerProps = {
name:"hifi-home-fishtank-inner-container",
type:'Box',
color:{
red:0,
green:0,
blue:255
},
dimensions:{
}
};
}
function createEntitiesAtCorners() {
var bounds = Entities.getEntityProperties(fishTank, "boundingBox").boundingBox;
var lowerProps = {
name:'hifi-home-fishtank-lower-corner',
type: "Box",
dimensions: {
x: 0.2,
y: 0.2,
z: 0.2
},
color: {
red: 255,
green: 0,
blue: 0
},
collisionless: true,
position: bounds.brn
}
var upperProps = {
name:'hifi-home-fishtank-upper-corner',
type: "Box",
dimensions: {
x: 0.2,
y: 0.2,
z: 0.2
},
color: {
red: 0,
green: 255,
blue: 0
},
collisionless: true,
position:bounds.tfl
}
var lowerCorner = Entities.addEntity(lowerProps);
var upperCorner = Entities.addEntity(upperProps);
print('CORNERS :::' + JSON.stringify(upperCorner) )
print('CORNERS :::' + JSON.stringify(lowerCorner) )
}
createFishTank(); createFishTank();
createBubbleSystem(); createBubbleSystem();
createBubbleSound(); createEntitiesAtCorners();
//createBubbleSound();
Script.scriptEnding.connect(cleanup);
if (CLEANUP === true) {
Script.scriptEnding.connect(cleanup);
}

View file

@ -11,6 +11,8 @@
var connected = false; var connected = false;
var TANK_SEARCH_RADIUS = 5; var TANK_SEARCH_RADIUS = 5;
var WANT_LOOK_DEBUG_LINE = false;
var WANT_LOOK_DEBUG_SPHERE = true;
var INTERSECT_COLOR = { var INTERSECT_COLOR = {
red: 255, red: 255,
@ -50,8 +52,9 @@
lookAttractor: null, lookAttractor: null,
overlayLine: null, overlayLine: null,
overlayLineDistance: 3, overlayLineDistance: 3,
debugSphere: null,
findFishInTank: function() { findFishInTank: function() {
// print('looking for a fish in the tank') print('looking for a fish in the tank')
var results = Entities.findEntities(_this.currentProperties.position, TANK_SEARCH_RADIUS); var results = Entities.findEntities(_this.currentProperties.position, TANK_SEARCH_RADIUS);
var fishList = []; var fishList = [];
@ -109,7 +112,7 @@
unload: function() { unload: function() {
print(' UNLOAD') print(' UNLOAD')
Script.update.disconnect(_this.update); Script.update.disconnect(_this.update);
if (WANT_LOOK_DEBUG === true) { if (WANT_LOOK_DEBUG_LINE === true) {
_this.overlayLineOff(); _this.overlayLineOff();
} }
if (baton) { if (baton) {
@ -129,6 +132,43 @@
_this.seeIfOwnerIsLookingAtTheTank(); _this.seeIfOwnerIsLookingAtTheTank();
}, },
debugSphereOn: function(position) {
if (_this.debugSphere !== null) {
Entities.editEntity(_this.debugSphere, {
visible: true
})
return;
}
var sphereProperties = {
type: 'Sphere',
parentID: _this.entityID,
dimensions: {
x: 0.1,
y: 0.1,
z: 0.1,
},
color: INTERSECT_COLOR,
position: position,
collisionless: true
}
_this.debugSphere = Entities.addEntity(sphereProperties);
},
updateDebugSphere: function(position) {
Entities.editEntity(_this.debugSphere, {
visible:true,
position: position
})
},
debugSphereOff: function() {
// Entities.deleteEntity(_this.debugSphere);
Entities.editEntity(_this.debugSphere, {
visible: false
})
//_this.debugSphere = null;
},
overlayLineOn: function(closePoint, farPoint, color) { overlayLineOn: function(closePoint, farPoint, color) {
if (_this.overlayLine === null) { if (_this.overlayLine === null) {
@ -175,33 +215,59 @@
direction: front direction: front
}; };
if (WANT_LOOK_DEBUG === true) { if (WANT_LOOK_DEBUG_LINE === true) {
_this.overlayLineOn(pickRay.origin, Vec3.sum(pickRay.origin, Vec3.multiply(front, _this.overlayLineDistance)), INTERSECT_COLOR); _this.overlayLineOn(pickRay.origin, Vec3.sum(pickRay.origin, Vec3.multiply(front, _this.overlayLineDistance)), INTERSECT_COLOR);
}; };
var intersection = Entities.findRayIntersection(pickRay, true, [_this.entityID]); var intersection = Entities.findRayIntersection(pickRay, true, [_this.entityID]);
if (intersection.intersects && intersection.entityID === _this.entityID) { if (intersection.intersects && intersection.entityID === _this.entityID) {
print('intersecting a tank') //print('intersecting a tank')
print('intersection:: ' + JSON.stringify(intersection)); if (WANT_LOOK_DEBUG_SPHERE === true) {
if (_this.debugSphere === null) {
_this.debugSphereOn(intersection.intersection);
} else {
_this.updateDebugSphere(intersection.intersection);
}
}
print('INT DIST: ' + intersection.distance);
if (intersection.distance > 1.5) {
print('NOT CLOSE ENOUGH TO THE TANK')
if (WANT_LOOK_DEBUG_SPHERE === true) {
_this.debugSphereOff();
}
return
}
// print('intersection:: ' + JSON.stringify(intersection));
if (_this.hasLookAttractor === false) { if (_this.hasLookAttractor === false) {
_this.createLookAttractor(); _this.createLookAttractor(intersection.intersection, intersection.distance);
} else if (_this.hasLookAttractor === true) { } else if (_this.hasLookAttractor === true) {
_this.updateLookAttractor(); _this.updateLookAttractor(intersection.intersection, intersection.distance);
} }
} else { } else {
if (_this.hasLookAttractor === true) { if (_this.hasLookAttractor === true) {
clearLookAttractor(); _this.clearLookAttractor();
}
if (WANT_LOOK_DEBUG_SPHERE === true) {
_this.debugSphereOff();
} }
} }
}, },
//look attractors could be private to the tank... //look attractors could be private to the tank...
createLookAttractor: function(position) { createLookAttractor: function(position, distance) {
_this.lookAttractor = position; _this.lookAttractor = {
position: position,
distance: distance
};
_this.hasLookAttractor = true;
}, },
updateLookAttractor: function(position) { updateLookAttractor: function(position, distance) {
_this.lookAttractor = position; _this.lookAttractor = {
position: position,
distance: distance
};
}, },
clearLookAttractor: function() { clearLookAttractor: function() {
_this.hasLookAttractor = false; _this.hasLookAttractor = false;
@ -253,30 +319,29 @@
z: 3.5914 z: 3.5914
}; };
var TANK_WIDTH = TANK_DIMENSIONS.z / 3; var TANK_WIDTH = TANK_DIMENSIONS.z / 2;
var TANK_HEIGHT = TANK_DIMENSIONS.y / 3; var TANK_HEIGHT = TANK_DIMENSIONS.y / 2;
var FISH_WIDTH = 0.03; var FISH_WIDTH = 0.03;
var FISH_LENGTH = 0.15; var FISH_LENGTH = 0.15;
var MAX_SIGHT_DISTANCE = 0.8; var MAX_SIGHT_DISTANCE = 1.5;
var MIN_SEPARATION = 0.15; var MIN_SEPARATION = 0.15;
var AVOIDANCE_FORCE = 0.3; var AVOIDANCE_FORCE = 0.32;
var COHESION_FORCE = 0.025; var COHESION_FORCE = 0.025;
var ALIGNMENT_FORCE = 0.025; var ALIGNMENT_FORCE = 0.025;
var LOOK_ATTRACTOR_FORCE = 0.030; var LOOK_ATTRACTOR_FORCE = 0.029;
var SWIMMING_FORCE = 0.05; var SWIMMING_FORCE = 0.05;
var SWIMMING_SPEED = 0.5; var SWIMMING_SPEED = 0.5;
var FISH_DAMPING = 0.25; var FISH_DAMPING = 0.25;
var WANT_LOOK_DEBUG = false;
var THROTTLE = false; var THROTTLE = false;
var THROTTLE_RATE = 100; var THROTTLE_RATE = 100;
var sinceLastUpdate = 0; var sinceLastUpdate = 0;
var FISH_MODEL_URL = "http://hifi-content.s3.amazonaws.com/DomainContent/Home/fishTank/Fish-1.fbx"; // var FISH_MODEL_URL = "http://hifi-content.s3.amazonaws.com/DomainContent/Home/fishTank/Fish-1.fbx";
var FISH_MODEL_TWO_URL = "http://hifi-content.s3.amazonaws.com/DomainContent/Home/fishTank/Fish-2.fbx";
// var FISH_MODEL_TWO_URL = "http://hifi-content.s3.amazonaws.com/DomainContent/Home/fishTank/Fish-2.fbx";
var FISH_MODEL_URL = "http://hifi-content.s3.amazonaws.com/DomainContent/Home/fishTank/goodfish5.fbx";
var FISH_MODEL_TWO_URL = "http://hifi-content.s3.amazonaws.com/DomainContent/Home/fishTank/goodfish5.fbx";
var fishLoaded = false; var fishLoaded = false;
function randomVector(scale) { function randomVector(scale) {
@ -287,6 +352,44 @@
}; };
} }
function createEntitiesAtCorners(lower, upper) {
var lowerProps = {
type: "box",
dimensions: {
x: 0.2,
y: 0.2,
z: 0.2
},
color: {
red: 255,
green: 0,
blue: 0
},
collisionless: true,
position: lower
}
var upperProps = {
type: "box",
dimensions: {
x: 0.2,
y: 0.2,
z: 0.2
},
color: {
red: 0,
green: 255,
blue: 0
},
collisionless: true,
position: upper
}
_this.lowerCorner = Entities.addEntity(lowerProps);
_this.upperCorner = Entities.addEntity(upperProps);
}
function updateFish(deltaTime) { function updateFish(deltaTime) {
if (_this.tankLocked === true) { if (_this.tankLocked === true) {
@ -317,7 +420,9 @@
fishLoaded: true fishLoaded: true
}); });
_this.userData['hifi-home-fishtank'].fishLoaded = true; _this.userData['hifi-home-fishtank'].fishLoaded = true;
_this.fish = _this.findFishInTank(); Script.setTimeout(function() {
_this.fish = _this.findFishInTank();
}, 2000)
return; return;
} else { } else {
@ -330,10 +435,10 @@
var fish = _this.fish; var fish = _this.fish;
// print('how many fish do i find?' + fish.length) // print('how many fish do i find?' + fish.length)
if (fish.length === 0) { if (fish.length === 0) {
print('no fish...') // print('no fish...')
return return
}; };
@ -362,6 +467,8 @@
z: center.z + (TANK_WIDTH / 2) z: center.z + (TANK_WIDTH / 2)
}; };
//createEntitiesAtCorners(lowerCorner,upperCorner);
// First pre-load an array with properties on all the other fish so our per-fish loop // First pre-load an array with properties on all the other fish so our per-fish loop
// isn't doing it. // isn't doing it.
var flockProperties = []; var flockProperties = [];
@ -432,12 +539,15 @@
//attractors //attractors
//[position, radius, force] //[position, radius, force]
if (_this.hasLookAttractor === true) {
var attractorPosition = _this.lookAttractor;
var towardAttractor = Vec3.subtract(attractorPosition, position);
velocity = Vec3.mix(velocity, Vec3.multiply(Vec3.normalize(towardAttractor), Vec3.length(velocity)), LOOK_ATTRACTOR_FORCE);
}
}
if (_this.hasLookAttractor === true) {
//print('has a look attractor, so use it')
var attractorPosition = _this.lookAttractor.position;
var towardAttractor = Vec3.subtract(attractorPosition, position);
velocity = Vec3.mix(velocity, Vec3.multiply(Vec3.normalize(towardAttractor), Vec3.length(velocity)), LOOK_ATTRACTOR_FORCE);
} }
// Try to swim at a constant speed // Try to swim at a constant speed
@ -470,6 +580,10 @@
var rotation = Quat.rotationBetween(Vec3.UNIT_NEG_Z, velocity); var rotation = Quat.rotationBetween(Vec3.UNIT_NEG_Z, velocity);
var VELOCITY_FOLLOW_RATE = 0.30; var VELOCITY_FOLLOW_RATE = 0.30;
var safeEuler = Quat.safeEulerAngles(rotation);
// Only update properties if they have changed, to save bandwidth // Only update properties if they have changed, to save bandwidth
var MIN_POSITION_CHANGE_FOR_UPDATE = 0.001; var MIN_POSITION_CHANGE_FOR_UPDATE = 0.001;
if (Vec3.distance(properties.position, position) < MIN_POSITION_CHANGE_FOR_UPDATE) { if (Vec3.distance(properties.position, position) < MIN_POSITION_CHANGE_FOR_UPDATE) {
@ -523,12 +637,13 @@
modelURL: fish.length % 2 === 0 ? FISH_MODEL_URL : FISH_MODEL_TWO_URL, modelURL: fish.length % 2 === 0 ? FISH_MODEL_URL : FISH_MODEL_TWO_URL,
position: position, position: position,
parentID: _this.entityID, parentID: _this.entityID,
rotation: { // rotation: {
x: 0, // x: 0,
y: 0, // y: 0,
z: 0, // z: 0,
w: 1 // w: 1
}, // },
// type: "Box",
// dimensions: { // dimensions: {
// x: FISH_WIDTH, // x: FISH_WIDTH,
// y: FISH_WIDTH, // y: FISH_WIDTH,