public Mesh CreateMesh() { if (m_positioins.Any(x => float.IsNaN(x.X) || float.IsNaN(x.Y) || float.IsNaN(x.Z))) { throw new Exception(); } var mesh = new Mesh(); mesh.VertexBuffer = new VertexBuffer(); mesh.VertexBuffer.Add(VertexBuffer.PositionKey, m_positioins.ToArray()); mesh.VertexBuffer.Add(VertexBuffer.JointKey, m_boneWeights.Select(x => new SkinJoints( (ushort)x.boneIndex0, (ushort)x.boneIndex1, (ushort)x.boneIndex2, (ushort)x.boneIndex3)).ToArray()); mesh.VertexBuffer.Add(VertexBuffer.WeightKey, m_boneWeights.Select(x => new Vector4( x.weight0, x.weight1, x.weight2, x.weight3 )).ToArray()); mesh.IndexBuffer = BufferAccessor.Create(m_indices.ToArray()); mesh.Submeshes.Add(new Submesh(0, mesh.IndexBuffer.Count, null)); return(mesh); }
public static Mesh CreateQuadrangle() { var mesh = new Mesh(); mesh.IndexBuffer = BufferAccessor.Create(new int[] { 0, 1, 2, 2, 3, 0 }); mesh.VertexBuffer = new VertexBuffer(); mesh.VertexBuffer.Add(VertexBuffer.PositionKey, new Vector3[] { new Vector3(-1, 1, 0), new Vector3(1, 1, 0), new Vector3(1, -1, 0), new Vector3(-1, -1, 0), }); mesh.VertexBuffer.Add(VertexBuffer.TexCoordKey, new Vector2[] { new Vector2(0, 0), new Vector2(1, 0), new Vector2(1, 1), new Vector2(0, 1), }); mesh.Submeshes.Add(new Submesh(0, 6, new Material("SCREEN"))); return(mesh); }
/// <summary> /// モーションの基本姿勢を basePose ベースに再計算する /// /// basePose は Humanoid.CopyNodes が必用 ! /// </summary> public Animation RebaseAnimation(Humanoid basePose) { var map = NodeMap.ToDictionary(kv => kv.Key, kv => new List <Quaternion>()); var hipsPositions = new List <Vector3>(); foreach (var(seconds, keyframes) in KeyFramesGroupBySeconds()) { // モーション適用 SetTime(seconds); Root.CalcWorldMatrix(); foreach (var keyframe in keyframes) { if (!keyframe.Node.HumanoidBone.HasValue || keyframe.Node.HumanoidBone.Value == HumanoidBones.unknown) { continue; } // ローカル回転を算出する var t = basePose[keyframe.Node].Rotation; var w = keyframe.Node.Rotation; var w_from_t = w * Quaternion.Inverse(t); // parent var key = keyframe.Node.HumanoidBone.Value; var curve = map[keyframe.Node]; if (key != HumanoidBones.hips) { if (basePose[key].Parent == null) { throw new Exception(); } var parent_t = basePose[key].Parent.Rotation; var parent_w = keyframe.Node.Parent.Rotation; var parent_w_from_t = parent_w * Quaternion.Inverse(parent_t); var r = Quaternion.Inverse(parent_w_from_t) * w_from_t; curve.Add(r); } else { // hips curve.Add(w_from_t); hipsPositions.Add(keyframe.Node.Translation); } } } var dst = new Animation(Name + ".tpose"); foreach (var kv in map) { if (!kv.Value.Any()) { continue; } var bone = kv.Key.HumanoidBone.Value; var inCurve = NodeMap[kv.Key].Curves[AnimationPathType.Rotation].In; if (inCurve.Count != kv.Value.Count) { throw new Exception(); } var nodeAnimation = new NodeAnimation(); nodeAnimation.Curves.Add(AnimationPathType.Rotation, new CurveSampler { In = inCurve, Out = BufferAccessor.Create(kv.Value.ToArray()), }); if (bone == HumanoidBones.hips) { nodeAnimation.Curves.Add(AnimationPathType.Translation, new CurveSampler { In = inCurve, Out = BufferAccessor.Create(hipsPositions.ToArray()), }); } dst.AddCurve(kv.Key, nodeAnimation); } return(dst); }
public static void Add <T>(this VertexBuffer v, string key, T[] list) where T : struct { v.Add(key, BufferAccessor.Create(list)); }