2015-11-28 60 views
1

我試圖繪製立方體原始和軸穿過它。軸不能與立方體一起旋轉。我不知道爲什麼它不能像那樣工作。如果我刪除axises.ApplyPasses();並呼叫cube.ApplyPasses();軸線穿過立方體,但它們會隨着它一起旋轉。爲什麼我的原始圖像是在彼此的頂部而不是在彼此之間繪製的?

原始類包含PrimitiveType,VertexData,BasicEffect對象等字段。沒有數學或任何在這裏完成。

*.ApplyPasses();等於Effect.CurrentTechnique.Passes[0].Apply();

什麼我: enter image description here

我想要做的事: enter image description here

創建多維數據集:

Primitive<VertexPositionColor> cube = new Primitive<VertexPositionColor>(_graphics.GraphicsDevice); 
cube.VertexOffset = 0; 
cube.Type = PrimitiveType.TriangleList; 
cube.VertexData = new VertexPositionColor[] 
{ 
    new VertexPositionColor(new Vector3(-0.5f, -0.5f, 0.5f), Color.Red), 
    new VertexPositionColor(new Vector3(-0.5f, 0.5f, 0.5f), Color.Red), 
    new VertexPositionColor(new Vector3(0.5f, 0.5f, 0.5f), Color.Red), 

    new VertexPositionColor(new Vector3(0.5f, 0.5f, 0.5f), Color.Red), 
    new VertexPositionColor(new Vector3(0.5f, -0.5f, 0.5f), Color.Red), 
    new VertexPositionColor(new Vector3(-0.5f, -0.5f, 0.5f), Color.Red), 

    new VertexPositionColor(new Vector3(-0.5f, -0.5f, 0.5f), Color.Green), 
    new VertexPositionColor(new Vector3(-0.5f, -0.5f, -0.5f), Color.Green), 
    new VertexPositionColor(new Vector3(-0.5f, 0.5f, -0.5f), Color.Green), 

    new VertexPositionColor(new Vector3(-0.5f, 0.5f, -0.5f), Color.Green), 
    new VertexPositionColor(new Vector3(-0.5f, 0.5f, 0.5f), Color.Green), 
    new VertexPositionColor(new Vector3(-0.5f, -0.5f, 0.5f), Color.Green), 

    new VertexPositionColor(new Vector3(-0.5f, -0.5f, 0.5f), Color.White), 
    new VertexPositionColor(new Vector3(0.5f, -0.5f, 0.5f), Color.White), 
    new VertexPositionColor(new Vector3(0.5f, -0.5f, -0.5f), Color.White), 

    new VertexPositionColor(new Vector3(0.5f, -0.5f, -0.5f), Color.White), 
    new VertexPositionColor(new Vector3(-0.5f, -0.5f, -0.5f), Color.White), 
    new VertexPositionColor(new Vector3(-0.5f, -0.5f, 0.5f), Color.White), 

    new VertexPositionColor(new Vector3(-0.5f, -0.5f, 0.5f), Color.White), 
    new VertexPositionColor(new Vector3(0.5f, -0.5f, 0.5f), Color.White), 
    new VertexPositionColor(new Vector3(0.5f, -0.5f, -0.5f), Color.White), 

    new VertexPositionColor(new Vector3(0.5f, -0.5f, -0.5f), Color.Blue), 
    new VertexPositionColor(new Vector3(0.5f, 0.5f, -0.5f), Color.Blue), 
    new VertexPositionColor(new Vector3(-0.5f, 0.5f, -0.5f), Color.Blue), 

    new VertexPositionColor(new Vector3(-0.5f, 0.5f, -0.5f), Color.Blue), 
    new VertexPositionColor(new Vector3(-0.5f, -0.5f, -0.5f), Color.Blue), 
    new VertexPositionColor(new Vector3(0.5f, -0.5f, -0.5f), Color.Blue), 

    new VertexPositionColor(new Vector3(0.5f, -0.5f, -0.5f), Color.Black), 
    new VertexPositionColor(new Vector3(0.5f, -0.5f, 0.5f), Color.Black), 
    new VertexPositionColor(new Vector3(0.5f, 0.5f, 0.5f), Color.Black), 

    new VertexPositionColor(new Vector3(0.5f, 0.5f, 0.5f), Color.Black), 
    new VertexPositionColor(new Vector3(0.5f, 0.5f, -0.5f), Color.Black), 
    new VertexPositionColor(new Vector3(0.5f, -0.5f, -0.5f), Color.Black), 

    new VertexPositionColor(new Vector3(0.5f, -0.5f, -0.5f), Color.Black), 
    new VertexPositionColor(new Vector3(0.5f, -0.5f, 0.5f), Color.Black), 
    new VertexPositionColor(new Vector3(0.5f, 0.5f, 0.5f), Color.Black), 

    new VertexPositionColor(new Vector3(0.5f, 0.5f, 0.5f), Color.Yellow), 
    new VertexPositionColor(new Vector3(-0.5f, 0.5f, 0.5f), Color.Yellow), 
    new VertexPositionColor(new Vector3(-0.5f, 0.5f, -0.5f), Color.Yellow), 

    new VertexPositionColor(new Vector3(-0.5f, 0.5f, -0.5f), Color.Yellow), 
    new VertexPositionColor(new Vector3(0.5f, 0.5f, -0.5f), Color.Yellow), 
    new VertexPositionColor(new Vector3(0.5f, 0.5f, 0.5f), Color.Yellow) 
}; 

