C++ 向量中的独立对象位置
我使用的是DirectX 11,目前用户可以将对象放置在站立的立方体上 我有一个这样的向量-C++ 向量中的独立对象位置,c++,arrays,vector,directx-11,C++,Arrays,Vector,Directx 11,我使用的是DirectX 11,目前用户可以将对象放置在站立的立方体上 我有一个这样的向量- std::vector<Cube> cubes; 这确实会向矢量添加一个新的立方体,但在移动后,所有以前的立方体位置都会覆盖到当前摄影机位置,使其看起来只有一个立方体被创建,并且每次按下按钮时都会简单地移动到摄影机位置 下面是我的控制台窗口的屏幕截图,以演示问题: 我还有一个迭代器,在设置了单独的世界matrtix之后,调用所有的cubes draw函数 非常感谢您的帮助 编辑 立方体
std::vector<Cube> cubes;
这确实会向矢量添加一个新的立方体,但在移动后,所有以前的立方体位置都会覆盖到当前摄影机位置,使其看起来只有一个立方体被创建,并且每次按下按钮时都会简单地移动到摄影机位置
下面是我的控制台窗口的屏幕截图,以演示问题:
我还有一个迭代器,在设置了单独的世界matrtix之后,调用所有的cubes draw函数
非常感谢您的帮助
编辑
立方体类是这样的-
Cube.h
#include "d3dUtil.h"
#include "GameTimer.h"
#include <string>
#include "Point3f.h"
//-- simple vertex structure
struct Vertex
{
XMFLOAT3 Pos;
XMFLOAT4 Color;
};
class Cube{
public:
Cube();
~Cube();
public:
void Init(ID3D11Device* device, ID3D11DeviceContext* deviceContext);
void SetOffset(float x, float y, float z);
Point3f GetOffset();
void BuildGeometryBuffers();
void Draw();
XMFLOAT4X4 world;
private:
//-- Vertex and Index Buffers
ID3D11Buffer* mCubeVB;
ID3D11Buffer* mCubeIB;
ID3D11Device* md3dDevice;
ID3D11DeviceContext* md3dDeviceContext;
Point3f mPosition;
};
您可能正在设置它们各自的世界矩阵,但您从未阅读过它们。您必须将此矩阵添加到着色器。您需要显示使用立方体的定义。立方体类现在闻起来像是立方体位置的全局变量,或者是通过立方体数组的错误循环。显然,无法在此处粘贴代码,但我在调用绘图函数时设置了它们,如world=XMLoadFloat4x4&Cube->world;这是在循环中完成的,循环遍历所有多维数据集。然后,在绘制之前使用SetMatrix设置矩阵
Cube.h
#include "d3dUtil.h"
#include "GameTimer.h"
#include <string>
#include "Point3f.h"
//-- simple vertex structure
struct Vertex
{
XMFLOAT3 Pos;
XMFLOAT4 Color;
};
class Cube{
public:
Cube();
~Cube();
public:
void Init(ID3D11Device* device, ID3D11DeviceContext* deviceContext);
void SetOffset(float x, float y, float z);
Point3f GetOffset();
void BuildGeometryBuffers();
void Draw();
XMFLOAT4X4 world;
private:
//-- Vertex and Index Buffers
ID3D11Buffer* mCubeVB;
ID3D11Buffer* mCubeIB;
ID3D11Device* md3dDevice;
ID3D11DeviceContext* md3dDeviceContext;
Point3f mPosition;
};
#include "Cube.h"
//-- Constructor
Cube::Cube(){
}
//-- Deconstructor
Cube::~Cube(){
//-- safely release
ReleaseCOM(mCubeVB);
ReleaseCOM(mCubeIB);
}
void Cube::Init(ID3D11Device* device, ID3D11DeviceContext* deviceContext)
{
md3dDevice = device;
md3dDeviceContext = deviceContext;
//-- define vectors and indices
BuildGeometryBuffers();
}
void Cube::SetOffset(float x, float y, float z)
{
mPosition.x = x;
mPosition.y = y;
mPosition.z = z;
}
Point3f Cube::GetOffset()
{
return mPosition;
}
void Cube::BuildGeometryBuffers()
{
//-- Create vertex buffer
Vertex vertices[] =
{
{ XMFLOAT3(-1.0f, -1.0f, -1.0f), (const float*)&Colors::White },
{ XMFLOAT3(-1.0f, +1.0f, -1.0f), (const float*)&Colors::Black },
{ XMFLOAT3(+1.0f, +1.0f, -1.0f), (const float*)&Colors::Red },
{ XMFLOAT3(+1.0f, -1.0f, -1.0f), (const float*)&Colors::Green },
{ XMFLOAT3(-1.0f, -1.0f, +1.0f), (const float*)&Colors::Blue },
{ XMFLOAT3(-1.0f, +1.0f, +1.0f), (const float*)&Colors::Yellow },
{ XMFLOAT3(+1.0f, +1.0f, +1.0f), (const float*)&Colors::Cyan },
{ XMFLOAT3(+1.0f, -1.0f, +1.0f), (const float*)&Colors::Magenta }
};
D3D11_BUFFER_DESC vbd; //-- Holds the vertex buffer resource description
vbd.Usage = D3D11_USAGE_IMMUTABLE; //-- Only accessable by GPU
vbd.ByteWidth = sizeof(Vertex) * 8; //-- Size of buffer
vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER; //-- Bind the buffer as a vertex buffer to the input-assembler stage of the pipeline
vbd.CPUAccessFlags = 0; //-- No CPU access
vbd.MiscFlags = 0;
vbd.StructureByteStride = 0;
D3D11_SUBRESOURCE_DATA vinitData; //-- Holds subresource data
vinitData.pSysMem = vertices; //-- Use the vertices as initialisation data
HR(md3dDevice->CreateBuffer(&vbd, &vinitData, &mCubeVB)); //-- Create final buffer using all information
//-- Create the index buffer
UINT indices[] = {
0, 1, 2, //-- Front face
0, 2, 3,
4, 6, 5, //-- Back face
4, 7, 6,
4, 5, 1, //-- Left face
4, 1, 0,
3, 2, 6, //-- right face
3, 6, 7,
1, 5, 6, //-- top face
1, 6, 2,
4, 0, 3, //-- bottom face
4, 3, 7
};
D3D11_BUFFER_DESC ibd; //-- index buffer description, simple to vertex buffer
ibd.Usage = D3D11_USAGE_IMMUTABLE;
ibd.ByteWidth = sizeof(UINT) * 36; //-- 36 indices
ibd.BindFlags = D3D11_BIND_INDEX_BUFFER;
ibd.CPUAccessFlags = 0;
ibd.MiscFlags = 0;
ibd.StructureByteStride = 0;
D3D11_SUBRESOURCE_DATA iinitData;
iinitData.pSysMem = indices;
HR(md3dDevice->CreateBuffer(&ibd, &iinitData, &mCubeIB)); //-- create final index buffer using all information
}
void Cube::Draw()
{
UINT stride = sizeof(Vertex);
UINT offset = 0;
//-- Set the created buffers
md3dDeviceContext->IASetVertexBuffers(0, 1, &mCubeVB, &stride, &offset);
md3dDeviceContext->IASetIndexBuffer(mCubeIB, DXGI_FORMAT_R32_UINT, 0);
//-- Draw the cube
md3dDeviceContext->DrawIndexed(36, 0, 0);
}