c++ 和 OpenGl:如何从类中创建网格对象实例

Posted

技术标签:

【中文标题】c++ 和 OpenGl:如何从类中创建网格对象实例【英文标题】:c++ & OpenGl: How do you create a mesh object instance from within a class 【发布时间】:2016-05-11 13:47:26 【问题描述】:

我是c++ 初学者,正在尝试使用openGL 构建我的第一个应用程序。

我正在尝试创建一个 Room 类,该类将采用宽度、长度和高度等参数来创建一个网格对象,然后我想从主函数中绘制该对象。

目前我没有尝试使用任何参数初始化 Room,只是尝试从房间内创建基本网格,CPP 而不是从主。

我无法在教室中创建一个网格对象作为私有变量,然后定义一个方法来通过从 main 调用它来绘制它。

我正在使用 Benny 的精彩教程,并且在我的 Visual Studio 解决方案中拥有他的确切 GitHub 文件。

我在这里发布它,它们包括mesh.h 和mesh。 CPP 这可能是问题来自this link。

这是当前代码(我已将所有内容都包含在 main 中,只是为了确保)

----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\nuno bártolo\documents\visual studio 2015\projects\archprogramer\archprogramer\room.cpp 78

非常感谢您的帮助!

【问题讨论】:

同时学习C++和OpenGL?雄心勃勃! 我同意德鲁的观点。这是一个非常简单的问题,如果你是第一次接触 C++ 和 OpenGL,你会遇到很多问题。您的问题是实例变量被声明为 Mesh 网格,它需要默认构造函数才能工作。您需要将其声明为 Mesh* 网格并使用 mesh = new Mesh(...parameters...) 来创建它 @MarianoRuggiero 感谢您的帮助 Mariano,该实例现在正在保存为 Room 的私有网格;但是我添加了一个方法 drawRoom() 并且在这个方法中我无法让网格对象使用网格类中的 Draw() 方法。在公共下的 Room.h 中,我制作了 void drawRoom();在 Room.cpp 我定义了 void drawRoom() mesh.Draw() 但它不会编译? —— 【参考方案1】:

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

如果您不想以后出现问题,您还应该在调用 Draw 之前检查 mesh != nullptr(您可以简单地记录您正在尝试绘制一个未初始化的房间或类似的东西,比内存更容易调试损坏或段错误)。

最后,在析构函数中,你应该有一行 delete mesh; 来释放 Mesh 实例可能正在使用的相关内存和其他资源(或者甚至更好地使用 unique_ptr 声明网格,如下所示:std::unique_ptr&lt;Mesh&gt;,这样它的行为就像一个指针,但是当你销毁你的房间实例时它会被自动删除。

【讨论】:

非常感谢您的帮助。【参考方案2】:

网格没有默认构造函数(不带参数的构造函数),因为定义了以下构造函数:

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

您没有在 Room 的构造函数中构造 Room::mesh,而是声明了一个局部变量,该变量将在构造函数完成后被销毁。要正确构造Room::mesh,您必须执行以下操作:

Room::Room() : mesh( /*insert arguments here*/ )
 

【讨论】:

非常感谢您的帮助。

以上是关于c++ 和 OpenGl:如何从类中创建网格对象实例的主要内容,如果未能解决你的问题,请参考以下文章

如何在多维数组/网格c ++中创建List

使用网格数据和一维纹理图在 opengl 中创建等高线图

如何使用 c++ 和 opengl 在 mac 中创建窗口?

在 C++ 中创建 GLFW OpenGL 窗口时遇到问题

在 Qt 中创建原始 GL 上下文?

如何防止在 C++ 中创建对象