From 3f73f83cf1322e05c1f570cfc57241660607c045 Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Sun, 27 Dec 2015 11:23:54 -0800 Subject: [PATCH 1/5] add doppelganger --- .../example/avatarcontrol/doppelganger.js | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 examples/example/avatarcontrol/doppelganger.js diff --git a/examples/example/avatarcontrol/doppelganger.js b/examples/example/avatarcontrol/doppelganger.js new file mode 100644 index 0000000000..6fb7026ea1 --- /dev/null +++ b/examples/example/avatarcontrol/doppelganger.js @@ -0,0 +1,84 @@ +var TEST_MODEL_URL = ''; + +var doppelgangers = []; + +function Doppelganger(avatar) { + this.initialProperties = { + name: 'Hifi-Doppelganger', + type: 'Model', + modelURL: TEST_MODEL_URL, + dimensions: getAvatarDimensions(avatar), + position: putDoppelgangerAcrossFromAvatar(this, avatar), + rotation: rotateDoppelgangerTowardAvatar(this, avatar), + }; + + this.id = createDoppelgangerEntity(this); + this.avatar = avatar; + return this; +} + +function getJointData() { + return jointData; +} + +function setJointData(doppelganger, jointData) { + return true; +} + +function mirrorJointData() { + return mirroredJointData; +} + +function createDoppelganger(avatar) { + return new Doppelganger(avatar); +} + +function createDoppelgangerEntity(doppelganger) { + return Entities.addEntitiy(doppelganger.initialProperties); +} + +function putDoppelgangerAcrossFromAvatar(doppelganger, avatar) { + return position; +} + +function getAvatarDimensions(avatar) { + return dimensions; +} + +function rotateDoppelgangerTowardAvatar(doppelganger, avatar) { + return rotation; +} + +function connectDoppelgangerUpdates() { + Script.update.connect(updateDoppelganger); +} + +function disconnectDoppelgangerUpdates() { + Script.update.disconnect(updateDoppelganger); +} + +function updateDoppelganger() { + doppelgangers.forEach(function(doppelganger) { + var joints = getJointData(doppelganger.avatar.id); + var mirroredJoints = mirrorJointData(joints); + setJointData(doppelganger, mirroredJoints); + }); + +} + +function makeDoppelgangerForMyAvatar() { + var doppelganger = createDoppelganger(MyAvatar); + doppelgangers.push(doppelganger); + connectDoppelgangerUpdates(); +} + +function cleanup() { + disconnectDoppelgangerUpdates(); + + doppelgangers.forEach(function(doppelganger) { + Entities.deleteEntity(doppelganger); + }); + +} + +Script.scriptEnding.connect(cleanup); \ No newline at end of file From 5e6e2bd11c60b88b69ed7f531dae857e930fee63 Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Mon, 28 Dec 2015 13:06:43 -0800 Subject: [PATCH 2/5] work --- .../example/avatarcontrol/doppelganger.js | 41 ++++++++++++++----- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/examples/example/avatarcontrol/doppelganger.js b/examples/example/avatarcontrol/doppelganger.js index 6fb7026ea1..11b29cbb2a 100644 --- a/examples/example/avatarcontrol/doppelganger.js +++ b/examples/example/avatarcontrol/doppelganger.js @@ -1,4 +1,4 @@ -var TEST_MODEL_URL = ''; +var TEST_MODEL_URL = 'http://hifi-content.s3.amazonaws.com/james/avatars/Jack_Skellington/Jack_Skellington.fbx'; var doppelgangers = []; @@ -7,7 +7,7 @@ function Doppelganger(avatar) { name: 'Hifi-Doppelganger', type: 'Model', modelURL: TEST_MODEL_URL, - dimensions: getAvatarDimensions(avatar), + // dimensions: getAvatarDimensions(avatar), position: putDoppelgangerAcrossFromAvatar(this, avatar), rotation: rotateDoppelgangerTowardAvatar(this, avatar), }; @@ -17,8 +17,17 @@ function Doppelganger(avatar) { return this; } -function getJointData() { - return jointData; +function getJointData(avatar) { + var allJointData; + var jointNames = MyAvatar.jointNames; + + jointNames.forEach(function(joint) { + print('getting info for joint:' + joint); + var jointData = MyAvatar.getJointPosition(joint); + print('joint data:'+JSON.stringify(jointData)); + }); + + return allJointData; } function setJointData(doppelganger, jointData) { @@ -34,11 +43,13 @@ function createDoppelganger(avatar) { } function createDoppelgangerEntity(doppelganger) { - return Entities.addEntitiy(doppelganger.initialProperties); + return Entities.addEntity(doppelganger.initialProperties); } function putDoppelgangerAcrossFromAvatar(doppelganger, avatar) { - return position; + var avatarRot = Quat.fromPitchYawRollDegrees(0, avatar.bodyYaw, 0.0); + var basePosition = Vec3.sum(avatar.position, Vec3.multiply(1.5, Quat.getFront(avatarRot))); + return basePosition; } function getAvatarDimensions(avatar) { @@ -46,7 +57,9 @@ function getAvatarDimensions(avatar) { } function rotateDoppelgangerTowardAvatar(doppelganger, avatar) { - return rotation; + var avatarRot = Quat.fromPitchYawRollDegrees(0, avatar.bodyYaw, 0.0); + avatarRot = Vec3.multiply(-1,avatarRot); + return avatarRot; } function connectDoppelgangerUpdates() { @@ -59,7 +72,7 @@ function disconnectDoppelgangerUpdates() { function updateDoppelganger() { doppelgangers.forEach(function(doppelganger) { - var joints = getJointData(doppelganger.avatar.id); + var joints = getJointData(MyAvatar); var mirroredJoints = mirrorJointData(joints); setJointData(doppelganger, mirroredJoints); }); @@ -69,9 +82,12 @@ function updateDoppelganger() { function makeDoppelgangerForMyAvatar() { var doppelganger = createDoppelganger(MyAvatar); doppelgangers.push(doppelganger); - connectDoppelgangerUpdates(); + // connectDoppelgangerUpdates(); } + +makeDoppelgangerForMyAvatar(); + function cleanup() { disconnectDoppelgangerUpdates(); @@ -81,4 +97,9 @@ function cleanup() { } -Script.scriptEnding.connect(cleanup); \ No newline at end of file +Script.scriptEnding.connect(cleanup); + +// APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS_SET, getJointRotationsSet()); +// APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS, getJointRotations()); +// APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS_SET, getJointTranslationsSet()); +// APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS, getJointTranslations()); \ No newline at end of file From d8ef19a01960d8b114a92cc8d1d5a667ed0e7573 Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Mon, 28 Dec 2015 18:32:49 -0800 Subject: [PATCH 3/5] working!! --- .../example/avatarcontrol/doppelganger.js | 60 ++++++++++++++----- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/examples/example/avatarcontrol/doppelganger.js b/examples/example/avatarcontrol/doppelganger.js index 11b29cbb2a..f8a1103772 100644 --- a/examples/example/avatarcontrol/doppelganger.js +++ b/examples/example/avatarcontrol/doppelganger.js @@ -1,3 +1,15 @@ +// +// doppelganger.js +// +// Created by James B. Pollack @imgntn on 12/28/2015 +// Copyright 2015 High Fidelity, Inc. +// +// This script shows how to hook up a model entity to your avatar to act as a doppelganger. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +// + var TEST_MODEL_URL = 'http://hifi-content.s3.amazonaws.com/james/avatars/Jack_Skellington/Jack_Skellington.fbx'; var doppelgangers = []; @@ -7,7 +19,7 @@ function Doppelganger(avatar) { name: 'Hifi-Doppelganger', type: 'Model', modelURL: TEST_MODEL_URL, - // dimensions: getAvatarDimensions(avatar), + // dimensions: getAvatarDimensions(avatar), position: putDoppelgangerAcrossFromAvatar(this, avatar), rotation: rotateDoppelgangerTowardAvatar(this, avatar), }; @@ -18,19 +30,39 @@ function Doppelganger(avatar) { } function getJointData(avatar) { - var allJointData; + var allJointData = []; var jointNames = MyAvatar.jointNames; - - jointNames.forEach(function(joint) { - print('getting info for joint:' + joint); - var jointData = MyAvatar.getJointPosition(joint); - print('joint data:'+JSON.stringify(jointData)); + jointNames.forEach(function(joint, index) { + var translation = MyAvatar.getJointTranslation(index); + var rotation = MyAvatar.getJointRotation(index) + allJointData.push({ + joint: joint, + index: index, + translation: translation, + rotation: rotation + }) }); return allJointData; } -function setJointData(doppelganger, jointData) { +function setJointData(doppelganger, allJointData) { + var jointRotationsSet = []; + var jointTranslationsSet = []; + var jointRotations = []; + var jointTranslations = []; + + allJointData.forEach(function(jointData, index) { + jointRotationsSet[index] = true; + jointTranslationsSet[index] = true; + jointRotations.push(jointData.rotation); + jointTranslations.push(jointData.translation); + + Entities.setAbsoluteJointTranslationInObjectFrame(doppelganger.id, index, jointData.translation); + Entities.setAbsoluteJointRotationInObjectFrame(doppelganger.id, index, jointData.rotation); + + }); + return true; } @@ -57,8 +89,8 @@ function getAvatarDimensions(avatar) { } function rotateDoppelgangerTowardAvatar(doppelganger, avatar) { - var avatarRot = Quat.fromPitchYawRollDegrees(0, avatar.bodyYaw, 0.0); - avatarRot = Vec3.multiply(-1,avatarRot); + var avatarRot = Quat.fromPitchYawRollDegrees(0, avatar.bodyYaw, 0.0); + avatarRot = Vec3.multiply(-1, avatarRot); return avatarRot; } @@ -73,8 +105,8 @@ function disconnectDoppelgangerUpdates() { function updateDoppelganger() { doppelgangers.forEach(function(doppelganger) { var joints = getJointData(MyAvatar); - var mirroredJoints = mirrorJointData(joints); - setJointData(doppelganger, mirroredJoints); + //var mirroredJoints = mirrorJointData(joints); + setJointData(doppelganger, joints); }); } @@ -82,10 +114,9 @@ function updateDoppelganger() { function makeDoppelgangerForMyAvatar() { var doppelganger = createDoppelganger(MyAvatar); doppelgangers.push(doppelganger); - // connectDoppelgangerUpdates(); + connectDoppelgangerUpdates(); } - makeDoppelgangerForMyAvatar(); function cleanup() { @@ -94,7 +125,6 @@ function cleanup() { doppelgangers.forEach(function(doppelganger) { Entities.deleteEntity(doppelganger); }); - } Script.scriptEnding.connect(cleanup); From bf296a36edea4f3cf4775d6974ad059634a5ade3 Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Mon, 28 Dec 2015 18:38:09 -0800 Subject: [PATCH 4/5] cleanup change model --- examples/example/avatarcontrol/doppelganger.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/example/avatarcontrol/doppelganger.js b/examples/example/avatarcontrol/doppelganger.js index f8a1103772..ed4079a211 100644 --- a/examples/example/avatarcontrol/doppelganger.js +++ b/examples/example/avatarcontrol/doppelganger.js @@ -9,8 +9,9 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +// To-Do: mirror joints, rotate avatar fully, automatically get avatar fbx, make sure dimensions for avatar are right when u bring it in -var TEST_MODEL_URL = 'http://hifi-content.s3.amazonaws.com/james/avatars/Jack_Skellington/Jack_Skellington.fbx'; +var TEST_MODEL_URL = 'https://s3.amazonaws.com/hifi-public/ozan/avatars/albert/albert/albert.fbx'; var doppelgangers = []; From a2d21ed5cbf78cb2d202673b78ac3245a684dc79 Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Mon, 28 Dec 2015 21:42:54 -0800 Subject: [PATCH 5/5] Update doppelganger.js delete correct id --- examples/example/avatarcontrol/doppelganger.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/example/avatarcontrol/doppelganger.js b/examples/example/avatarcontrol/doppelganger.js index ed4079a211..f5878f0763 100644 --- a/examples/example/avatarcontrol/doppelganger.js +++ b/examples/example/avatarcontrol/doppelganger.js @@ -124,7 +124,7 @@ function cleanup() { disconnectDoppelgangerUpdates(); doppelgangers.forEach(function(doppelganger) { - Entities.deleteEntity(doppelganger); + Entities.deleteEntity(doppelganger.id); }); } @@ -133,4 +133,4 @@ Script.scriptEnding.connect(cleanup); // APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS_SET, getJointRotationsSet()); // APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS, getJointRotations()); // APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS_SET, getJointTranslationsSet()); -// APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS, getJointTranslations()); \ No newline at end of file +// APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS, getJointTranslations());