/// <summary> /// Reads an animation track section. /// </summary> /// <param name="track"></param> protected void ReadKeyFrame(BinaryMemoryReader reader, NodeAnimationTrack track) { float time = ReadFloat(reader); // create a new keyframe with the specified length TransformKeyFrame keyFrame = track.CreateNodeKeyFrame(time); // read orientation Quaternion rotate = ReadQuat(reader); keyFrame.Rotation = rotate; // read translation Vector3 translate = ReadVector3(reader); keyFrame.Translate = translate; // read scale if it is in there if (currentChunkLength >= 50) { Vector3 scale = ReadVector3(reader); keyFrame.Scale = scale; } else { keyFrame.Scale = Vector3.UnitScale; } }
protected void TransformTrack(Matrix4 exportTransform, NodeAnimationTrack newTrack, NodeAnimationTrack track, Bone bone) { Matrix4 invExportTransform = exportTransform.Inverse(); Bone oldNode = (Bone)track.TargetNode; Bone newNode = (Bone)newTrack.TargetNode; for (int i = 0; i < track.KeyFrames.Count; ++i) { TransformKeyFrame keyFrame = track.GetTransformKeyFrame(i); TransformKeyFrame newKeyFrame = newTrack.CreateNodeKeyFrame(keyFrame.Time); Quaternion oldOrientation = oldNode.Orientation * keyFrame.Rotation; Vector3 oldTranslation = oldNode.Position + keyFrame.Translate; Matrix4 oldTransform = Multiverse.MathLib.MathUtil.GetTransform(oldOrientation, oldTranslation); Matrix4 newTransform = exportTransform * oldTransform * invExportTransform; Quaternion newOrientation = GetRotation(newTransform); Vector3 newTranslation = newTransform.Translation; newKeyFrame.Rotation = newNode.Orientation.Inverse() * newOrientation; newKeyFrame.Translate = newTranslation - newNode.Position; //if (oldNode.Name == "Lower_Torso_BIND_jjj") { // log.DebugFormat("New translation: {0}; New Position: {1}", newTranslation, newNode.Position); //} } }
public static void DuplicateKeyFrame(NodeAnimationTrack track, TransformKeyFrame orig) { TransformKeyFrame newKeyFrame = (TransformKeyFrame)track.CreateKeyFrame(orig.Time); newKeyFrame.Scale = orig.Scale; newKeyFrame.Rotation = orig.Rotation; newKeyFrame.Translate = orig.Translate; }
/// <summary> /// /// </summary> protected override void SetupContent() { this.ptex = TextureManager.Instance.CreateManual("DynaTex", ResourceGroupManager.DefaultResourceGroupName, TextureType.ThreeD, 64, 64, 64, 0, Media.PixelFormat.A8R8G8B8, TextureUsage.Default, null); SceneManager.AmbientLight = new ColorEx(0.6f, 0.6f, 0.6f); SceneManager.SetSkyBox(true, "Examples/MorningSkyBox", 50); Light light = SceneManager.CreateLight("VolumeTextureSampleLight"); light.Diffuse = new ColorEx(0.75f, 0.75f, 0.80f); light.Specular = new ColorEx(0.9f, 0.9f, 1); light.Position = new Vector3(-100, 80, 50); SceneManager.RootSceneNode.AttachObject(light); // Create volume renderable this.snode = SceneManager.RootSceneNode.CreateChildSceneNode(Vector3.Zero); this.vrend = new VolumeRendable(32, 750, "DynaTex"); this.snode.AttachObject(this.vrend); this.trend = new ThingRendable(90, 32, 7.5f); this.trend.Material = (Material)MaterialManager.Instance.GetByName("Examples/VTDarkStuff"); this.trend.Material.Load(); this.snode.AttachObject(this.trend); this.fnode = SceneManager.RootSceneNode.CreateChildSceneNode(); Entity head = SceneManager.CreateEntity("head", "ogrehead.mesh"); this.fnode.AttachObject(head); Animation anim = SceneManager.CreateAnimation("OgreTrack", 10); anim.InterpolationMode = InterpolationMode.Spline; NodeAnimationTrack track = anim.CreateNodeTrack(0, this.fnode); TransformKeyFrame key = track.CreateNodeKeyFrame(0); key.Translate = new Vector3(0, -15, 0); key = track.CreateNodeKeyFrame(5); key.Translate = new Vector3(0, 15, 0); key = track.CreateNodeKeyFrame(10); key.Translate = new Vector3(0, -15, 0); this.animState = SceneManager.CreateAnimationState("OgreTrack"); this.animState.IsEnabled = true; this.globalReal = 0.4f; this.globalImag = 0.6f; this.globalTheta = 0.0f; CreateControls(); DragLook = true; Generate(); }
public override void CreateScene() { SceneNode node1 = base.sceneMgr.RootSceneNode.CreateChildSceneNode("Tutorial10Node"); // Create a point light Light l = base.sceneMgr.CreateLight("MainLight"); // Accept default settings: point light, white diffuse, just set position // Add light to the scene node SceneNode lightNode = base.sceneMgr.RootSceneNode.CreateChildSceneNode(); lightNode.CreateChildSceneNode(new Vector3(10, 10, 10)).AttachObject(l); MeshPtr pMesh = MeshManager.Singleton.Load("knot.mesh", ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME, HardwareBuffer.Usage.HBU_DYNAMIC_WRITE_ONLY, HardwareBuffer.Usage.HBU_STATIC_WRITE_ONLY, true, true);//can still read it //ushort src, dest; //if (!pMesh.SuggestTangentVectorBuildParams(VertexElementSemantic.VES_TANGENT, out src, out dest)) // pMesh.BuildTangentVectors(VertexElementSemantic.VES_TANGENT, src, dest); //create entity Entity entity = sceneMgr.CreateEntity("Tutorial10Entity", "knot.mesh"); entity.SetMaterialName("CgTutorials/C5E2_Material"); //attach to main node node1.AttachObject(entity); // set up spline animation of node Animation anim = sceneMgr.CreateAnimation("LightTrack", 10F); // Spline it for nice curves anim.SetInterpolationMode(Animation.InterpolationMode.IM_SPLINE); // Create a track to animate the camera's node NodeAnimationTrack track = anim.CreateNodeTrack(0, lightNode); // Setup keyframes TransformKeyFrame key = track.CreateNodeKeyFrame(0F); // startposition key = track.CreateNodeKeyFrame(2.5F); key.Translate = new Vector3(500F, 500F, -1000F); key = track.CreateNodeKeyFrame(5F); key.Translate = new Vector3(-1500F, 1000F, -600F); key = track.CreateNodeKeyFrame(7.5F); key.Translate = new Vector3(0F, 100F, 0F); key = track.CreateNodeKeyFrame(10F); key.Translate = new Vector3(0F, 0F, 0F); // Create a new animation state to track this animState = sceneMgr.CreateAnimationState("LightTrack"); animState.Enabled = true; }
public virtual TransformKeyFrame createNodeKeyFrame(float timePos) { global::System.IntPtr cPtr = OgrePINVOKE.NodeAnimationTrack_createNodeKeyFrame(swigCPtr, timePos); TransformKeyFrame ret = (cPtr == global::System.IntPtr.Zero) ? null : new TransformKeyFrame(cPtr, false); if (OgrePINVOKE.SWIGPendingException.Pending) { throw OgrePINVOKE.SWIGPendingException.Retrieve(); } return(ret); }
public virtual TransformKeyFrame getNodeKeyFrame(ushort index) { global::System.IntPtr cPtr = OgrePINVOKE.NodeAnimationTrack_getNodeKeyFrame(swigCPtr, index); TransformKeyFrame ret = (cPtr == global::System.IntPtr.Zero) ? null : new TransformKeyFrame(cPtr, false); if (OgrePINVOKE.SWIGPendingException.Pending) { throw OgrePINVOKE.SWIGPendingException.Retrieve(); } return(ret); }
protected override void AddKeyFrame() { UnSelectedAllKeyFrameList(); TransformKeyFrame keyFrame = new TransformKeyFrame(); keyFrame.position = gogoTransform.transform.localPosition; keyFrame.rotation = gogoTransform.transform.localEulerAngles; keyFrame.scale = gogoTransform.transform.localScale; keyFrame.time = GetCurrTime(); keyFrame.isSelected = true; gogoTransform.transformKeyFrameList.Add(keyFrame); base.AddKeyFrame(); }
protected XmlElement WriteKeyFrame(TransformKeyFrame keyFrame) { XmlElement node = document.CreateElement("keyframe"); XmlAttribute attr; attr = document.CreateAttribute("time"); attr.Value = keyFrame.Time.ToString(); node.Attributes.Append(attr); XmlElement translate = WriteTranslate(keyFrame.Translate); node.AppendChild(translate); XmlElement rotate = WriteRotate(keyFrame.Rotation); node.AppendChild(rotate); return(node); }
protected void WriteAnimationTrack(BinaryWriter writer, NodeAnimationTrack track) { long start_offset = writer.Seek(0, SeekOrigin.Current); WriteChunk(writer, SkeletonChunkID.AnimationTrack, 0); WriteUShort(writer, (ushort)track.Handle); for (ushort i = 0; i < track.KeyFrames.Count; i++) { TransformKeyFrame keyFrame = track.GetNodeKeyFrame(i); WriteKeyFrame(writer, keyFrame); } long end_offset = writer.Seek(0, SeekOrigin.Current); writer.Seek((int)start_offset, SeekOrigin.Begin); WriteChunk(writer, SkeletonChunkID.AnimationTrack, (int)(end_offset - start_offset)); writer.Seek((int)end_offset, SeekOrigin.Begin); }
protected void ReadRotate(XmlNode node, TransformKeyFrame keyFrame) { float angle = float.Parse(node.Attributes["angle"].Value); foreach (XmlNode childNode in node.ChildNodes) { switch (childNode.Name) { case "axis": Vector3 axis = ReadVector3(childNode); keyFrame.Rotation = Quaternion.FromAngleAxis(angle, axis); break; default: DebugMessage(childNode); break; } } }
public override void CreateScene() { SceneNode node1 = base.sceneMgr.RootSceneNode.CreateChildSceneNode("Tutorial08Node"); Entity entity = base.sceneMgr.CreateEntity("Tutorial08Entity", SceneManager.PrefabType.PT_SPHERE); entity.SetMaterialName("CgTutorials/C4E1_Material"); node1.AttachObject(entity); // Make sure the camera track this node camera.SetAutoTracking(true, node1); // Create the camera node & attach camera SceneNode camNode = sceneMgr.RootSceneNode.CreateChildSceneNode(); camNode.AttachObject(camera); // set up spline animation of node Animation anim = sceneMgr.CreateAnimation("CameraTrack", 10F); // Spline it for nice curves anim.SetInterpolationMode(Animation.InterpolationMode.IM_SPLINE); // Create a track to animate the camera's node NodeAnimationTrack track = anim.CreateNodeTrack(0, camNode); // Setup keyframes TransformKeyFrame key = track.CreateNodeKeyFrame(0F); // startposition key = track.CreateNodeKeyFrame(2.5F); key.Translate = new Vector3(500F, 500F, -1000F); key = track.CreateNodeKeyFrame(5F); key.Translate = new Vector3(-1500F, 1000F, -600F); key = track.CreateNodeKeyFrame(7.5F); key.Translate = new Vector3(0F, 100F, 0F); key = track.CreateNodeKeyFrame(10F); key.Translate = new Vector3(0F, 0F, 0F); // Create a new animation state to track this animState = sceneMgr.CreateAnimationState("CameraTrack"); animState.Enabled = true; camera.PolygonMode = PolygonMode.PM_WIREFRAME; }
protected void WriteKeyFrame(BinaryWriter writer, TransformKeyFrame keyFrame) { var start_offset = writer.Seek(0, SeekOrigin.Current); WriteChunk(writer, SkeletonChunkID.KeyFrame, 0); WriteFloat(writer, keyFrame.Time); WriteQuat(writer, keyFrame.Rotation); WriteVector3(writer, keyFrame.Translate); if (keyFrame.Scale != Vector3.UnitScale) { WriteVector3(writer, keyFrame.Scale); } var end_offset = writer.Seek(0, SeekOrigin.Current); writer.Seek((int)start_offset, SeekOrigin.Begin); WriteChunk(writer, SkeletonChunkID.KeyFrame, (int)(end_offset - start_offset)); writer.Seek((int)end_offset, SeekOrigin.Begin); }
protected XmlElement WriteTrack(NodeAnimationTrack track) { XmlElement node = document.CreateElement("track"); XmlAttribute attr; attr = document.CreateAttribute("bone"); attr.Value = track.TargetNode.Name; node.Attributes.Append(attr); XmlElement keyFramesNode = document.CreateElement("keyframes"); foreach (KeyFrame baseKeyFrame in track.KeyFrames) { TransformKeyFrame keyFrame = (TransformKeyFrame)baseKeyFrame; //if (track.TargetNode.Parent != null) // Debug.Assert(keyFrame.Translate.LengthSquared < .01); XmlElement keyFrameNode = WriteKeyFrame(keyFrame); keyFramesNode.AppendChild(keyFrameNode); } node.AppendChild(keyFramesNode); return(node); }
protected void ReadKeyFrame(XmlNode node, AnimationTrack track) { float time = float.Parse(node.Attributes["time"].Value); // create a new keyframe with the specified length TransformKeyFrame keyFrame = (TransformKeyFrame)track.CreateKeyFrame(time); foreach (XmlNode childNode in node.ChildNodes) { switch (childNode.Name) { case "translate": keyFrame.Translate = ReadVector3(childNode); break; case "rotate": ReadRotate(childNode, keyFrame); break; default: DebugMessage(childNode); break; } } }
public static bool CompareKeyFrames(TransformKeyFrame keyFrame1, TransformKeyFrame keyFrame2) { Vector3 delta = keyFrame1.Translate - keyFrame2.Translate; if (delta.LengthSquared > (TranslateEpsilon * TranslateEpsilon)) { return(false); } Quaternion rot = keyFrame1.Rotation * keyFrame2.Rotation.Inverse(); Vector3 axis = Vector3.Zero; float angle = 0; rot.ToAngleAxis(ref angle, ref axis); if (Math.Abs(angle) > RotateEpsilon) { return(false); } delta = keyFrame1.Scale - keyFrame2.Scale; if (delta.LengthSquared > (ScaleEpsilon * ScaleEpsilon)) { return(false); } return(true); }
// Scene creation public override void CreateScene() { // Set ambient light sceneMgr.AmbientLight = new ColourValue(0.2F, 0.2F, 0.2F); // Create a skydome sceneMgr.SetSkyDome(true, "Examples/CloudySky", 5, 8); // Create a light Light l = sceneMgr.CreateLight("MainLight"); // Accept default settings: point light, white diffuse, just set position // NB I could attach the light to a SceneNode if I wanted it to move automatically with // other objects, but I don't l.Position = new Vector3(20F, 80F, 50F); // Define a floor plane mesh Plane p; p.normal = Vector3.UNIT_Y; p.d = 200; MeshManager.Singleton.CreatePlane("FloorPlane", ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME, p, 200000F, 20000F, 20, 20, true, 1, 50F, 50F, Vector3.UNIT_Z); Entity ent; // Create an entity (the floor) ent = sceneMgr.CreateEntity("floor", "FloorPlane"); ent.SetMaterialName("Examples/RustySteel"); // Attach to child of root node, better for culling (otherwise bounds are the combination of the 2) sceneMgr.RootSceneNode.CreateChildSceneNode().AttachObject(ent); // Add a head, give it it's own node SceneNode headNode = sceneMgr.RootSceneNode.CreateChildSceneNode(); ent = sceneMgr.CreateEntity("head", "ogrehead.mesh"); headNode.AttachObject(ent); // Make sure the camera track this node camera.SetAutoTracking(true, headNode); // Create the camera node & attach camera SceneNode camNode = sceneMgr.RootSceneNode.CreateChildSceneNode(); camNode.AttachObject(camera); // set up spline animation of node Animation anim = sceneMgr.CreateAnimation("CameraTrack", 10F); // Spline it for nice curves anim.SetInterpolationMode(Animation.InterpolationMode.IM_SPLINE); // Create a track to animate the camera's node NodeAnimationTrack track = anim.CreateNodeTrack(0, camNode); // Setup keyframes TransformKeyFrame key = track.CreateNodeKeyFrame(0F); // startposition key = track.CreateNodeKeyFrame(2.5F); key.Translate = new Vector3(500F, 500F, -1000F); key = track.CreateNodeKeyFrame(5F); key.Translate = new Vector3(-1500F, 1000F, -600F); key = track.CreateNodeKeyFrame(7.5F); key.Translate = new Vector3(0F, 100F, 0F); key = track.CreateNodeKeyFrame(10F); key.Translate = new Vector3(0F, 0F, 0F); // Create a new animation state to track this animState = sceneMgr.CreateAnimationState("CameraTrack"); animState.Enabled = true; // Put in a bit of fog for the hell of it sceneMgr.SetFog(FogMode.FOG_EXP, ColourValue.White, 0.0002F); }
public static void CleanupAnimation(Skeleton skel, Animation anim) { Animation newAnim = skel.CreateAnimation("_replacement", anim.Length); Animation tmpAnim = skel.CreateAnimation("_temporary", anim.Length); foreach (NodeAnimationTrack track in anim.NodeTracks.Values) { Bone bone = skel.GetBone((ushort)track.Handle); NodeAnimationTrack newTrack = newAnim.CreateNodeTrack(track.Handle, bone); NodeAnimationTrack tmpTrack = tmpAnim.CreateNodeTrack(track.Handle, bone); int maxFrame = track.KeyFrames.Count; int lastKeyFrame = -1; for (int keyFrameIndex = 0; keyFrameIndex < track.KeyFrames.Count; ++keyFrameIndex) { if (anim.InterpolationMode == InterpolationMode.Linear) { // Linear is based on one point before and one after. TransformKeyFrame cur = track.GetTransformKeyFrame(keyFrameIndex); if (keyFrameIndex == 0 || keyFrameIndex == (track.KeyFrames.Count - 1)) { // Add the key frame if it is the first or last keyframe. lastKeyFrame = keyFrameIndex; DuplicateKeyFrame(newTrack, cur); } else { // Make sure tmpTrack is clean.. we just use it for interpolation tmpTrack.RemoveAllKeyFrames(); TransformKeyFrame prior = track.GetTransformKeyFrame(lastKeyFrame); TransformKeyFrame next = track.GetTransformKeyFrame(keyFrameIndex + 1); DuplicateKeyFrame(tmpTrack, prior); DuplicateKeyFrame(tmpTrack, next); // Check to see if removing this last keyframe will throw off // any of the other keyframes that were considered redundant. bool needKeyFrame = false; for (int i = lastKeyFrame + 1; i <= keyFrameIndex; ++i) { TransformKeyFrame orig = track.GetTransformKeyFrame(i); TransformKeyFrame interp = new TransformKeyFrame(tmpTrack, orig.Time); tmpTrack.GetInterpolatedKeyFrame(orig.Time, interp); // Is this interpolated frame useful or redundant? if (!CompareKeyFrames(interp, cur)) { needKeyFrame = true; break; } } if (needKeyFrame) { lastKeyFrame = keyFrameIndex; DuplicateKeyFrame(newTrack, cur); } } } else if (anim.InterpolationMode == InterpolationMode.Spline) { // Spline is based on two points before and two after. TransformKeyFrame cur = track.GetTransformKeyFrame(keyFrameIndex); #if DISABLED_CODE if (keyFrameIndex == 0 || keyFrameIndex == 1 || keyFrameIndex == (track.KeyFrames.Count - 1) || keyFrameIndex == (track.KeyFrames.Count - 2)) { // Add the key frame if it is the first, second, last or second to last keyframe. DuplicateKeyFrame(newTrack, cur); } else { // Make sure tmpTrack is clean.. we just use it for interpolation tmpTrack.RemoveAllKeyFrames(); TransformKeyFrame prior1 = track.GetTransformKeyFrame(keyFrameIndex - 2); TransformKeyFrame prior2 = track.GetTransformKeyFrame(keyFrameIndex - 1); TransformKeyFrame next1 = track.GetTransformKeyFrame(keyFrameIndex + 1); TransformKeyFrame next2 = track.GetTransformKeyFrame(keyFrameIndex + 2); DuplicateKeyFrame(tmpTrack, prior1); DuplicateKeyFrame(tmpTrack, prior2); DuplicateKeyFrame(tmpTrack, next1); DuplicateKeyFrame(tmpTrack, next2); TransformKeyFrame interp = new TransformKeyFrame(tmpTrack, cur.Time); tmpTrack.GetInterpolatedKeyFrame(cur.Time, interp); // Is this interpolated frame useful or redundant? if (!CompareKeyFrames(interp, cur)) { DuplicateKeyFrame(newTrack, cur); } } #else DuplicateKeyFrame(newTrack, cur); #endif } else { System.Diagnostics.Debug.Assert(false, "Invalid InterpolationMode: " + anim.InterpolationMode); } } } skel.RemoveAnimation(tmpAnim.Name); skel.RemoveAnimation(newAnim.Name); skel.RemoveAnimation(anim.Name); // Recreate the animation with the proper name (awkward) anim = skel.CreateAnimation(anim.Name, anim.Length); foreach (NodeAnimationTrack track in newAnim.NodeTracks.Values) { Bone bone = skel.GetBone((ushort)track.Handle); NodeAnimationTrack newTrack = anim.CreateNodeTrack(track.Handle, bone); foreach (KeyFrame keyFrame in track.KeyFrames) { DuplicateKeyFrame(newTrack, (TransformKeyFrame)keyFrame); } } }
protected void AddKey(AnimationTrack track, float time, Vector3 translate) { TransformKeyFrame key = (TransformKeyFrame)track.CreateKeyFrame(time); key.Translate = translate; }
void setupLighting() { /****/ // Set ambient light mSceneManager.SetAmbientLight(Converter.GetColor(0.2f, 0.2f, 0.2f)); // Point light, movable, reddish mLight = mSceneManager.CreateLight("Light2"); mLight.SetDiffuseColour(mMinLightColour); mLight.SetSpecularColour(1.0f, 1.0f, 1.0f); mLight.SetAttenuation(8000.0f, 1.0f, 0.0005f, 0.0f); // Create light node mLightNode = mSceneManager.GetRootSceneNode().CreateChildSceneNode("MovingLightNode"); mLightNode.AttachObject(mLight); // create billboard set BillboardSet bbs = mSceneManager.CreateBillboardSet("lightbbs", 1); bbs.SetMaterialName("Examples/Flare"); Billboard bb = bbs.CreateBillboard(0, 0, 0, mMinLightColour); // attach mLightNode.AttachObject(bbs); // create controller, after this is will get updated on its own mWFCF = new WaveformControllerFunction(WaveformType.Sine, 0.0f, 0.5f); mCFFPtr = new ControllerFunctionFloatPtr(mWFCF); mLightWibbler = new LightWibbler(mLight, bb, mMinLightColour, mMaxLightColour, mMinFlareSize, mMaxFlareSize); mCVFPtr = new ControllerValueFloatPtr(mLightWibbler.mCVFH); ControllerManager contMgr = ControllerManager.GetSingleton(); mLightCtlFlt = contMgr.CreateController(contMgr.GetFrameTimeSource(), mCVFPtr, mCFFPtr); mLightNode.SetPosition(new Vector3(300, 250, -300)); // Create a track for the light Animation anim = mSceneManager.CreateAnimation("LightTrack", 20.0f); // Spline it for nice curves anim.SetInterpolationMode(Animation.InterpolationMode.Spline); // Create a track to animate the camera's node NodeAnimationTrack track = anim.CreateNodeTrack(0, mLightNode); // Setup keyframes TransformKeyFrame key = new TransformKeyFrame(KeyFrame.getCPtr(track.CreateKeyFrame(0.0f)).Handle, false); // A startposition key.SetTranslate(new Vector3(300.0f, 550.0f, -300.0f)); key = new TransformKeyFrame(KeyFrame.getCPtr(track.CreateKeyFrame(2.0f)).Handle, false); //B key.SetTranslate(new Vector3(150.0f, 600.0f, -250.0f)); key = new TransformKeyFrame(KeyFrame.getCPtr(track.CreateKeyFrame(4.0f)).Handle, false); //C key.SetTranslate(new Vector3(-150.0f, 650.0f, -100.0f)); key = new TransformKeyFrame(KeyFrame.getCPtr(track.CreateKeyFrame(6.0f)).Handle, false); //D key.SetTranslate(new Vector3(-400.0f, 500.0f, -200.0f)); key = new TransformKeyFrame(KeyFrame.getCPtr(track.CreateKeyFrame(8.0f)).Handle, false); //E key.SetTranslate(new Vector3(-200.0f, 500.0f, -400.0f)); key = new TransformKeyFrame(KeyFrame.getCPtr(track.CreateKeyFrame(10.0f)).Handle, false); //F key.SetTranslate(new Vector3(-100.0f, 450.0f, -200.0f)); key = new TransformKeyFrame(KeyFrame.getCPtr(track.CreateKeyFrame(12.0f)).Handle, false); //G key.SetTranslate(new Vector3(-100.0f, 400.0f, 180.0f)); key = new TransformKeyFrame(KeyFrame.getCPtr(track.CreateKeyFrame(14.0f)).Handle, false); //H key.SetTranslate(new Vector3(0.0f, 250.0f, 600.0f)); key = new TransformKeyFrame(KeyFrame.getCPtr(track.CreateKeyFrame(16.0f)).Handle, false); //I key.SetTranslate(new Vector3(100.0f, 650.0f, 100.0f)); key = new TransformKeyFrame(KeyFrame.getCPtr(track.CreateKeyFrame(18.0f)).Handle, false); //J key.SetTranslate(new Vector3(250.0f, 600.0f, 0.0f)); key = new TransformKeyFrame(KeyFrame.getCPtr(track.CreateKeyFrame(20.0f)).Handle, false); //K == A key.SetTranslate(new Vector3(300.0f, 550.0f, -300.0f)); // Create a new animation state to track this mAnimState = mSceneManager.CreateAnimationState("LightTrack"); mAnimState.SetEnabled(true); /****/ }
private void SetupLighting() { scene.AmbientLight = new ColorEx(0.2f, 0.2f, 0.2f); Light = scene.CreateLight("Light2"); Light.DiffuseColour = MinLightColour; Light.SetAttenuation(8000, 1, 0.0005f, 0); Light.SpecularColour = new ColorEx(1, 1, 1); LightNode = scene.RootSceneNode.CreateChildSceneNode("MovingLightNode"); LightNode.AttachObject(Light); //create billboard set BillboardSet bbs = scene.CreateBillboardSet("lightbbs", 1); bbs.SetMaterialName("Examples/Flare"); Billboard bb = bbs.CreateBillboard(new Vector3(0, 0, 0), MinLightColour); LightNode.AttachObject(bbs); mLightController = new LightGrassWibbler(Light, bb, MinLightColour, this.MaxLightColour, MinFlareSize, MaxFlareSize); // create controller, after this is will get updated on its own //WaveformControllerFunction func = new WaveformControllerFunction(WaveformType.Sine, 0.0f, 0.5f); //ControllerManager.Instance.CreateController(val, func); LightNode.Position = new Vector3(300, 250, -300); Animation anim = scene.CreateAnimation("LightTrack", 20); //Spline it for nce curves anim.SetInterpolationMode(Animation.InterpolationMode.IM_SPLINE);// = Mogre.Animation.InterpolationMode.IM_SPLINE; //create a srtack to animte the camera's node NodeAnimationTrack track = anim.CreateNodeTrack(0, LightNode); //setup keyframes TransformKeyFrame key = track.CreateNodeKeyFrame(0); key.Translate = new Vector3(300, 550, -300); key = track.CreateNodeKeyFrame(2); //B key.Translate = new Vector3(150, 600, -250); key = track.CreateNodeKeyFrame(4); //C key.Translate = new Vector3(-150, 650, -100); key = track.CreateNodeKeyFrame(6); //D key.Translate = new Vector3(-400, 500, -200); key = track.CreateNodeKeyFrame(8); //E key.Translate = new Vector3(-200, 500, -400); key = track.CreateNodeKeyFrame(10); //F key.Translate = new Vector3(-100, 450, -200); key = track.CreateNodeKeyFrame(12); //G key.Translate = new Vector3(-100, 400, 180); key = track.CreateNodeKeyFrame(14); //H key.Translate = new Vector3(0, 250, 600); key = track.CreateNodeKeyFrame(16); //I key.Translate = new Vector3(100, 650, 100); key = track.CreateNodeKeyFrame(18); //J key.Translate = new Vector3(250, 600, 0); key = track.CreateNodeKeyFrame(20); //K == A key.Translate = new Vector3(300, 550, -300); // Create a new animation state to track this AnimState = scene.CreateAnimationState("LightTrack"); AnimState.Enabled = true; }
void SetupTrailLights() { sceneMgr.AmbientLight = new ColourValue(0.5f, 0.5f, 0.5f); Vector3 dir = new Vector3(-1, -1, 0.5f); dir.Normalise(); Light l = sceneMgr.CreateLight("light1"); l.Type = Light.LightTypes.LT_DIRECTIONAL; l.Direction = dir; NameValuePairList pairList = new NameValuePairList(); pairList["numberOfChains"] = "2"; pairList["maxElements"] = "80"; RibbonTrail trail = (RibbonTrail)( sceneMgr.CreateMovableObject("1", "RibbonTrail", pairList)); trail.MaterialName = "Examples/LightRibbonTrail"; trail.TrailLength = 400; sceneMgr.RootSceneNode.CreateChildSceneNode().AttachObject(trail); // Create 3 nodes for trail to follow SceneNode animNode = sceneMgr.RootSceneNode.CreateChildSceneNode(); animNode.Position = new Vector3(50, 30, 0); Animation anim = sceneMgr.CreateAnimation("an1", 14); anim.SetInterpolationMode(Animation.InterpolationMode.IM_SPLINE); NodeAnimationTrack track = anim.CreateNodeTrack(1, animNode); TransformKeyFrame kf = track.CreateNodeKeyFrame(0); kf.Translate = new Vector3(50, 30, 0); kf = track.CreateNodeKeyFrame(2); kf.Translate = new Vector3(100, -30, 0); kf = track.CreateNodeKeyFrame(4); kf.Translate = new Vector3(120, -100, 150); kf = track.CreateNodeKeyFrame(6); kf.Translate = new Vector3(30, -100, 50); kf = track.CreateNodeKeyFrame(8); kf.Translate = new Vector3(-50, 30, -50); kf = track.CreateNodeKeyFrame(10); kf.Translate = new Vector3(-150, -20, -100); kf = track.CreateNodeKeyFrame(12); kf.Translate = new Vector3(-50, -30, 0); kf = track.CreateNodeKeyFrame(14); kf.Translate = new Vector3(50, 30, 0); AnimationState animState = sceneMgr.CreateAnimationState("an1"); animState.Enabled = true; mAnimStateList.Add(animState); trail.SetInitialColour(0, 1.0f, 0.8f, 0); trail.SetColourChange(0, 0.5f, 0.5f, 0.5f, 0.5f); trail.SetInitialWidth(0, 5); trail.AddNode(animNode); // Add light Light l2 = sceneMgr.CreateLight("l2"); l2.DiffuseColour = (trail.GetInitialColour(0)); animNode.AttachObject(l2); // Add billboard BillboardSet bbs = sceneMgr.CreateBillboardSet("bb", 1); bbs.CreateBillboard(Vector3.ZERO, trail.GetInitialColour(0)); bbs.MaterialName = "Examples/Flare"; animNode.AttachObject(bbs); animNode = sceneMgr.RootSceneNode.CreateChildSceneNode(); animNode.Position = new Vector3(-50, 100, 0); anim = sceneMgr.CreateAnimation("an2", 10); anim.SetInterpolationMode(Animation.InterpolationMode.IM_SPLINE); track = anim.CreateNodeTrack(1, animNode); kf = track.CreateNodeKeyFrame(0); kf.Translate = new Vector3(-50, 100, 0); kf = track.CreateNodeKeyFrame(2); kf.Translate = new Vector3(-100, 150, -30); kf = track.CreateNodeKeyFrame(4); kf.Translate = new Vector3(-200, 0, 40); kf = track.CreateNodeKeyFrame(6); kf.Translate = new Vector3(0, -150, 70); kf = track.CreateNodeKeyFrame(8); kf.Translate = new Vector3(50, 0, 30); kf = track.CreateNodeKeyFrame(10); kf.Translate = new Vector3(-50, 100, 0); animState = sceneMgr.CreateAnimationState("an2"); animState.Enabled = true; mAnimStateList.Add(animState); trail.SetInitialColour(1, 0.0f, 1.0f, 0.4f); trail.SetColourChange(1, 0.5f, 0.5f, 0.5f, 0.5f); trail.SetInitialWidth(1, 5); trail.AddNode(animNode); // Add light l2 = sceneMgr.CreateLight("l3"); l2.DiffuseColour = trail.GetInitialColour(1); animNode.AttachObject(l2); // Add billboard bbs = sceneMgr.CreateBillboardSet("bb2", 1); bbs.CreateBillboard(Vector3.ZERO, trail.GetInitialColour(1)); bbs.MaterialName = "Examples/Flare"; animNode.AttachObject(bbs); }
protected void CreateRibbons() { viewport.BackgroundColor = ColorEx.Black; float scale = 100f; scene.AmbientLight = new ColorEx(0.5f, 0.5f, 0.5f); //scene.SetSkyBox(true, "Examples/SpaceSkyBox", 20f * oneMeter); Vector3 dir = new Vector3(-1f, -1f, 0.5f); dir.Normalize(); Light light1 = scene.CreateLight("light1"); light1.Type = LightType.Directional; light1.Direction = dir; // Create a barrel for the ribbons to fly through Entity barrel = scene.CreateEntity("barrel", "barrel.mesh"); SceneNode barrelNode = scene.RootSceneNode.CreateChildSceneNode(); barrelNode.ScaleFactor = 5f * Vector3.UnitScale; barrelNode.AttachObject(barrel); RibbonTrail trail = new RibbonTrail("DemoTrail", "numberOfChains", 2, "maxElementsPerChain", 80); trail.MaterialName = "Examples/LightRibbonTrail"; trail.TrailLength = scale * 400f; scene.RootSceneNode.CreateChildSceneNode().AttachObject(trail); // Create 3 nodes for trail to follow SceneNode animNode = scene.RootSceneNode.CreateChildSceneNode(); animNode.Position = scale * new Vector3(50f, 30f, 0); Animation anim = scene.CreateAnimation("an1", 14); anim.InterpolationMode = InterpolationMode.Spline; NodeAnimationTrack track = anim.CreateNodeTrack(1, animNode); TransformKeyFrame kf = track.CreateNodeKeyFrame(0); kf.Translate = scale * new Vector3(50f, 30f, 0f); kf = track.CreateNodeKeyFrame(2); kf.Translate = scale * new Vector3(100f, -30f, 0f); kf = track.CreateNodeKeyFrame(4); kf.Translate = scale * new Vector3(120f, -100f, 150f); kf = track.CreateNodeKeyFrame(6); kf.Translate = scale * new Vector3(30f, -100f, 50f); kf = track.CreateNodeKeyFrame(8); kf.Translate = scale * new Vector3(-50f, 30f, -50f); kf = track.CreateNodeKeyFrame(10); kf.Translate = scale * new Vector3(-150f, -20f, -100f); kf = track.CreateNodeKeyFrame(12); kf.Translate = scale * new Vector3(-50f, -30f, 0f); kf = track.CreateNodeKeyFrame(14); kf.Translate = scale * new Vector3(50f, 30f, 0f); AnimationState animState = scene.CreateAnimationState("an1"); //animState.Enabled = true; animStateList = new List <AnimationState>(); animStateList.Add(animState); trail.SetInitialColor(0, 1.0f, 0.8f, 0f, 1.0f); trail.SetColorChange(0, 0.5f, 0.5f, 0.5f, 0.5f); trail.SetInitialWidth(0, scale * 5f); trail.AddNode(animNode); // Add light Light light2 = scene.CreateLight("light2"); light2.Diffuse = trail.GetInitialColor(0); animNode.AttachObject(light2); // Add billboard BillboardSet bbs = scene.CreateBillboardSet("bb", 1); bbs.CreateBillboard(Vector3.Zero, trail.GetInitialColor(0)); bbs.MaterialName = "flare"; animNode.AttachObject(bbs); animNode = scene.RootSceneNode.CreateChildSceneNode(); animNode.Position = scale * new Vector3(-50f, 100f, 0f); anim = scene.CreateAnimation("an2", 10); anim.InterpolationMode = InterpolationMode.Spline; track = anim.CreateNodeTrack(1, animNode); kf = track.CreateNodeKeyFrame(0); kf.Translate = scale * new Vector3(-50f, 100f, 0f); kf = track.CreateNodeKeyFrame(2); kf.Translate = scale * new Vector3(-100f, 150f, -30f); kf = track.CreateNodeKeyFrame(4); kf.Translate = scale * new Vector3(-200f, 0f, 40f); kf = track.CreateNodeKeyFrame(6); kf.Translate = scale * new Vector3(0f, -150f, 70f); kf = track.CreateNodeKeyFrame(8); kf.Translate = scale * new Vector3(50f, 0f, 30f); kf = track.CreateNodeKeyFrame(10); kf.Translate = scale * new Vector3(-50f, 100f, 0f); animState = scene.CreateAnimationState("an2"); //animState.setEnabled(true); animStateList.Add(animState); trail.SetInitialColor(1, 0.0f, 1.0f, 0.4f, 1.0f); trail.SetColorChange(1, 0.5f, 0.5f, 0.5f, 0.5f); trail.SetInitialWidth(1, scale * 5f); trail.AddNode(animNode); // Add light Light light3 = scene.CreateLight("l3"); light3.Diffuse = trail.GetInitialColor(1); animNode.AttachObject(light3); // Add billboard bbs = scene.CreateBillboardSet("bb2", 1); bbs.CreateBillboard(Vector3.Zero, trail.GetInitialColor(1)); bbs.MaterialName = "flare"; animNode.AttachObject(bbs); }
internal static global::System.Runtime.InteropServices.HandleRef getCPtr(TransformKeyFrame obj) { return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr); }
public void AddAnimation(MogreAnimation animation, AnimationState animationState) { Children.ForEach(x => x.AddAnimation(animation, animationState)); if (!animation.HasNodeTrack(ReferenceBone.Handle)) return; TimeIndex index = new TimeIndex(animationState.TimePosition); TransformKeyFrame keyFrame = new TransformKeyFrame(null, 0); animation.GetNodeTrack(ReferenceBone.Handle).GetInterpolatedKeyFrame(index, keyFrame); Node.Position += keyFrame.Translate * animationState.Weight; Node.Orientation *= Quaternion.Slerp(animationState.Weight, Quaternion.IDENTITY, keyFrame.Rotation); }
protected override void CreateScene() { // Set ambient light sceneMgr.AmbientLight = new ColourValue(0.75f, 0.75f, 0.75f); // Create a light Light l = sceneMgr.CreateLight("MainLight"); // Accept default settings: point light, white diffuse, just set position // NB I could attach the light to a SceneNode if I wanted it to move automatically with // other objects, but I don't l.Position = new Vector3(200, 700, 100); sceneMgr.ShadowTechnique = ShadowTechnique.SHADOWTYPE_TEXTURE_MODULATIVE; // Create a skydome sceneMgr.SetSkyDome(true, "Examples/CloudySky", 30, 5); // Put in a bit of fog for the hell of it sceneMgr.SetFog(FogMode.FOG_EXP, ColourValue.White, 0.0001f, 0.5f); // Define a floor plane mesh Plane p = new Plane(); p.normal = Vector3.UNIT_Y; p.d = 180; MeshManager.Singleton.CreatePlane("FloorPlane", ResourceGroupManager.DEFAULT_RESOURCE_GROUP_NAME, p, PLANE_SIZE * 1000, PLANE_SIZE * 1000, 20, 20, true, 1, 50, 50, Vector3.UNIT_Z); Entity ent = sceneMgr.CreateEntity("floorEntity", "FloorPlane"); ent.SetMaterialName("Examples/RustySteel"); ent.CastShadows = false; SceneNode floorNode = sceneMgr.RootSceneNode.CreateChildSceneNode("floorSceneNode"); floorNode.AttachObject(ent); // Add a head, give it it's own node // The Ogre head faces to Z headNode = sceneMgr.RootSceneNode.CreateChildSceneNode("headSceneNode"); ent = sceneMgr.CreateEntity("head", "ogrehead.mesh"); ent.CastShadows = true; headNode.AttachObject(ent); atheneNode = sceneMgr.RootSceneNode.CreateChildSceneNode("atheneSceneNode"); //Entity *Athene = mSceneMgr->createEntity( "Razor", "razor.mesh" ); Entity Athene = sceneMgr.CreateEntity("Athene", "athene.mesh"); Athene.SetMaterialName("Examples/Athene/NormalMapped"); Athene.CastShadows = true; atheneNode.AttachObject(Athene); atheneNode.SetPosition(500, -100, 500); // Obstacle for collisions detection SceneNode barrelNode = sceneMgr.RootSceneNode.CreateChildSceneNode("barrelSceneNode"); Entity barrel = sceneMgr.CreateEntity("barrel", "barrel.mesh"); barrel.CastShadows = true; barrelNode.AttachObject(barrel); barrelNode.SetPosition(1300, -100, 500); barrelNode.SetScale(40, 40, 40); // Create light node SceneNode lightNode = sceneMgr.RootSceneNode.CreateChildSceneNode("lightSceneNode"); lightNode.AttachObject(l); goto cameraControl; // set up spline animation of node Animation anim = sceneMgr.CreateAnimation("HeadTrack", 20); // Spline it for nice curves anim.SetInterpolationMode(Mogre.Animation.InterpolationMode.IM_SPLINE); // Create a track to animate the camera's node NodeAnimationTrack track = anim.CreateNodeTrack(0, headNode); // Setup keyframes TransformKeyFrame key = track.CreateNodeKeyFrame(0); // startposition key.Translate = new Vector3(0, 0, 0); key.Rotation = Quaternion.IDENTITY; key = track.CreateNodeKeyFrame(2.5f); key.Translate = new Vector3(0, 0, 1000); key.Rotation = Vector3.UNIT_Z.GetRotationTo(new Vector3(1000, 0, 1000)); key = track.CreateNodeKeyFrame(5); key.Translate = new Vector3(1000, 0, 1000); key.Rotation = Vector3.UNIT_Z.GetRotationTo(new Vector3(1000, 0, 0)); key = track.CreateNodeKeyFrame(7.5f); key.Translate = new Vector3(1000, 0, 0); key.Rotation = Vector3.UNIT_Z.GetRotationTo(Vector3.NEGATIVE_UNIT_X); key = track.CreateNodeKeyFrame(10); key.Translate = new Vector3(0, 0, 0); // Second round key = track.CreateNodeKeyFrame(11); key.Translate = new Vector3(0, 0, 400); key.Rotation = new Quaternion(new Radian(3.14f / 4.0f), Vector3.UNIT_Z); key = track.CreateNodeKeyFrame(11.5f); key.Translate = new Vector3(0, 0, 600); key.Rotation = new Quaternion(new Radian(-3.14f / 4.0f), Vector3.UNIT_Z); key = track.CreateNodeKeyFrame(12.5f); key.Translate = new Vector3(0, 0, 1000); key.Rotation = Vector3.UNIT_Z.GetRotationTo(new Vector3(500, 500, 1000)); key = track.CreateNodeKeyFrame(13.25f); key.Translate = new Vector3(500, 500, 1000); key.Rotation = Vector3.UNIT_Z.GetRotationTo(new Vector3(1000, -500, 1000)); key = track.CreateNodeKeyFrame(15); key.Translate = new Vector3(1000, 0, 1000); key.Rotation = Vector3.UNIT_Z.GetRotationTo(new Vector3(1000, 0, -500)); key = track.CreateNodeKeyFrame(16); key.Translate = new Vector3(1000, 0, 500); key = track.CreateNodeKeyFrame(16.5f); key.Translate = new Vector3(1000, 0, 600); key = track.CreateNodeKeyFrame(17.5f); key.Translate = new Vector3(1000, 0, 0); key.Rotation = Vector3.UNIT_Z.GetRotationTo(new Vector3(-500, 500, 0)); key = track.CreateNodeKeyFrame(118.25f); key.Translate = new Vector3(500, 500, 0); key.Rotation = new Quaternion(new Radian(3.14f), Vector3.UNIT_X) * Vector3.UNIT_Z.GetRotationTo(new Vector3(-500, -500, 0)); key = track.CreateNodeKeyFrame(20); key.Translate = new Vector3(0, 0, 0); key = track.CreateNodeKeyFrame(2000); key.Translate = new Vector3(-20000000, 0, 0); // Create a new animation state to track this mAnimState = sceneMgr.CreateAnimationState("HeadTrack"); mAnimState.Enabled = true; cameraControl :; setupCameraControlSystem(); }
// Just override the mandatory create scene method protected override void CreateScene() { RAND = new Random(0); // najak: use a time-based seed GuiMgr = OverlayElementManager.Instance; scene.AmbientLight = new ColorEx(0.75f, 0.75f, 0.75f); // default Ambient Light // Customize Controls - speed up camera and slow down the input update rate this.camSpeed = 5.0f; inputInterval = inputTimer = 0.02f; // Create water mesh and entity, and attach to sceneNode waterMesh = new WaterMesh("WaterMesh", PLANE_SIZE, CMPLX); waterEntity = scene.CreateEntity("WaterEntity", "WaterMesh"); SceneNode waterNode = scene.RootSceneNode.CreateChildSceneNode(); waterNode.AttachObject(waterEntity); // Add Ogre head, give it it's own node headNode = waterNode.CreateChildSceneNode(); Entity ent = scene.CreateEntity("head", "ogrehead.mesh"); headNode.AttachObject(ent); // Create the camera node, set its position & attach camera camera.Yaw(-45f); camera.Move(new Vector3(1500f, 700f, PLANE_SIZE + 700f)); camera.LookAt(new Vector3(PLANE_SIZE / 2f, 300f, PLANE_SIZE / 2f)); camera.SetAutoTracking(false, headNode); // Autotrack the head, but it isn't working right //scene.SetFog(FogMode.Exp, ColorEx.White, 0.000020f); // add Fog for fun, cuz we can // show overlay waterOverlay = (Overlay)OverlayManager.Instance.GetByName("Example/WaterOverlay"); waterOverlay.Show(); // Create Rain Emitter, but default Rain to OFF particleSystem = ParticleSystemManager.Instance.CreateSystem("rain", "Examples/Water/Rain"); particleEmitter = particleSystem.GetEmitter(0); particleEmitter.EmissionRate = 0f; // Attach Rain Emitter to SceneNode, and place it 3000f above the water surface SceneNode rNode = scene.RootSceneNode.CreateChildSceneNode(); rNode.Translate(new Vector3(PLANE_SIZE / 2.0f, 3000, PLANE_SIZE / 2.0f)); rNode.AttachObject(particleSystem); particleSystem.FastForward(20); // Fastforward rain to make it look natural // It can't be set in .particle file, and we need it ;) particleSystem.BillboardOrigin = BillboardOrigin.BottomCenter; // Set Lighting lightNode = scene.RootSceneNode.CreateChildSceneNode(); lightSet = scene.CreateBillboardSet("Lights", 20); lightSet.MaterialName = "Particles/Flare"; lightNode.AttachObject(lightSet); SetLighting("Ambient"); // Add Lights - added by Najak to show lighted Water conditions - cool! #region STUBBED LIGHT ANIMATION // Create a new animation state to track this // TODO: Light Animation not working. //this.animState = scene.CreateAnimationState("WaterLight"); //this.animState.Time = 0f; //this.animState.IsEnabled = false; // set up spline animation of light node. Create random Spline Animation anim = scene.CreateAnimation("WaterLight", 20); NodeAnimationTrack track = anim.CreateNodeTrack(0, this.lightNode); TransformKeyFrame key = (TransformKeyFrame)track.CreateKeyFrame(0); for (int ff = 1; ff <= 19; ff++) { key = (TransformKeyFrame)track.CreateKeyFrame(ff); Random rand = new Random(0); Vector3 lpos = new Vector3( (float)rand.NextDouble() % (int)PLANE_SIZE, //- PLANE_SIZE/2, (float)rand.NextDouble() % 300 + 100, (float)rand.NextDouble() % (int)PLANE_SIZE); //- PLANE_SIZE/2 key.Translate = lpos; } key = (TransformKeyFrame)track.CreateKeyFrame(20); #endregion STUBBED LIGHT ANIMATION // Initialize the Materials/Demo UpdateMaterial(); UpdateInfoParamC(); UpdateInfoParamD(); UpdateInfoParamU(); UpdateInfoParamT(); UpdateInfoNormals(); UpdateInfoHeadDepth(); UpdateInfoSkyBox(); UpdateInfoHeadSpeed(); UpdateInfoLights(); UpdateInfoTracking(); // Init Head Animation: Load adds[] elements - Ogre head animation adds[0] = 0.3f; adds[1] = -1.6f; adds[2] = 1.1f; adds[3] = 0.5f; sines[0] = 0; sines[1] = 100; sines[2] = 200; sines[3] = 300; } // end CreateScene()