2013-07-25 4 views
0

모델을 그리기 위해 다음 코드가 부분적으로 작동합니다. 저는이 모델의 인스턴스를 여러 개 만들고 모델의 각 인스턴스를 다른 렌더링 타겟으로 렌더링하고 있습니다. 제 질문은 어떻게 각 인스턴스에 대한 행렬을 저장할 수 있습니까? 왜냐하면 하나를 회전시키고 싶을 때 행렬의 참조를 취하는 것 같고 회전 할 때 업데이트 된 행렬이 필요하기 때문입니다.
감사합니다. 감사XNA에서 모델의 각 인스턴스에 대한 행렬의 상태를 저장하는 방법은 무엇입니까?

난 당신이 다음 줄

mesheffect.World = worldtransform; 

에 변수 worldtransform를 사용하여 업데이트에서 그 값을 설정하는 무엇을 말할 수에서

using System; 
    using System.Collections.Generic; 
    using System.Text; 
    using Microsoft.Xna.Framework; 
    using Microsoft.Xna.Framework.Content; 
    using Microsoft.Xna.Framework.Graphics; 
    using gamacherclone.Sources.Model; 

namespace gamacherclone 
{ 
    public class Case360 : DrawableComponent 
    { 
     private Model _model ;//= new Model(); 
     Matrix[] _boneTransforms,world; 
     public int coverflowposition = 0; 
     public bool rotate = false; 
     Matrix view, proj,worldtransform,tempbones; 
     public Matrix[] boneTransforms; 
     public Matrix[] originalBoneTransforms; 
     Matrix[] worldTransforms; 
     float i = 0; 

     public DashBoard dash; 
     Cover cover; 


     public Case360(Game game, Cover _cover) 
      : base(game) 
     { 
      this.dash = (DashBoard)game; 
      this.cover = _cover; 
     } 

     protected override void LoadContent(){ 
      this._model = this.dash.Content.Load<Model>(@"Models\case360"); 
      this.initialize(); 
     } 
     public void initialize() { 

      this._boneTransforms = new Matrix[this._model.Bones.Count]; 
      this.originalBoneTransforms = new Matrix[this._model.Bones.Count]; 
      this.worldTransforms = new Matrix[this._model.Bones.Count]; 
      this._model.CopyAbsoluteBoneTransformsTo(_boneTransforms); 
      this._model.CopyAbsoluteBoneTransformsTo(originalBoneTransforms); 
     } 



     public override void Update(GameTime gameTime) 
     { 

      // Calculate the new position of the forks. 
      float time = (float)gameTime.TotalGameTime.TotalSeconds; 

      if (this.rotate) { 
       worldtransform = worldTransforms[0]; 
       UpdateWorldTransforms(time); 
      } 


      base.Update(gameTime); 
     } 

     public void UpdateWorldTransforms(float time) 
     { 

      worldTransforms[0] = _boneTransforms[0] * Matrix.CreateRotationY(time * 2f); 

     } 


     public override void Draw(GameTime gameTime) 
     { 
      this._model.CopyAbsoluteBoneTransformsTo(_boneTransforms); 
      base.GraphicsDevice.SetRenderTarget(cover.caseRender); 
      base.GraphicsDevice.Clear(Color.Transparent); 
      base.GraphicsDevice.BlendState = BlendState.AlphaBlend; 
      //GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise; 
      base.GraphicsDevice.DepthStencilState = DepthStencilState.Default; 

      view = Matrix.CreateLookAt(new Vector3(1, 10, 10), new Vector3(0, 7, -10), Vector3.Up); 
      proj = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45f), 
             GraphicsDevice.Viewport.Width/GraphicsDevice.Viewport.Height, 
             1f, 1000.0f); 


      // Draw the model. 

      foreach (ModelMesh mesh in this._model.Meshes) 
      { 
       foreach (BasicEffect mesheffect in mesh.Effects) 
       { 
        mesheffect.Parameters["Texture"].SetValue(this.cover.coverImage); 
        mesheffect.EnableDefaultLighting(); 

        mesheffect.View = view; 
        mesheffect.Projection = proj; 
        mesheffect.World = worldtransform; 

       } 

       mesh.Draw(); 
      } 

      base.GraphicsDevice.SetRenderTarget(null); 
      base.GraphicsDevice.SetRenderTarget(dash.renderTarget2D); 
      base.Draw(gameTime); 
     } 




    } 
} 

답변

0

: worldtransform = worldTransforms[0];

당신이 겪고있는 문제가 있다는 것입니다을 Matrix은 구조체이며 value (참조가 아닌)로 전달됩니다. 따라서 배열 배열 worldTransforms[0]을 변수 worldtransform에 할당하면 완전히 새로운 인스턴스가 생성됩니다.

UpdateWorldTransforms(time); 
worldtransform = worldTransforms[0]; 

또는 참조로 매트릭스에 합격 변수를 직접

public void UpdateWorldTransforms(float time, ref Matrix worldMatrix) 
{ 
    worldMatrix = _boneTransforms[0] * Matrix.CreateRotationY(time * 2f); 
} 

업데이트 수정 :

당신은 수행하여이 문제를 해결할 수있는 저장하는 여러 인스턴스에 관해서는

을 다음과 같은 모델을 사용할 수 있습니다 :

public class WorldObject 
{ 
    public Matrix World { get; set; } 
    public Model GameModel { get; set; } 
} 

해당 클래스에 추가 정보를 저장하십시오. 업데이트/드로잉 정보를 처리하고 World 변환에 대한 작업을 수행 할 수 있습니다.

'XNA 인스 턴싱'하지만 그 중 일부는 당신이 필요로하는 것보다 더 많은 수 있습니다 들여다

관련 문제