MyAvatar animation JavaScript API changes


#21

We recently made a change to the installer used to install github pull requests. I’ll forward this issue to our build engineers.


#22

Thanks @hyperlogic - in the meantime, I’m going to set up a C++ dev environment this end. I’ve avoided it for too long, is time I started getting to grips with the src…


#23

Here is the API Doc for the PrioVR. There is a subsection with respect to Plugin Use.

http://metaversecafe.com/images/PrioAPI_Manual.pdf


#24

This PR has been merged into master.


#25

Have been curious about PrioVR so took a look and that actually seems to be their low-level sensor API; there is a higher-level Skeleton API too.

I bet the same JS data path davedub used for EEG sensing would work to feed joint data into Interface. PrioVR’s YEI Skeleton seems pretty standard – so with a proportional avatar you could likely map the values directly onto MyAvatar joints.

Beware however that the PrioVR is basically a full-body electromechanical fingerprinting device. And unlike usernames and IP addresses (which are essentially choices), your decade-strong physical habits might form an obvious identity pattern (and one that’s virtually impossible for you to walk away from).

So, rather than disabling Interface’s IK and animations neck-down (which you could do to prefer the actual telemetry), it might make sense to leverage everything together still as a way to falsify your “bionic identity.” See also: scramble suits.


#26

@hyperlogic

I have had a look at the new MyAvatar.getDefaultJointRotation(jointNumber) function. I am seeing unexpected values:

