static glTFNode ExportNode(Transform x, List <Transform> nodes, List <Renderer> renderers, List <SkinnedMeshRenderer> skins) { var node = new glTFNode { name = x.name, children = x.transform.GetChildren().Select(y => nodes.IndexOf(y)).ToArray(), rotation = x.transform.localRotation.ToArray(), translation = x.transform.localPosition.ToArray(), scale = x.transform.localScale.ToArray(), }; if (x.gameObject.activeInHierarchy) { var meshRenderer = x.GetComponent <MeshRenderer>(); if (meshRenderer != null) { node.mesh = renderers.IndexOf(meshRenderer); } var skinnedMeshRenderer = x.GetComponent <SkinnedMeshRenderer>(); if (skinnedMeshRenderer != null) { node.mesh = renderers.IndexOf(skinnedMeshRenderer); node.skin = skins.IndexOf(skinnedMeshRenderer); } } return(node); }
static glTFNode ExportNode(Transform x, List <Transform> nodes, List <Mesh> meshes, List <SkinnedMeshRenderer> skins) { var node = new glTFNode { name = x.name, children = x.transform.GetChildren().Select(y => nodes.IndexOf(y)).ToArray(), rotation = x.transform.localRotation.ToArray(), translation = x.transform.localPosition.ToArray(), scale = x.transform.localScale.ToArray(), }; var meshFilter = x.GetComponent <MeshFilter>(); if (meshFilter != null) { node.mesh = meshes.IndexOf(meshFilter.sharedMesh); } var skinnredMeshRenderer = x.GetComponent <SkinnedMeshRenderer>(); if (skinnredMeshRenderer != null) { node.mesh = meshes.IndexOf(skinnredMeshRenderer.sharedMesh); node.skin = skins.IndexOf(skinnredMeshRenderer); } return(node); }
private static string RelativePathFrom(List <glTFNode> nodes, glTFNode root, glTFNode target, List <string> path) { if (path.Count == 0) { path.Add(target.name); } var targetIndex = nodes.IndexOf(target); foreach (var parent in nodes) { if (parent.children == null || parent.children.Length == 0) { continue; } foreach (var child in parent.children) { if (child != targetIndex) { continue; } if (parent == root) { return(string.Join("/", path)); } path.Insert(0, parent.name); return(RelativePathFrom(nodes, root, parent, path)); } } return(string.Join("/", path)); }
public static string ToJson(this glTFNode self) { var f = new JsonFormatter(); GltfSerializer.Serialize_gltf_nodes_ITEM(f, self); return(f.ToString()); }
public void NodeTestError() { var model = new glTFNode() { name = "a", camera = -2, }; }
public static string RelativePathFrom(List <glTFNode> nodes, glTFNode root, glTFNode target) { if (root == target) { return(""); } var path = new List <string>(); return(RelativePathFrom(nodes, root, target, path)); }
public void NodeMeshTest() { var model = new glTFNode() { name = "a", mesh = 2, skin = 0, camera = -1, }; }
static glTFNode ExportNode(Transform x, List <Transform> nodes, List <MeshWithRenderer> meshWithRenderers, List <SkinnedMeshRenderer> skins) { var node = new glTFNode { name = x.name, children = x.transform.GetChildren().Select(y => nodes.IndexOf(y)).ToArray(), rotation = x.transform.localRotation.ToArray(), translation = x.transform.localPosition.ToArray(), scale = x.transform.localScale.ToArray(), }; if (x.gameObject.activeInHierarchy) { var meshRenderer = x.GetComponent <MeshRenderer>(); if (meshRenderer != null) { var meshFilter = x.GetComponent <MeshFilter>(); if (meshFilter != null) { var mesh = meshFilter.sharedMesh; var materials = meshRenderer.sharedMaterials; if (TryGetSameMeshIndex(meshWithRenderers, mesh, materials, out int meshIndex)) { node.mesh = meshIndex; } else { // MeshとMaterialが一致するものが見つからなかった throw new Exception("Mesh not found."); } } } var skinnedMeshRenderer = x.GetComponent <SkinnedMeshRenderer>(); if (skinnedMeshRenderer != null) { var mesh = skinnedMeshRenderer.sharedMesh; var materials = skinnedMeshRenderer.sharedMaterials; if (TryGetSameMeshIndex(meshWithRenderers, mesh, materials, out int meshIndex)) { node.mesh = meshIndex; node.skin = skins.IndexOf(skinnedMeshRenderer); } else { // MeshとMaterialが一致するものが見つからなかった throw new Exception("Mesh not found."); } } } return(node); }
public void NodeTest() { var model = new glTFNode() { name = "a", skin = 0, camera = -1, }; var json = model.ToJson(); Assert.AreEqual(@"{""name"":""a"",""skin"":0}", json); Debug.Log(json); }
public static GameObject ImportNode(glTFNode node, int nodeIndex) { var nodeName = node.name; if (!string.IsNullOrEmpty(nodeName) && nodeName.Contains("/")) { Debug.LogWarningFormat("node {0} contains /. replace _", node.name); nodeName = nodeName.Replace("/", "_"); } if (string.IsNullOrEmpty(nodeName)) { nodeName = string.Format("nodeIndex_{0}", nodeIndex); } var go = new GameObject(nodeName); // // transform // if (node.translation != null && node.translation.Length > 0) { go.transform.localPosition = new Vector3( node.translation[0], node.translation[1], node.translation[2]); } if (node.rotation != null && node.rotation.Length > 0) { go.transform.localRotation = new Quaternion( node.rotation[0], node.rotation[1], node.rotation[2], node.rotation[3]); } if (node.scale != null && node.scale.Length > 0) { go.transform.localScale = new Vector3( node.scale[0], node.scale[1], node.scale[2]); } if (node.matrix != null && node.matrix.Length > 0) { var m = UnityExtensions.MatrixFromArray(node.matrix); go.transform.localRotation = m.ExtractRotation(); go.transform.localPosition = m.ExtractPosition(); go.transform.localScale = m.ExtractScale(); } return(go); }
public void NodeTestError() { var model = new glTFNode() { name = "a", camera = -2, }; var c = new JsonSchemaValidationContext("") { EnableDiagnosisForNotRequiredFields = true, }; var ex = Assert.Throws <JsonSchemaValidationException>( () => JsonSchema.FromType <glTFNode>().Serialize(model, c) ); Assert.AreEqual("[camera.String] minimum: ! -2>=0", ex.Message); }
public void NodeMeshTest() { var model = new glTFNode() { name = "a", mesh = 2, skin = 0, camera = -1, }; var c = new JsonSchemaValidationContext("") { EnableDiagnosisForNotRequiredFields = true, }; var json = JsonSchema.FromType <glTFNode>().Serialize(model, c); Assert.AreEqual(@"{""name"":""a"",""mesh"":2,""skin"":0,""extras"":{}}", json); }
public static AnimationClip ConvertAnimationClip(GltfData data, glTFAnimation animation, IAxisInverter inverter, glTFNode root = null) { var clip = new AnimationClip(); clip.ClearCurves(); clip.legacy = true; clip.name = animation.name; clip.wrapMode = WrapMode.Loop; foreach (var channel in animation.channels) { var relativePath = RelativePathFrom(data.GLTF.nodes, root, data.GLTF.nodes[channel.target.node]); switch (channel.target.path) { case glTFAnimationTarget.PATH_TRANSLATION: { var sampler = animation.samplers[channel.sampler]; var input = data.GetArrayFromAccessor <float>(sampler.input); var output = data.FlatternFloatArrayFromAccessor(sampler.output); AnimationImporterUtil.SetAnimationCurve( clip, relativePath, new string[] { "localPosition.x", "localPosition.y", "localPosition.z" }, input, output, sampler.interpolation, typeof(Transform), (values, last) => { Vector3 temp = new Vector3(values[0], values[1], values[2]); return(inverter.InvertVector3(temp).ToArray()); } ); } break; case glTFAnimationTarget.PATH_ROTATION: { var sampler = animation.samplers[channel.sampler]; var input = data.GetArrayFromAccessor <float>(sampler.input); var output = data.FlatternFloatArrayFromAccessor(sampler.output); AnimationImporterUtil.SetAnimationCurve( clip, relativePath, new string[] { "localRotation.x", "localRotation.y", "localRotation.z", "localRotation.w" }, input, output, sampler.interpolation, typeof(Transform), (values, last) => { Quaternion currentQuaternion = new Quaternion(values[0], values[1], values[2], values[3]); Quaternion lastQuaternion = new Quaternion(last[0], last[1], last[2], last[3]); return(AnimationImporterUtil.GetShortest(lastQuaternion, inverter.InvertQuaternion(currentQuaternion)).ToArray()); } ); clip.EnsureQuaternionContinuity(); } break; case glTFAnimationTarget.PATH_SCALE: { var sampler = animation.samplers[channel.sampler]; var input = data.GetArrayFromAccessor <float>(sampler.input); var output = data.FlatternFloatArrayFromAccessor(sampler.output); AnimationImporterUtil.SetAnimationCurve( clip, relativePath, new string[] { "localScale.x", "localScale.y", "localScale.z" }, input, output, sampler.interpolation, typeof(Transform), (values, last) => values); } break; case glTFAnimationTarget.PATH_WEIGHT: { var node = data.GLTF.nodes[channel.target.node]; var mesh = data.GLTF.meshes[node.mesh]; var primitive = mesh.primitives.FirstOrDefault(); var targets = primitive.targets; if (!gltf_mesh_extras_targetNames.TryGet(mesh, out List <string> targetNames)) { throw new UniGLTFNotSupportedException("glTF BlendShape Animation. targetNames invalid."); } var keyNames = targetNames .Where(x => !string.IsNullOrEmpty(x)) .Select(x => "blendShape." + x) .ToArray(); var sampler = animation.samplers[channel.sampler]; var input = data.GetArrayFromAccessor <float>(sampler.input); var output = data.GetArrayFromAccessor <float>(sampler.output); AnimationImporterUtil.SetAnimationCurve( clip, relativePath, keyNames, input, output, sampler.interpolation, typeof(SkinnedMeshRenderer), (values, last) => { for (int j = 0; j < values.Length; j++) { values[j] *= 100.0f; } return(values); }); } break; default: Debug.LogWarningFormat("unknown path: {0}", channel.target.path); break; } } return(clip); }
public static void Serialize_gltf_nodes_ITEM(JsonFormatter f, glTFNode value) { f.BeginMap(); if (!string.IsNullOrEmpty(value.name)) { f.Key("name"); f.Value(value.name); } if (value.children != null && value.children.Length >= 1) { f.Key("children"); Serialize_gltf_nodes__children(f, value.children); } if (value.matrix != null && value.matrix.Length >= 16) { f.Key("matrix"); Serialize_gltf_nodes__matrix(f, value.matrix); } if (value.translation != null && value.translation.Length >= 3 && !value.translation.SequenceEqual(new float[] { 0, 0, 0 })) { f.Key("translation"); Serialize_gltf_nodes__translation(f, value.translation); } if (value.rotation != null && value.rotation.Length >= 4 && !value.rotation.SequenceEqual(new float[] { 0, 0, 0, 1 })) { f.Key("rotation"); Serialize_gltf_nodes__rotation(f, value.rotation); } if (value.scale != null && value.scale.Length >= 3 && !value.scale.SequenceEqual(new float[] { 1, 1, 1 })) { f.Key("scale"); Serialize_gltf_nodes__scale(f, value.scale); } if (value.mesh >= 0) { f.Key("mesh"); f.Value(value.mesh); } if (value.skin >= 0) { f.Key("skin"); f.Value(value.skin); } if (value.weights != null && value.weights.Length >= 1) { f.Key("weights"); Serialize_gltf_nodes__weights(f, value.weights); } if (value.camera >= 0) { f.Key("camera"); f.Value(value.camera); } if (value.extensions != null) { f.Key("extensions"); value.extensions.Serialize(f); } if (value.extras != null) { f.Key("extras"); value.extras.Serialize(f); } f.EndMap(); }
static GameObject ImportNode(glTFNode node) { var go = new GameObject(node.name); // // transform // if (node.translation != null && node.translation.Length > 0) { go.transform.localPosition = new Vector3( node.translation[0], node.translation[1], node.translation[2]); } if (node.rotation != null && node.rotation.Length > 0) { go.transform.localRotation = new Quaternion( node.rotation[0], node.rotation[1], node.rotation[2], node.rotation[3]); } if (node.scale != null && node.scale.Length > 0) { go.transform.localScale = new Vector3( node.scale[0], node.scale[1], node.scale[2]); } if (node.matrix != null && node.matrix.Length > 0) { var values = node.matrix; #if UNITY_2017_OR_NEWER var col0 = new Vector4(values[0], values[1], values[2], values[3]); var col1 = new Vector4(values[4], values[5], values[6], values[7]); var col2 = new Vector4(values[8], values[9], values[10], values[11]); var col3 = new Vector4(values[12], values[13], values[14], values[15]); var m = new Matrix4x4(col0, col1, col2, col3); go.transform.localRotation = m.rotation; go.transform.localPosition = m.GetColumn(3); #else // https://forum.unity.com/threads/how-to-assign-matrix4x4-to-transform.121966/ var m = new Matrix4x4(); m.m00 = values[0]; m.m10 = values[1]; m.m20 = values[2]; m.m30 = values[3]; m.m01 = values[4]; m.m11 = values[5]; m.m21 = values[6]; m.m31 = values[7]; m.m02 = values[8]; m.m12 = values[9]; m.m22 = values[10]; m.m32 = values[11]; m.m03 = values[12]; m.m13 = values[13]; m.m23 = values[14]; m.m33 = values[15]; go.transform.localRotation = m.ExtractRotation(); go.transform.localPosition = m.ExtractPosition(); #endif } return(go); }