c++ 和 OpenGl:如何从 class 中创建网格对象实例
c++ & OpenGl: How do you create a mesh object instance from within a class
我是 c++
初学者,正在尝试使用 openGL
构建我的第一个应用程序。
我正在尝试创建一个房间 class,它将采用宽度、长度和高度等参数来创建一个网格对象,然后我想从主函数中绘制它。
目前我没有尝试使用任何参数初始化房间,只是尝试从房间内创建一个基本网格,CPP 而不是从主网格。
我无法在 class 房间内创建一个网格对象作为私有变量,然后定义一个方法来通过从 main 调用它来绘制它。
我正在使用 Benny 的精彩教程,并且在我的 visual studio 解决方案中有他的确切 GitHub 文件。
我在这里发布,它们包括 mesh.h 和网格。 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
非常感谢您的帮助!
Mesh 没有默认构造函数(不带参数的构造函数),因为定义了以下构造函数:
Mesh(Vertex* vertices, unsigned int numVertices, unsigned int* indices, unsigned int numIndices);
您不是在 Room 的构造函数中构造 Room::mesh
,而是声明一个局部变量,该变量将在构造函数完成后销毁。要正确构造 Room::mesh
,您必须这样做:
Room::Room() : mesh( /*insert arguments here*/ )
{
mesh 是一个指针 (Mesh* mesh;
)。要调用 Draw,您必须使用箭头符号:mesh->Draw();
.
如果您不想以后出现问题,您还应该在调用 Draw 之前检查 mesh != nullptr
(您可以简单地记录您正在尝试绘制未初始化的房间或类似的东西,更容易比内存损坏或段错误更容易调试。
最后,在析构函数中,您应该有一行 delete mesh;
来释放关联的内存和 Mesh 实例可能正在使用的其他资源(或者甚至更好地使用 unique_ptr 声明网格,如下所示:std::unique_ptr<Mesh>
,所以它的行为就像一个指针,但是当你销毁你的房间实例时它会被自动删除。
我是 c++
初学者,正在尝试使用 openGL
构建我的第一个应用程序。
我正在尝试创建一个房间 class,它将采用宽度、长度和高度等参数来创建一个网格对象,然后我想从主函数中绘制它。
目前我没有尝试使用任何参数初始化房间,只是尝试从房间内创建一个基本网格,CPP 而不是从主网格。
我无法在 class 房间内创建一个网格对象作为私有变量,然后定义一个方法来通过从 main 调用它来绘制它。
我正在使用 Benny 的精彩教程,并且在我的 visual studio 解决方案中有他的确切 GitHub 文件。
我在这里发布,它们包括 mesh.h 和网格。 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
非常感谢您的帮助!
Mesh 没有默认构造函数(不带参数的构造函数),因为定义了以下构造函数:
Mesh(Vertex* vertices, unsigned int numVertices, unsigned int* indices, unsigned int numIndices);
您不是在 Room 的构造函数中构造 Room::mesh
,而是声明一个局部变量,该变量将在构造函数完成后销毁。要正确构造 Room::mesh
,您必须这样做:
Room::Room() : mesh( /*insert arguments here*/ )
{
mesh 是一个指针 (Mesh* mesh;
)。要调用 Draw,您必须使用箭头符号:mesh->Draw();
.
如果您不想以后出现问题,您还应该在调用 Draw 之前检查 mesh != nullptr
(您可以简单地记录您正在尝试绘制未初始化的房间或类似的东西,更容易比内存损坏或段错误更容易调试。
最后,在析构函数中,您应该有一行 delete mesh;
来释放关联的内存和 Mesh 实例可能正在使用的其他资源(或者甚至更好地使用 unique_ptr 声明网格,如下所示:std::unique_ptr<Mesh>
,所以它的行为就像一个指针,但是当你销毁你的房间实例时它会被自动删除。