首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++ & OpenGl:如何从类中创建网格对象实例

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

Stack Overflow用户
提问于 2016-05-11 13:47:26
回答 2查看 2.6K关注 0票数 0

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

我正在尝试创建一个Room类,它将使用诸如宽度、长度和高度这样的参数来创建一个网格对象,然后我想从主函数中提取这个对象。

在这个时候,我不想用任何参数初始化room,我只是尝试从内部创建一个基本的网格,CPP,而不是main。

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

我正在使用Benny的非常棒的教程,并在我的visual解决方案中拥有他的确切GitHub文件。

我把它张贴在这里,他们包括网格和网格。CPP,这可能是问题来自于此链接

下面是当前的代码(我已经包含了我主要包含的所有内容,只是为了确保)

-Room.h

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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();
}

我得到了以下错误:

“2015\projects\archprogramer\archprogramer\room.cpp”左侧的错误C2228必须有类/struct/ ArchProgramer c:\users\nunoártolo\.Draw\visual studio ArchProgramer 78

非常感谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-11 19:17:08

网格是指针(Mesh* mesh;)。要调用“绘制”,必须使用箭头符号:mesh->Draw();

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

最后,在析构函数中,您应该有一行delete mesh;来释放网格实例可能使用的相关内存和其他资源(或者更好地使用unique_ptr声明网格,比如:std::unique_ptr<Mesh>,这样它的行为就像指针一样,但是当您破坏房间实例时,它将被自动删除。

票数 1
EN

Stack Overflow用户

发布于 2016-05-11 14:06:07

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

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

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

代码语言:javascript
复制
Room::Room() : mesh( /*insert arguments here*/ )
{ 
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37164634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档