簡體   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