|
@@ -830,11 +830,49 @@ THREE.GLTFExporter.prototype = {
|
|
|
|
|
|
var target = {};
|
|
|
|
|
|
+ var warned = false;
|
|
|
+
|
|
|
for ( var attributeName in geometry.morphAttributes ) {
|
|
|
|
|
|
+ // glTF 2.0 morph supports only POSITION/NORMAL/TANGENT.
|
|
|
+ // Three.js doesn't support TANGENT yet.
|
|
|
+
|
|
|
+ if ( attributeName !== 'position' && attributeName !== 'normal' ) {
|
|
|
+
|
|
|
+ if ( ! warned ) {
|
|
|
+
|
|
|
+ console.warn( 'GLTFExporter: Only POSITION and NORMAL morph are supported.' );
|
|
|
+ warned = true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ continue;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
var attribute = geometry.morphAttributes[ attributeName ][ i ];
|
|
|
- attributeName = nameConversion[ attributeName ] || attributeName.toUpperCase();
|
|
|
- target[ attributeName ] = processAccessor( attribute, geometry );
|
|
|
+
|
|
|
+ // Three.js morph attribute has absolute values while the one of glTF has relative values.
|
|
|
+ //
|
|
|
+ // glTF 2.0 Specification:
|
|
|
+ // https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#morph-targets
|
|
|
+
|
|
|
+ var baseAttribute = geometry.attributes[ attributeName ];
|
|
|
+ // Clones attribute not to override
|
|
|
+ var relativeAttribute = attribute.clone();
|
|
|
+
|
|
|
+ for ( var j = 0, jl = attribute.count; j < jl; j ++ ) {
|
|
|
+
|
|
|
+ relativeAttribute.setXYZ(
|
|
|
+ j,
|
|
|
+ attribute.getX( j ) - baseAttribute.getX( j ),
|
|
|
+ attribute.getY( j ) - baseAttribute.getY( j ),
|
|
|
+ attribute.getZ( j ) - baseAttribute.getZ( j )
|
|
|
+ );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ target[ attributeName.toUpperCase() ] = processAccessor( relativeAttribute, geometry );
|
|
|
|
|
|
}
|
|
|
|