ownsun

Members
  • Content count

    8
  • Joined

  • Last visited

Community Reputation

108 Neutral

About ownsun

  • Rank
    Newbie
  1.      I am currently doing sth to warp the VB and IB so that I could load some other model formats such as .mesh in Ogre.     Some of formats may use different VT_Sementics such as Normal \ Tangent and sth else, so I am trying to determin my vertex declartion type dynamicly when read the formats, so I just add a basic interface : IVertexType(I am using XNA 3.1 and this interface is just does the same thing with XNA 4.1 does), and I would dynamicly choose the typical vertex type on the way.       But what really matters is , I need to update and set the VB and IB  to the device, I had to iterate all the vertex data maybe VertexPositionNormalColor[] array, and need to check if a specific element exists.    Just like what I am current doing:       Vector3 position = (Vector3)originVertexData.GetValueByElementName("position");      public object GetValueByElementName(String name)         {             switch (name)             {                 case "position":                     return mPosition;                 case "normal":                     return mNormal;                 case "texcoord":                     return mTexcoord;                 case "tangent":                     return mTagent;                 case "color":                     return mColor;             }             return null;         }             public void SetValueByElementName(String name, object value)         {             switch (name)             {                 case "position":                     Vector3 position = (Vector3)value;                     mPosition = position;                     break;                 case "color":                     Color color = (Color)value;                     mColor = color;                     break;                 case "normal":                     Vector3 normal = (Vector3)value;                     mNormal = normal;                     break;                 case "texcoord":                     Vector2 texcoord = (Vector2)value;                     mTexcoord = texcoord;                     break;                 case "tangent":                     Vector3 tangent = (Vector3)value;                     mTagent = tangent;                     break;             }         }       Vector3 transformedPos = new Vector3(x, y, z);     targetVertexData.SetValueByElementName("position", transformedPos);  // then apply the bone transform.     ////////////////    As you can see up there, there are lot of boxing and unboxing operation, and it's ok when the buffer require lessupdate, but it's a disaster when an animation are applied to the vertex buffer(software animation). So I am wondering if anyone could tell me a better way to do this?  
  2. Bones Counts Incread Problem!

    Hey,buddy ,thanks for your concern. The bones it'self is the famous bones called CS with almost 47 bones count on it and it's good for the motion of human(two-legged subjects).So it's really weird and I don't how other guys works nicely with the Skinned Model Pipeline. BTW,people says that it may due to the exporter's problem And I don't know if you are interested in this .Maybe I can mail you my project and the FBX model.
  3. Hey Guys I am trying using SkinnedModel in XNA in an order to demonstrate a human's motion ,and I export a model form 3D max with the 47 bones showed in MAX .Then I tried to export it into XNA with the FBX exporter , setting the Content Processor to be Skinned Model Processor.And when I tried to render it ,the debugged said like this: Skeleton has 112 bones, but the maximum supported is 59. I am really weird about this?Anyone can tell me why the number of bones increased? BTW,I tried to export with .X and it got the same problem and the model just contains only one mesh.
  4. Hey guys,I am using XNA and recently I met a problem when I was learning shaders ... Every time I calculate world matrix ,I get the mesh's parent bone's transform which contains and then multiply with the world matrix: Matrix bones = new Matrix[girlModel.Bones.Count]; this.girlModel.CopyAbsoluteBoneTransformsTo(bones); and then effect.Begin(); foreach (EffectPass pass in effect.CurrentTechnique.Passes) { pass.Begin(); int i = 0; foreach(ModelMesh mm in girlModel.Meshes) { //A*Inverse(B) // matRelativeTM = matNodeTM * Inverse(matParentTM); Matrix worldAbsolute = bones[mm.ParentBone.Index]*World; foreach (ModelMeshPart part in mm.MeshParts) { effect.Parameters["matWorldViewProj"].SetValue(worldAbsolute * View * Projection); effect.Parameters["matWorld"].SetValue(worldAbsolute); effect.Parameters["Ac"].SetValue(Color.OldLace.ToVector4()); effect.Parameters["L"].SetValue(Vector4.Normalize(lightDirection)); graphics.GraphicsDevice.Vertices[0].SetSource(mm.VertexBuffer, part.StreamOffset, part.VertexStride); graphics.GraphicsDevice.Indices = mm.IndexBuffer; graphics.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, part.BaseVertex, 1, part.NumVertices, part.StartIndex, part.PrimitiveCount); } } pass.End(); } effect.End(); For these model which just contains only one mesh ,it goes well,and when I use BasicEffect the position of every mesh is also calculated well .But when the model conain several meshes ,all the position of every meshes in the model seems in the position of the root node. So I don't know if you guys had met this problem and if you could give a guide,thanks!\\ And wass more ,I have no idea of the relationship between the concept of bones in XNA and these in the 3D MAX
  5. Oh yes!It's OK now, unbird ,you really help me!
  6. No ,unbird I think it's not the solution , obviously I think the main thing is that maybe I didn't calculate the bone transform of the model so that all the meshes' location are in the root direction!
  7. ey guys Recently I met a problem when I was learning shaders ... Every time I calculate world matrix ,I get the mesh's parent bone's transform which contains and then multiply with the world matrix: Matrix bones = new Matrix[girlModel.Bones.Count]; this.girlModel.CopyAbsoluteBoneTransformsTo(bones); and then effect.Begin(); foreach (EffectPass pass in effect.CurrentTechnique.Passes) { pass.Begin(); int i = 0; foreach(ModelMesh mm in girlModel.Meshes) { //A*Inverse(B) // matRelativeTM = matNodeTM * Inverse(matParentTM); Matrix worldAbsolute = bones[mm.ParentBone.Index]*World; foreach (ModelMeshPart part in mm.MeshParts) { effect.Parameters["matWorldViewProj"].SetValue(worldAbsolute * View * Projection); effect.Parameters["matWorld"].SetValue(worldAbsolute); effect.Parameters["Ac"].SetValue(Color.OldLace.ToVector4()); effect.Parameters["L"].SetValue(Vector4.Normalize(lightDirection)); graphics.GraphicsDevice.Vertices[0].SetSource(mm.VertexBuffer, part.StreamOffset, part.VertexStride); graphics.GraphicsDevice.Indices = mm.IndexBuffer; graphics.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, part.BaseVertex, 1, part.NumVertices, part.StartIndex, part.PrimitiveCount); } } pass.End(); } effect.End(); For these model which just contains only one mesh ,it goes well,and when I use BasicEffect the position of every mesh is also calculated well .But when the model conain several meshes ,all the position of every meshes in the model seems in the position of the root node. So I don't know if you guys had met this problem and if you could give a guide,thanks!
  8. Hey Guys I've written a simple algorithm of missile chasing in 3D space in XNA: public void Update(GameTime gameTime, Vector3 target) { if (Vector3.Distance(Target, Position) != 0.0f) { float time = (float)gameTime.ElapsedGameTime.TotalSeconds; Target = target; //target position Vector3 Distance = Target - Position;//vector between missile and target OffsetDirection = Vector3.Normalize(Distance);//direction vector Vector3 acceleration = OffsetDirection * Force / Mass; //force=400.0f Mass=3.0f Velocity = acceleration * time + Velocity; //Velocity += accerlation * time Position += Velocity * time; Direction = Vector3.Normalize(Velocity); Direction.Normalize(); Right = Vector3.Cross(Direction, Vector3.Forward); Right.Normalize(); Up = Vector3.Cross(Direction, Right); Up.Normalize(); timeCount -= time; Position += Velocity * time; particle.ParticlePositon = Position; particle.Update(gameTime); } else { particle.ParticlePositon = Position; particle.Update(gameTime); } } this is my main thought of the algorithm but anyway I cant get what I real want ! Anybody could tell me why?