Pre-rots for Hips(joint #0) are 0.00000, 0.00000, 0.00000
Pre-rots for LeftUpLeg(joint #6) are -0.00000, -0.00000, 57.29578
Pre-rots for RightUpLeg(joint #1) are 0.00000, 0.00000, 57.29578
Pre-rots for LeftLeg(joint #7) are 0.00000, -0.00000, -0.00000
Pre-rots for RightLeg(joint #2) are -0.00000, -0.00000, 0.00000
Pre-rots for LeftFoot(joint #8) are 24.84512, 0.00000, 0.00000
Pre-rots for RightFoot(joint #3) are 24.87161, 0.00000, 0.00000
Pre-rots for LeftToeBase(joint #9) are 18.74667, 0.00000, 0.00000
Pre-rots for RightToeBase(joint #4) are 18.74792, 0.00000, 0.00000
Pre-rots for Spine(joint #11) are -0.00000, 0.00000, 0.00000
Pre-rots for Spine1(joint #12) are -0.00000, -0.00000, 0.00000
Pre-rots for Spine2(joint #13) are 0.00000, 0.00000, 0.00000
Pre-rots for LeftShoulder(joint #38) are 33.68776, 22.50640, -33.66955
Pre-rots for RightShoulder(joint #14) are 33.66622, -22.53860, 33.66622
Pre-rots for LeftArm(joint #39) are -11.15861, 0.02650, 0.08804
Pre-rots for RightArm(joint #15) are -11.12762, -0.00000, -0.00000
Pre-rots for LeftForeArm(joint #40) are 0.00000, -0.00000, -0.11292
Pre-rots for RightForeArm(joint #16) are 0.00044, 0.00000, -0.00000
Pre-rots for LeftHand(joint #41) are 0.66209, -0.00402, 0.34818
Pre-rots for RightHand(joint #17) are 0.66070, 0.00402, -0.34818

Applying these values as either radians or converting to degrees (as above) does not give the expected results. By inspection, I can see the UpLeg values are quite different from the expected values, as they need to be around 180 degrees (or PI radians) in at least one axis for the legs to point in the right direction. Here’s how a standard avatar looks with just the getDefaultJointRotation values applied:

As a comparison, here are my ‘best guess’ pre-rotation values, as used when ‘Add pre-rotations’ is selected in the walk.js 2.0 beta settings. They are not quite correct on an avatar-by-avatar basis, but they do produce a reference pose that is close to the expected result: (src: https://hifi-content.s3.amazonaws.com/dave/walk-beta/assets/miscellaneous/pre-rotations.json)

Am unsure how to proceed - any help getting access to each avatar’s individual pre-rotation values (where available) appreciated!

  • davedub

#27

I’m not only unafraid of this; I’m actually investing on this assumption quite heavily… 2016 will be an interesting year. :smile: Thank you for taking the time to confirm this assumption.


#28

https://community.secondlife.com/t5/Featured-News/Introducing-Project-Bento-New-Bones-Added-to-Second-Life-Avatar/ba-p/2987206. I was just looking at the planned updates to secondlifes rig wonders if that will have all the problems we face


#29

Well, probably not all the problems:

Also from their knowledge base

(emphasis above mine)

Also did a quick search for fbx and:




ps: here is a machine-generated sampling of defaultAvatar_full.fbx’s angles as ran through Dec 5’s FBXReader*.cpp (ie: emerged from the actual HiFi C++ FBXMesh in-memory raw data structures right after parsing; transform and bindingTransform are technically mat4’s, but I’ve extracted their rotation components here for comparison).

{
  "author": "/* defaultAvatar_full.fbx */",
  "applicationName": "Maya",
  "name": "FBXReader.cpp Rotations",
  "joints": {
    "Hips": {
      "preRotation": {"x":0,"y":0,"z":0},
      "rotation": {"x": -0.000, "y": -0.001, "z": 0.034},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": 0.000, "y": 0.001, "z": -0.034},
      "inverseBindRotation": {"x": 0.013, "y": 0, "z": -0.034},
      "transform": {"x": 0, "y": 0, "z": 179.998},
      "bindTransform": {"x": -0.000, "y": -0.001, "z": 0.034}
    },
    "RightUpLeg": {
      "preRotation": {"x": -4.411, "y": -0.193, "z": 177.490},
      "rotation": {"x": 4.476, "y": 0.162, "z": 0.344},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": 0.063, "y": -0.006, "z": -177.855},
      "inverseBindRotation": {"x": 0.063, "y": -0.006, "z": -177.855},
      "transform": {"x": 0.002, "y": -0.000, "z": 179.916},
      "bindTransform": {"x":0,"y":0,"z":0}
    },
    "RightLeg": {
      "preRotation": {"x": 2.992, "y": 0, "z": 4.576},
      "rotation": {"x": -6.850, "y": 0.204, "z": -0.036},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": -3.799, "y": 0.036, "z": 177.586},
      "inverseBindRotation": {"x": -3.799, "y": 0.036, "z": 177.586},
      "transform": {"x": -0.147, "y": 0.004, "z": -179.906},
      "bindTransform": {"x":0,"y":0,"z":0}
    },
    "RightFoot": {
      "preRotation": {"x": 56.338, "y": 3.482, "z": 0},
      "rotation": {"x": 2.392, "y": -0.184, "z": -0.101},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": 54.912, "y": 3.701, "z": -178.150},
      "inverseBindRotation": {"x": 54.912, "y": 3.701, "z": -178.150},
      "transform": {"x": 1.832, "y": 0.143, "z": -179.995},
      "bindTransform": {"x":0,"y":0,"z":0}
    },
    "RightToeBase": {
      "preRotation": {"x": 34.915, "y": 0.558, "z": 0},
      "rotation": {"x":0,"y":0,"z":0},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": 89.861, "y": 2.434, "z": -176.044},
      "inverseBindRotation": {"x": 89.861, "y": 2.434, "z": -176.044},
      "transform": {"x": 2.264, "y": 0.127, "z": 179.972},
      "bindTransform": {"x":0,"y":0,"z":0}
    },
    "LeftUpLeg": {
      "preRotation": {"x": -4.443, "y": 0.195, "z": -177.490},
      "rotation": {"x": 4.432, "y": -0.159, "z": -0.395},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": -0.012, "y": 0.006, "z": 177.837},
      "inverseBindRotation": {"x": -0.012, "y": 0.006, "z": 177.837},
      "transform": {"x": -0.000, "y": 0.000, "z": -179.916},
      "bindTransform": {"x":0,"y":0,"z":0}
    },
    "LeftLeg": {
      "preRotation": {"x": 2.677, "y": 0, "z": -4.575},
      "rotation": {"x": -6.458, "y": -0.202, "z": 0.033},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": -3.798, "y": -0.039, "z": -177.602},
      "inverseBindRotation": {"x": -3.798, "y": -0.039, "z": -177.602},
      "transform": {"x": -0.147, "y": -0.004, "z": 179.907},
      "bindTransform": {"x":0,"y":0,"z":0}
    },
    "LeftFoot": {
      "preRotation": {"x": 56.732, "y": -3.461, "z": 0},
      "rotation": {"x": 2.043, "y": 0.190, "z": 0.103},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": 54.958, "y": -3.670, "z": 178.153},
      "inverseBindRotation": {"x": 54.958, "y": -3.670, "z": 178.153},
      "transform": {"x": 1.833, "y": -0.142, "z": 179.995},
      "bindTransform": {"x":0,"y":0,"z":0}
    },
    "LeftToeBase": {
      "preRotation": {"x": 34.869, "y": -0.592, "z": 0},
      "rotation": {"x":0,"y":0,"z":0},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": 89.861, "y": -2.441, "z": 176.046},
      "inverseBindRotation": {"x": 89.861, "y": -2.441, "z": 176.046},
      "transform": {"x": 2.264, "y": -0.127, "z": -179.972},
      "bindTransform": {"x":0,"y":0,"z":0}
    },
    "Spine": {
      "preRotation": {"x": -6.750, "y": 0, "z": 0},
      "rotation": {"x": 0.000, "y": 0.005, "z": -0.033},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": 6.750, "y": 0, "z": 0},
      "inverseBindRotation": {"x": 6.750, "y": 0, "z": 0},
      "transform": {"x": -179.727, "y": 0, "z": 0},
      "bindTransform": {"x": -6.750, "y": 0, "z": 0}
    },
    "Spine1": {
      "preRotation": {"x":0,"y":0,"z":0},
      "rotation": {"x":0,"y":0,"z":0},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": 6.750, "y": 0, "z": 0},
      "inverseBindRotation": {"x": 6.750, "y": 0, "z": 0},
      "transform": {"x": -179.727, "y": 0, "z": 0},
      "bindTransform": {"x": -6.750, "y": 0, "z": 0}
    },
    "Spine2": {
      "preRotation": {"x":0,"y":0,"z":0},
      "rotation": {"x":0,"y":0,"z":0},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": 6.750, "y": 0, "z": 0},
      "inverseBindRotation": {"x": 6.750, "y": 0, "z": 0},
      "transform": {"x": -179.727, "y": 0, "z": 0},
      "bindTransform": {"x": -6.750, "y": 0, "z": 0}
    },
    "RightShoulder": {
      "preRotation": {"x": -76.310, "y": -88.796, "z": 177.820},
      "rotation": {"x": 0.000, "y": 0, "z": 0},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": -82.958, "y": -11.507, "z": -91.227},
      "inverseBindRotation": {"x": -82.958, "y": -11.507, "z": -91.227},
      "transform": {"x": -1.092, "y": -1.373, "z": 178.759},
      "bindTransform": {"x": 1.523, "y": -83.098, "z": 100.057}
    },
    "RightArm": {
      "preRotation": {"x": -6.815, "y": 0, "z": 2.674},
      "rotation": {"x": -4.707, "y": -0.157, "z": -3.823},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": -83.580, "y": -0.000, "z": -89.999},
      "inverseBindRotation": {"x": -83.580, "y": -0.000, "z": -89.999},
      "transform": {"x": -1.124, "y": -1.149, "z": 178.738},
      "bindTransform": {"x": 0.000, "y": -83.580, "z": 89.999}
    },
    "RightForeArm": {
      "preRotation": {"x": -4.647, "y": 0, "z": -6.610},
      "rotation": {"x": 4.616, "y": -0.266, "z": 6.610},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": -83.312, "y": -0.000, "z": -90},
      "inverseBindRotation": {"x": -83.312, "y": -0.000, "z": -89.999},
      "transform": {"x": -1.124, "y": -1.149, "z": 178.733},
      "bindTransform": {"x": 0.000, "y": -83.312, "z": 89.999}
    },
    "RightHand": {
      "preRotation": {"x": 7.516, "y": 0, "z": 1.503},
      "rotation": {"x": -7.514, "y": -0.098, "z": -1.503},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": -83.213, "y": -0.000, "z": -90.000},
      "inverseBindRotation": {"x": -83.213, "y": -0.000, "z": -90},
      "transform": {"x": -1.123, "y": -1.148, "z": 178.731},
      "bindTransform": {"x": 0.000, "y": -83.213, "z": 89.999}
    },
    "LeftShoulder": {
      "preRotation": {"x": -76.760, "y": 88.425, "z": -178.226},
      "rotation": {"x": 0.000, "y": 0, "z": 0},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": -82.881, "y": 11.460, "z": 91.605},
      "inverseBindRotation": {"x": -82.881, "y": 11.460, "z": 91.605},
      "transform": {"x": -1.099, "y": 1.372, "z": -178.759},
      "bindTransform": {"x": -1.506, "y": 83.021, "z": -103.064}
    },
    "LeftArm": {
      "preRotation": {"x": -6.762, "y": 0, "z": -2.202},
      "rotation": {"x": -4.712, "y": 0.153, "z": 3.732},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": -83.485, "y": 0.000, "z": 89.999},
      "inverseBindRotation": {"x": -83.485, "y": 0.000, "z": 89.999},
      "transform": {"x": -1.124, "y": 1.149, "z": -178.736},
      "bindTransform": {"x": 0.000, "y": 83.485, "z": -89.999}
    },
    "LeftForeArm": {
      "preRotation": {"x": -4.635, "y": 0, "z": 6.624},
      "rotation": {"x": 4.604, "y": 0.266, "z": -6.624},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": -83.216, "y": 0.000, "z": 89.999},
      "inverseBindRotation": {"x": -83.216, "y": 0.000, "z": 89.999},
      "transform": {"x": -1.123, "y": 1.148, "z": -178.731},
      "bindTransform": {"x": 0.000, "y": 83.216, "z": -89.999}
    },
    "LeftHand": {
      "preRotation": {"x": 2.831, "y": 0, "z": -0.644},
      "rotation": {"x": -2.831, "y": 0.015, "z": 0.644},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x": -83.200, "y": 0.000, "z": 89.999},
      "inverseBindRotation": {"x": -83.200, "y": 0.000, "z": 89.999},
      "transform": {"x": -1.123, "y": 1.148, "z": -178.731},
      "bindTransform": {"x": 0.000, "y": 83.200, "z": -89.999}
    },
    "Neck": {
      "preRotation": {"x": 6.750, "y": 0, "z": 0},
      "rotation": {"x":0,"y":0,"z":0},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x":0,"y":0,"z":0},
      "inverseBindRotation": {"x":0,"y":0,"z":0},
      "transform": {"x": 0, "y": 0, "z": -180},
      "bindTransform": {"x": 0, "y": 0, "z": 0}
    },
    "Head": {
      "preRotation": {"x":0,"y":0,"z":0},
      "rotation": {"x":0,"y":0,"z":0},
      "postRotation": {"x":0,"y":0,"z":0},
      "inverseDefaultRotation": {"x":0,"y":0,"z":0},
      "inverseBindRotation": {"x":0,"y":0,"z":0},
      "transform": {"x": 0, "y": 0, "z": -180},
      "bindTransform": {"x": 0, "y": 0, "z": 0}
    }
  }
}

#30

Doubtful if many or any problems will arise from the bone model extension. SL1 is about compatibility. The problems will be with all the OpenSim variant grids whose owners now face the me-too feature coding race. The problems HF faces are deciding on a bone axes, rotation space and zero-point origins, and also finding a clean way to couple to existing modeling tools that do not cost $1500 a year per seat.


#31

I was looking through the spec earlier this morning, and I think they will have a different issue vs one which high fidelity has. They are using bones, which work fantastically the specific face they have been made for: The moment you rotate those, the behavior is different depending on someones face structure. This is also the reason why they do not want one to translate the bones in SL: doing so could anyones work someone has done in the shape engine.

This is not even including Non-human avatars. The cross compatability is simply broken with different avatars. which Is why I am fine with HF method of going for shapekeys, which are more friendlier when it comes to cross-avatar compatability (smile will be a smile for all). Will have to try out the SL Bento later this weekend.