【问题标题】:SharpDX: Move an object without manipulating the verticesSharpDX:移动对象而不操纵顶点
【发布时间】:2016-05-10 14:31:26
【问题描述】:

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

【问题讨论】:

  • 如果您只有一个对象,您可以操作相机而不是模型。前后移动,围绕模型旋转...还可以更改定向光源以使其更可靠。
  • 我也想过这种可能性。目前我正在尝试这个。有一个世界观投影,我试图将一个对象的变换与它相乘。因为一个对象总是只有一个drawcall,这应该可以工作。但我仍然不太确定这种方法。还是谢谢你!
  • 这正是您正在寻找的 WorldViewProjection 变换的“世界”部分。只需设置一个相应的矩阵并让顶点着色器进行转换。 View 代表相机的方向和位置,Projection 代表相机的内在参数。整体矩阵为 WorldViewProjection=World*View*Projection。

标签: c# 3d directx sharpdx


【解决方案1】:

我知道的不够多,但我认为您需要为每个网格添加一个 worldViewMatrix 稍后有一个名为 position 的向量 3,每个网格的属性通过 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 2022-11-20
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    相关资源
    最近更新 更多