cubeMatrixes = new Matrixes(); 
cubeMatrixes.World = Matrix.Identity; 
cubeMatrixes.View = Matrix.CreateLookAt(new Vector3(0.0f, 1.0f, 2.0f), Vector3.Zero, Vector3.Up); 
cubeMatrixes.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(110.0f), 4.0f/3.0f, 0.001f, 10000.0f); 

軸系創作:

Primitive<VertexPositionColor> axises = new Primitive<VertexPositionColor>(_graphics.GraphicsDevice); 
axises.Type = PrimitiveType.LineList; 
axises.VertexOffset = 0; 
axises.VertexData = new VertexPositionColor[] 
{ 
    new VertexPositionColor(new Vector3(-5, 0, 0), Color.Red), 
    new VertexPositionColor(new Vector3(5, 0, 0), Color.Red), 
    new VertexPositionColor(new Vector3(0, -5, 0), Color.Green), 
    new VertexPositionColor(new Vector3(0, 5, 0), Color.Green), 
    new VertexPositionColor(new Vector3(0, 0, -5), Color.Blue), 
    new VertexPositionColor(new Vector3(0, 0, 5), Color.Blue), 
}; 

axisesMatrixes = new Matrixes(); 
axisesMatrixes.World = Matrix.Identity; 
axisesMatrixes.View = Matrix.CreateLookAt(new Vector3(0.0f, 1.0f, 5.0f), Vector3.Zero, Vector3.Up); 
axisesMatrixes.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), 4.0f/3.0f, 0.001f, 10000.0f); 

翻譯:

cube.Effect.World 
    = Matrix.CreateRotationX(MathHelper.ToRadians(cubeAngle.X)) 
    * Matrix.CreateRotationY(MathHelper.ToRadians(cubeAngle.Y)) 
    * Matrix.CreateRotationZ(MathHelper.ToRadians(cubeAngle.Z)) 
    * cubeMatrixes.World; 
cube.Effect.View = cubeMatrixes.View; 
cube.Effect.Projection = cubeMatrixes.Projection; 

axises.Effect.World 
    = Matrix.CreateRotationX(MathHelper.ToRadians(0.0f)) 
    * Matrix.CreateRotationY(MathHelper.ToRadians(-60.0f)) 
    * Matrix.CreateRotationZ(MathHelper.ToRadians(0.0f)) 
    * axisesMatrixes.World; 
axises.Effect.View 
    = axisesMatrixes.View; 
axises.Effect.Projection 
    = axisesMatrixes.Projection; 

繪圖:

protected override void Draw(GameTime gameTime) 
{ 
    GraphicsDevice.Clear(Color.CornflowerBlue); 

    axises.ApplyPasses(); 
    _graphics.GraphicsDevice.DrawUserPrimitives(axises.Type, axises.VertexData, axises.VertexOffset, axises.Count); 

    cube.ApplyPasses(); 
    _graphics.GraphicsDevice.DrawUserPrimitives(cube.Type, cube.VertexData, cube.VertexOffset, cube.Count);  

    base.Draw(gameTime); 
} 

回答

0

的answear這個問題是,我創建單獨的投影矩陣。

當更改爲單軸投影矩陣和立方體時,一切都按預期工作。

翻譯:

cube.Effect.World 
    = Matrix.CreateRotationX(MathHelper.ToRadians(cubeAngle.X)) 
    * Matrix.CreateRotationY(MathHelper.ToRadians(cubeAngle.Y)) 
    * Matrix.CreateRotationZ(MathHelper.ToRadians(cubeAngle.Z)) 
    * cubeMatrixes.World; 
cube.Effect.View = cubeMatrixes.View; 
cube.Effect.Projection = cubeMatrixes.Projection; 

axises.Effect.World 
    = Matrix.CreateRotationX(MathHelper.ToRadians(0.0f)) 
    * Matrix.CreateRotationY(MathHelper.ToRadians(-60.0f)) 
    * Matrix.CreateRotationZ(MathHelper.ToRadians(0.0f)) 
    * axisesMatrixes.World; 
axises.Effect.View 
    = axisesMatrixes.View; 
axises.Effect.Projection 
    = cubeMatrixes.Projection; // instead axisesMatrixes.Projection;