C++&OpenGl:如何在类中创建网格对象实例
我是c++
初学者,试图用openGL
构建我的第一个应用程序。C++&OpenGl:如何在类中创建网格对象实例
我正在尝试创建一个Room类,它将采用宽度,长度和高度等参数来创建一个网格对象,然后我想从主函数中绘制该网格对象。
在我不想用任何参数初始化Room的时候,只是试图从房间内,CPP而不是从main创建一个基本的网格。
我在创建一个网格对象作为教室内的一个私有变量时遇到了困难,然后通过从main调用它来定义一个方法来绘制它。
我使用Benny的令人敬畏的教程,并有他的确切的GitHub文件在我的visual studio解决方案。
在这里发布它,它们包括mesh.h和mesh。 CPP这可能是问题来自this link。
下面是当前的代码(我已经包括了一切,我包括主,只是为了确保)
---- Room.h ------------- -
#pragma once
#include <iostream>
#include <SDL2/SDL.h>
#include "display.h"
#include "mesh.h"
#include "shader.h"
#include "texture.h"
#include "transform.h"
#include "camera.h"
class Room
{
public:
Room();
~Room();
void drawRoom();
private:
Mesh* mesh;
};
---- Room.cpp ---------------
#include "Room.h"
#include <iostream>
#include <SDL2/SDL.h>
#include "display.h"
#include "mesh.h"
#include "shader.h"
#include "texture.h"
#include "transform.h"
#include "camera.h"
Room::Room()
{
Vertex vertices[] =
{
Vertex(glm::vec3(-1, -1, -1), glm::vec2(1, 0), glm::vec3(0, 0, -1)),
Vertex(glm::vec3(-1, 1, -1), glm::vec2(0, 0), glm::vec3(0, 0, -1)),
Vertex(glm::vec3(1, 1, -1), glm::vec2(0, 1), glm::vec3(0, 0, -1)),
Vertex(glm::vec3(1, -1, -1), glm::vec2(1, 1), glm::vec3(0, 0, -1)),
Vertex(glm::vec3(-1, -1, 1), glm::vec2(1, 0), glm::vec3(0, 0, 1)),
Vertex(glm::vec3(-1, 1, 1), glm::vec2(0, 0), glm::vec3(0, 0, 1)),
Vertex(glm::vec3(1, 1, 1), glm::vec2(0, 1), glm::vec3(0, 0, 1)),
Vertex(glm::vec3(1, -1, 1), glm::vec2(1, 1), glm::vec3(0, 0, 1)),
Vertex(glm::vec3(-1, -1, -1), glm::vec2(0, 1), glm::vec3(0, -1, 0)),
Vertex(glm::vec3(-1, -1, 1), glm::vec2(1, 1), glm::vec3(0, -1, 0)),
Vertex(glm::vec3(1, -1, 1), glm::vec2(1, 0), glm::vec3(0, -1, 0)),
Vertex(glm::vec3(1, -1, -1), glm::vec2(0, 0), glm::vec3(0, -1, 0)),
Vertex(glm::vec3(-1, 1, -1), glm::vec2(0, 1), glm::vec3(0, 1, 0)),
Vertex(glm::vec3(-1, 1, 1), glm::vec2(1, 1), glm::vec3(0, 1, 0)),
Vertex(glm::vec3(1, 1, 1), glm::vec2(1, 0), glm::vec3(0, 1, 0)),
Vertex(glm::vec3(1, 1, -1), glm::vec2(0, 0), glm::vec3(0, 1, 0)),
Vertex(glm::vec3(-1, -1, -1), glm::vec2(1, 1), glm::vec3(-1, 0, 0)),
Vertex(glm::vec3(-1, -1, 1), glm::vec2(1, 0), glm::vec3(-1, 0, 0)),
Vertex(glm::vec3(-1, 1, 1), glm::vec2(0, 0), glm::vec3(-1, 0, 0)),
Vertex(glm::vec3(-1, 1, -1), glm::vec2(0, 1), glm::vec3(-1, 0, 0)),
Vertex(glm::vec3(1, -1, -1), glm::vec2(1, 1), glm::vec3(1, 0, 0)),
Vertex(glm::vec3(1, -1, 1), glm::vec2(1, 0), glm::vec3(1, 0, 0)),
Vertex(glm::vec3(1, 1, 1), glm::vec2(0, 0), glm::vec3(1, 0, 0)),
Vertex(glm::vec3(1, 1, -1), glm::vec2(0, 1), glm::vec3(1, 0, 0)),
};
unsigned int indices[] = { 0, 1, 2,
0, 2, 3,
6, 5, 4,
7, 6, 4,
10, 9, 8,
11, 10, 8,
12, 13, 14,
12, 14, 15,
16, 17, 18,
16, 18, 19,
22, 21, 20,
23, 22, 20
};
mesh = new Mesh(vertices, sizeof(vertices)/sizeof(vertices[0]), indices, sizeof(indices)/sizeof(indices[0]));
}
Room::~Room()
{
}
void Room::drawRoom()
{
mesh.Draw();
}
,我发现了以下错误:
'.Draw'左边的错误C2228必须有class/struct/union ArchProgramer c:\ users \ nunobártolo\ documents \ visual studio 2015 \ projects \ archprogramer \ archprogramer \ room.cpp 78
非常感谢您您的帮助!
网是一个指针(Mesh* mesh;
)。要调用Draw,您必须使用箭头符号:mesh->Draw();
。
如果您不希望以后有问题,你也应该检查mesh != nullptr
调用绘制之前(您只需登录您试图绘制一个未初始化的房间或类似的东西,更容易比内存损坏调试或段错误)。
最后在析构函数,你应该有一个线delete mesh;
释放相关的内存和其他资源网实例可以使用(甚至更好使用的unique_ptr声明网状,就像这样:std::unique_ptr<Mesh>
,所以它的行为就像一个指针,但它会在你摧毁你的房间实例时自动删除。
非常感谢您的帮助。 –
网没有默认构造函数(其中一个不带任何参数),因为下面的构造函数定义:
Mesh(Vertex* vertices, unsigned int numVertices, unsigned int* indices, unsigned int numIndices);
你是不是在房间的构造函数构造Room::mesh
,而不是你在声明一个局部在构造函数完成后将被销毁的变量。要正确地构建Room::mesh
,你必须做这样的事情:
Room::Room() : mesh(/*insert arguments here*/)
{
非常感谢您的帮助。 –
同时学习C++和OpenGL?这相当雄心勃勃! – DeathByTensors
我同意德鲁。这是一个非常简单的问题,如果你第一次接触到这两个,你将会在C++和OpenGL上碰到很多。你的问题是实例变量被声明为Mesh网格,它需要默认的构造函数才能工作。您需要将其声明为Mesh * mesh并使用mesh = new Mesh(...参数...)创建它 –
@MarianoRuggiero感谢您的帮助Mariano,该实例现在被保存为Room的私有网格;但是我已经添加了一个方法drawRoom(),并且在此方法中,我无法使Mesh对象在网格类中使用Draw()方法。在Room.h下公共我原型输入void drawRoom();和Room.cpp我已经定义void drawRoom(){mesh.Draw()}但它不会编译? - –