У меня есть этот класс:
class Model3D
{
public:
void AddVert( Vec3D vert ) { vertices.push_back( vert ); }
void AddTri( Vec3D *v_0, Vec3D *v_1, Vec3D *v_2 );
void Draw( HDC hdc );
std::vector<Vec3D> vertices;
std::vector<Triangle3D> polys;
};
Также важно, чтобы тип Triangle3D был определен следующим образом: (он маленький, потому что он еще не закончен)
class Triangle3D
{
public:
Vec3D *verts[3];
};
Кроме того, вотAddTri ()
void Model3D::AddTri( Vec3D *v_0, Vec3D *v_1, Vec3D *v_2 )
{
Triangle3D triangle;
triangle.verts[0] = v_0;
triangle.verts[1] = v_1;
triangle.verts[2] = v_2;
polys.push_back( triangle );
}
Вершины членам даны начальные значения.Глядя на эти элементы в отладке через указатели в Triangle3D , эти значения отображаются правильно
Наконец, я пытаюсь изменить элементы вершин здесь:
std::vector<Vec3D>::iterator j;
for (j = vertices.begin(); j != vertices.end(); ++j)
{
j->x = ( j->x ) / ( j->z );
j->y = ( j->y ) / ( j->z );
}
После завершения этого цикла, используя отладчик, если я проверяю вектор вершин , члены изменяются так, как ожидается.Тем не менее, когда я проверяю указатели на эти члены в классе Triangle3D , они остаются неизменными.Почему это так?
РЕДАКТИРОВАТЬ вот фрагмент добавляемых вершин и треугольников (определяет куб):
Model3D Cube( Vec3D center, int size )
{
Vec3D vert;
Model3D model;
vert.z = .5;
vert.x = center.x - (float)( 0.5f * size );
vert.y = center.y + (float)( 0.5f * size );
model.AddVert( vert );
vert.x = center.x + (float)( 0.5f * size );
vert.y = center.y + (float)( 0.5f * size );
model.AddVert( vert );
vert.x = center.x + (float)( 0.5f * size );
vert.y = center.y - (float)( 0.5f * size );
model.AddVert( vert );
vert.x = center.x - (float)( 0.5f * size );
vert.y = center.y - (float)( 0.5f * size );
model.AddVert( vert );
vert.z = 1;
//center.x += 120;
//center.y += 120;
vert.x = center.x - (float)( 0.5f * size );
vert.y = center.y + (float)( 0.5f * size );
model.AddVert( vert );
vert.x = center.x + (float)( 0.5f * size );
vert.y = center.y + (float)( 0.5f * size );
model.AddVert( vert );
vert.x = center.x + (float)( 0.5f * size );
vert.y = center.y - (float)( 0.5f * size );
model.AddVert( vert );
vert.x = center.x - (float)( 0.5f * size );
vert.y = center.y - (float)( 0.5f * size );
model.AddVert( vert );
//front
model.AddTri( &model.vertices[0], &model.vertices[1], &model.vertices[2] );
model.AddTri( &model.vertices[2], &model.vertices[3], &model.vertices[0] );
//top
model.AddTri( &model.vertices[4], &model.vertices[5], &model.vertices[1] );
model.AddTri( &model.vertices[1], &model.vertices[0], &model.vertices[4] );
//bottom
model.AddTri( &model.vertices[3], &model.vertices[2], &model.vertices[6] );
model.AddTri( &model.vertices[6], &model.vertices[7], &model.vertices[3] );
//left
model.AddTri( &model.vertices[4], &model.vertices[0], &model.vertices[3] );
model.AddTri( &model.vertices[3], &model.vertices[7], &model.vertices[4] );
//right
model.AddTri( &model.vertices[1], &model.vertices[5], &model.vertices[6] );
model.AddTri( &model.vertices[6], &model.vertices[2], &model.vertices[1] );
//back
model.AddTri( &model.vertices[5], &model.vertices[4], &model.vertices[7] );
model.AddTri( &model.vertices[7], &model.vertices[6], &model.vertices[5] );
return model;
}
А вот метод Draw:
void Model3D::Draw( HDC hdc )
{
std::vector<Triangle3D>::iterator i;
std::vector<Vec3D>::iterator j;
for (j = vertices.begin(); j != vertices.end(); ++j)
{
j->x = ( j->x ) / ( j->z );
j->y = ( j->y ) / ( j->z );
}
for (i = polys.begin(); i != polys.end(); ++i)
{
DrawLine( hdc, *i->verts[0], *i->verts[1], WHITE );
DrawLine( hdc, *i->verts[1], *i->verts[2], WHITE );
DrawLine( hdc, *i->verts[2], *i->verts[0], WHITE );
}
}