public void DrawSkinnedModel(String modelName, String animName, Vector3 position, float rotation) { SkinnedModelInstance skinnedModelInstance = new SkinnedModelInstance(); skinnedModelInstance.Mesh = dSkinnedModelDict[modelName]; skinnedModelInstance.Mesh.Meshes[0].Texture = dTextureDict["pankka_body"]; skinnedModelInstance.SpeedTransitionSecond = 0.4f; skinnedModelInstance.Initialize(); skinnedModelInstance.SetAnimation(dSkinnedAnimationDict[animName], gameTime); Matrix positionMatrix = Matrix.CreateTranslation(position); Matrix rotationMatrix = Matrix.CreateRotationY(rotation); float scale = 0.025f; skinnedModelInstance.Transformation = Matrix.CreateScale(scale) * rotationMatrix * positionMatrix; skinnedModelInstance.Update(gameTime); SkinnedModelEffect.Parameters["SunOrientation"].SetValue(Vector3.Normalize(SunOrientation)); SkinnedModelEffect.Parameters["World"].SetValue(skinnedModelInstance.Transformation); SkinnedModelEffect.Parameters["WorldViewProjection"].SetValue(skinnedModelInstance.Transformation * viewMatrix * projectionMatrix); foreach (var meshInstance in skinnedModelInstance.MeshInstances) { SkinnedModelEffect.Parameters["gBonesOffsets"].SetValue(meshInstance.BonesOffsets); SkinnedModelEffect.Parameters["Texture1"].SetValue(meshInstance.Mesh.Texture); graphicsDevice.SetVertexBuffer(meshInstance.Mesh.VertexBuffer); graphicsDevice.Indices = meshInstance.Mesh.IndexBuffer; graphicsDevice.DepthStencilState = DepthStencilState.Default; foreach (EffectPass pass in SkinnedModelEffect.CurrentTechnique.Passes) { pass.Apply(); graphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, meshInstance.Mesh.FaceCount); } } graphicsDevice.SetVertexBuffer(null); graphicsDevice.Indices = null; //skinnedModelInstance.Dispose(); }
public void SkinnedModelInstance_CalculatesCorrectBoneMatrices(String modelAssetFile, String modelBoneDataFile) { GivenAnUltravioletApplicationWithNoWindow() .WithContent(content => { const Double TimeDelta = 0.25; var expectedByTime = LoadBoneData(modelBoneDataFile); var model = content.Load <SkinnedModel>(modelAssetFile); var modelInstance = new SkinnedModelInstance(model); var animationTrack = modelInstance.PlayAnimation(SkinnedAnimationMode.Manual, 0); modelInstance.UpdateAnimationState(); var animationDuration = (Int32)Math.Ceiling(model.Animations[0].Duration); for (var t = 0.0; t < animationDuration; t += TimeDelta) { var skin = animationTrack.Model.Skins[0]; var boneCount = skin.BoneCount; var boneTransforms = skin.GetBoneTransforms(); var boneTransformsExpected = expectedByTime[t]; TheResultingValue(boneTransformsExpected.Length) .ShouldBe(boneTransforms.Length); for (var i = 0; i < boneTransforms.Length; i++) { TheResultingValue(boneTransformsExpected[i]) .WithinDelta(0.0001f).ShouldBe(boneTransforms[i]); } modelInstance.AdvanceTime(TimeDelta); } }) .RunForOneFrame(); }
public override bool Init() { if (!base.Init()) { return(false); } Effects.InitAll(Device); InputLayouts.InitAll(Device); RenderStates.InitAll(Device); _texMgr = new TextureManager(); _texMgr.Init(Device); _drone = new SkinnedModel(Device, _texMgr, "Models/drone.x", "Textures", true); _droneInstance = new SkinnedModelInstance( "Attack", Matrix.RotationY(MathF.PI), _drone ); foreach (var clip in _droneInstance.Clips) { _droneInstance.AddClip(clip); } _droneInstance.LoopClips = true; _mage = new SkinnedModel(Device, _texMgr, "Models/magician.x", "textures", true); _mageInstance = new SkinnedModelInstance( "Attack", Matrix.RotationY(MathF.PI) * Matrix.Translation(4.0f, 0, 0), _mage ); foreach (var clip in _mageInstance.Clips) { _mageInstance.AddClip(clip); } _mageInstance.LoopClips = true; _soldier = new SkinnedModel(Device, _texMgr, "Models/soldier.x", "Textures", true); _soldierInstance = new SkinnedModelInstance( "Attack", Matrix.RotationY(MathF.PI) * Matrix.Translation(10, 0, 0), _soldier ); foreach (var clip in _soldierInstance.Clips) { _soldierInstance.AddClip(clip); } _soldierInstance.LoopClips = true; _grid = new BasicModel(); _grid.CreateGrid(Device, 30, 30, 60, 60); _grid.DiffuseMapSRV[0] = (_texMgr.CreateTexture("Textures/floor.dds")); _grid.NormalMapSRV[0] = (_texMgr.CreateTexture("Textures/floor_nmap.dds")); _gridInstance = new BasicModelInstance(_grid) { World = Matrix.Translation(0, -1.5f, 0) }; return(true); }