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

非常感谢您您的帮助!

+2

同时学习C++和OpenGL?这相当雄心勃勃! – DeathByTensors

+1

我同意德鲁。这是一个非常简单的问题,如果你第一次接触到这两个,你将会在C++和OpenGL上碰到很多。你的问题是实例变量被声明为Mesh网格,它需要默认的构造函数才能工作。您需要将其声明为Mesh * mesh并使用mesh = new Mesh(...参数...)创建它 –

+0

@MarianoRuggiero感谢您的帮助Mariano,该实例现在被保存为Room的私有网格;但是我已经添加了一个方法drawRoom(),并且在此方法中,我无法使Mesh对象在网格类中使用Draw()方法。在Room.h下公共我原型输入void drawRoom();和Room.cpp我已经定义void drawRoom(){mesh.Draw()}但它不会编译? - –

网是一个指针(Mesh* mesh;)。要调用Draw,您必须使用箭头符号:mesh->Draw();

如果您不希望以后有问题,你也应该检查mesh != nullptr调用绘制之前(您只需登录您试图绘制一个未初始化的房间或类似的东西,更容易比内存损坏调试或段错误)。

最后在析构函数,你应该有一个线delete mesh;释放相关的内存和其他资源网实例可以使用(甚至更好使用的unique_ptr声明网状,就像这样:std::unique_ptr<Mesh>,所以它的行为就像一个指针,但它会在你摧毁你的房间实例时自动删除。

+0

非常感谢您的帮助。 –

网没有默认构造函数(其中一个不带任何参数),因为下面的构造函数定义:

Mesh(Vertex* vertices, unsigned int numVertices, unsigned int* indices, unsigned int numIndices);

你是不是在房间的构造函数构造Room::mesh,而不是你在声明一个局部在构造函数完成后将被销毁的变量。要正确地构建Room::mesh,你必须做这样的事情:

Room::Room() : mesh(/*insert arguments here*/) 
{ 
+0

非常感谢您的帮助。 –