public void InitAssImp(Assimp.Scene aiRoot, Scene.Entity3D root) { if (aiRoot.HasAnimations == false) { return; } _skeleton = CreateBoneTree(aiRoot.RootNode, null); Console.WriteLine("Proc bones:" + _skeleton.Name + " C:" + _skeleton.Children.Count); foreach (Assimp.Mesh mesh in aiRoot.Meshes) { foreach (Assimp.Bone bone in mesh.Bones) { if (!_bonesByName.TryGetValue(bone.Name, out Bone found)) { continue; } bool skip = (from t in _bones let bname = bone.Name where t.Name == bname select t).Any(); if (skip) { continue; } found.Offset = ToTK(bone.OffsetMatrix); _bones.Add(found); _bonesToIndex[found.Name] = _bones.IndexOf(found); } Assimp.Mesh mesh1 = mesh; foreach (string bone in _bonesByName.Keys.Where(b => mesh1.Bones.All(b1 => b1.Name != b) && b.StartsWith("Bone"))) { _bonesByName[bone].Offset = _bonesByName[bone].Parent.Offset; _bones.Add(_bonesByName[bone]); _bonesToIndex[bone] = _bones.IndexOf(_bonesByName[bone]); } } ExtractAnimations(aiRoot); const float timestep = 1.0f / 30.0f; for (int i = 0; i < Animations.Count; i++) { SetAnimationIndex(i); float dt = 0.0f; for (float ticks = 0.0f; ticks < Animations[i].Duration; ticks += Animations[i].TicksPerSecond / 30.0f) { dt += timestep; Calculate(dt); List <OpenTK.Matrix4> trans = new List <OpenTK.Matrix4>(); for (int a = 0; a < _bones.Count; a++) { OpenTK.Matrix4 rotMat = _bones[a].Offset * _bones[a].GlobalTransform; trans.Add(rotMat); } Animations[i].Transforms.Add(trans); } } Console.WriteLine("Finished loading animations with " + _bones.Count + " bones"); }
public PyDynamic(PyType type, Scene.Entity3D ent) { Sent = ent; PhysicsManager.AddObj(this); Mat = PhysicsManager.py.CreateMaterial(0.7f, 0.7f, 0.1f); switch (type) { case PyType.Box: CreateBox(ent); break; break; } }
public void CreateBox(Scene.Entity3D ent) { Scene.Bounds bb = ent.Bounds; ID = PhysicsManager.py.CreateRigidDynamic(); BoxGeometry ge = new BoxGeometry(bb.W / 2, bb.H / 2, bb.D / 2); // Shape = ID.CreateShape ( ge, Mat ); ID.LinearVelocity = new System.Numerics.Vector3(0, 0, 0); Shape = RigidActorExt.CreateExclusiveShape(ID, ge, Mat); //Pose = ID.GlobalPose; var wm = ent.WorldNoScale; float m11 = wm.M11; float m12 = wm.M12; float m13 = wm.M13; float m14 = wm.M14; float m21 = wm.M21; float m22 = wm.M22; float m23 = wm.M23; float m24 = wm.M24; float m31 = wm.M31; float m32 = wm.M32; float m33 = wm.M33; float m34 = wm.M34; float m41 = wm.M41; float m42 = wm.M42; float m43 = wm.M43; float m44 = wm.M44; System.Numerics.Matrix4x4 tm = new System.Numerics.Matrix4x4(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44); ID.GlobalPose = tm; ID.SetMassAndUpdateInertia(3); Physics.PhysicsManager.Scene.AddActor(ID); }
public void CreateMesh(Scene.Entity3D ent) { System.Collections.Generic.List <OpenTK.Vector3> verts = ent.GetAllVerts(); System.Collections.Generic.List <int> tris = ent.GetAllTris(); System.Numerics.Vector3[] rvert = new System.Numerics.Vector3[verts.Count]; int vi = 0; foreach (OpenTK.Vector3 v in verts) { rvert[vi] = new System.Numerics.Vector3(v.X, v.Y, v.Z); vi++; } int[] at = new int[tris.Count]; for (int i = 0; i < tris.Count; i++) { at[i] = tris[i]; } TriangleMeshDesc tm = new TriangleMeshDesc() { Flags = 0, Triangles = at, Points = rvert }; Cooking cook = PhysicsManager.py.CreateCooking(); MemoryStream str = new MemoryStream(); TriangleMeshCookingResult cookr = cook.CookTriangleMesh(tm, str); str.Position = 0; TriangleMesh trim = PhysicsManager.py.CreateTriangleMesh(str); TriangleMeshGeometry trig = new TriangleMeshGeometry(trim); RID = PhysicsManager.py.CreateRigidStatic(); Shape ns = RigidActorExt.CreateExclusiveShape(RID, trig, Mat); //RID.CreateShape ( trig, Mat ); var wm = ent.WorldNoScale; float m11 = wm.M11; float m12 = wm.M12; float m13 = wm.M13; float m14 = wm.M14; float m21 = wm.M21; float m22 = wm.M22; float m23 = wm.M23; float m24 = wm.M24; float m31 = wm.M31; float m32 = wm.M32; float m33 = wm.M33; float m34 = wm.M34; float m41 = wm.M41; float m42 = wm.M42; float m43 = wm.M43; float m44 = wm.M44; System.Numerics.Matrix4x4 tp = new System.Numerics.Matrix4x4(m11, m12, m13, m14, m21, m22, m23, m24, m31, m32, m33, m34, m41, m42, m43, m44); // RID.GlobalPose = System.Numerics.Matrix4x4.CreateRotationX(-(float)System.Math.PI / 2); //RID.GlobalPosePosition = ent.LocalPos; PhysicsManager.Scene.AddActor(RID); }
public PyStatic(Scene.Entity3D ent) { Mat = PhysicsManager.py.CreateMaterial(0.7f, 0.7f, 0.1f); CreateMesh(ent); PhysicsManager.AddObj(this); }
public virtual void Create(Scene.Entity3D ent) { }