SharpDX:在不操纵顶点的情况下移动对象

时间:2016-05-10 14:31:27

标签: c# 3d directx sharpdx

我正在使用SharpDX并试图在worldspace中移动一个对象。 当我从web(.obj文件)加载对象时,接收的数据被写入缓冲区。所以我没有机会操纵它。 我知道可以借助矩阵移动,旋转和缩放对象。但话说回来,我只得到了网格的顶点和索引缓冲区。我有什么监督来改变世界空间中的网格物体吗?

1 个答案:

答案 0 :(得分:0)

我不太了解,但我认为你需要为每个网格添加一个worldViewMatrix以后有一个名为position的vector3,每个网格的属性通过Matrix.Translation传递参数(position.x,position.y,position .Z)。您的缓冲区存储在gpu中,您无法直接更改它,因此您可以使用矩阵移动它们。

类似于网格类或你使用的任何东西:

Matrix WorldViewMatrix;
public Vector3 Position;

    public void Render( SharpDX.Direct3D11.Buffer constantBuffer, SharpDX.Direct3D11.Device device, Matrix viewProj )
    {
    WorldViewMatrix =  Matrix.Scaling(Scale) * Matrix.RotationX(Rotation.X) * Matrix.RotationY(Rotation.Y) * Matrix.RotationZ(Rotation.Z) * Matrix.Translation(Position.X, Position.Y, Position.Z) * viewProj;
    WorldViewMatrix.Transpose();
    device.ImmediateContext.UpdateSubresource(ref WorldViewMatrix, constantBuffer);
    //device.ImmediateContext.PixelShader.SetShaderResource(0, textureView);
    device.ImmediateContext.Draw(VerticesCount,0);
    }

稍后您将创建viewMatrix

var viewProj = Matrix.Multiply(myMesh.ViewLayer.Camera.getView(), proj); 
//Whatever your organization is I did it like myMesh.ViewLayer.Camera.getView() for my purpose. I assume you had camera setup already.

最后准备搬家:

Matrix proj = Matrix.Identity;

    RenderLoop.Run(form, () =>{
            var viewProj = Matrix.Multiply(myMesh.ViewLayer.Camera.getView(), proj);
            //...
                if (IHandler.KeyRight) { myMesh.Position.X += 0.050f; }
                if (IHandler.KeyLeft)  { myMesh.Position.X -= 0.050f; }
                if (IHandler.KeyUp)    { myMesh.Position.Z += 0.050f; }
                if (IHandler.KeyDown)  { myMesh.Position.Z -= 0.050f; }
                if (IHandler.KeyQ)     { myMesh.Position.Y -= 0.050f; }
                if (IHandler.KeyE)     { myMesh.Position.Y += 0.050f; }
            //...
            myMesh.Render(contantBuffer, device, viewProj);
    });

我的结果:https://www.youtube.com/watch?v=dn4RdD6tc7g