繁体   English   中英

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

[英]c++ & OpenGl: How do you create a mesh object instance from within a class

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

我正在尝试创建一个Room类,该类将使用诸如宽度,长度和高度之类的参数来创建网格对象,然后再从主函数中绘制该对象。

目前,我并没有尝试使用任何参数初始化Room,而只是尝试从room(CPP)而不是main(内部)中创建一个基本网格。

我在教室中创建网格对象作为私有变量时遇到了麻烦,然后定义了一种通过从main调用它来绘制它的方法。

我正在使用Benny的出色教程,并将其确切的GitHub文件放在我的Visual Studio解决方案中。

我在这里发布它,它们包括mesh.h和mesh。 CPP可能是此链接出问题的地方。

这是当前的代码(为了确定起见,我已经包含了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 \\ nunobártolo\\ documents \\ visual studio 2015 \\ projects \\ archprogramer \\ archprogramer \\ room.cpp 78

非常感谢您的帮助!

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM