SharpDX:移动对象而不操纵顶点
SharpDX: Move an object without manipulating the vertices
我正在使用 SharpDX 并尝试在世界空间中移动一个对象。
当我从网络(.obj 文件)加载对象时,接收到的数据被写入缓冲区。所以我没有机会操纵它。
我知道可以借助矩阵移动、旋转和缩放对象。但话又说回来,我只得到了网格的顶点和索引缓冲区。有没有我监督过的东西来转换世界空间中的网格?
我不太了解,但我认为您需要为每个网格添加一个 worldViewMatrix,稍后有一个名为 position 的 vector3,一个 属性 用于每个网格以通过 Matrix.Translation(position.x、position.y、position.z)。您的缓冲区存储在 gpu 中,您不能直接更改它,因此您可以使用矩阵移动它们。
类似内部网格的东西 class 或者你使用的任何东西:
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);
});
我正在使用 SharpDX 并尝试在世界空间中移动一个对象。 当我从网络(.obj 文件)加载对象时,接收到的数据被写入缓冲区。所以我没有机会操纵它。 我知道可以借助矩阵移动、旋转和缩放对象。但话又说回来,我只得到了网格的顶点和索引缓冲区。有没有我监督过的东西来转换世界空间中的网格?
我不太了解,但我认为您需要为每个网格添加一个 worldViewMatrix,稍后有一个名为 position 的 vector3,一个 属性 用于每个网格以通过 Matrix.Translation(position.x、position.y、position.z)。您的缓冲区存储在 gpu 中,您不能直接更改它,因此您可以使用矩阵移动它们。
类似内部网格的东西 class 或者你使用的任何东西:
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);
});