2016-05-11 10 views
0

私はc++初心者で、最初のアプリケーションをopenGLでビルドしようとしています。C++とOpenGl:クラス内からメッシュオブジェクトインスタンスを作成するには

私は、main関数から描画したいメッシュオブジェクトを作成するための幅、長さ、高さなどのパラメータを取るルームクラスを作成しようとしています。

私は瞬時に、部屋の中から基本メッシュを作成しようとしていて、パラメータを使ってRoomを初期化しようとしていません。

クラスルーム内のプライベート変数としてメッシュオブジェクトを作成し、メインから呼び出して描画する方法を定義する際に問題があります。

私はBennyの素晴らしいチュートリアルを使用しており、Visual Studioソリューションで正確なGitHubファイルを持っています。

ここに投稿すると、mesh.hとメッシュが含まれています。 CPPはおそらく問題がthis linkから来ている場所です。ここで

は、現在のコード(私は念のため、私がメインに含めるすべてのものを含めました)

---- 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(); 
} 

私は次のエラー取得しています:

をC2228は、 '.Draw' の左

エラーは、クラス/構造体/共用体ArchProgramer cを持っている必要があります。プロジェクト\ Visual Studioの2015 \ \ユーザー\ヌーノ・バルトロ\文書を\ archprogramer \ archprogramer \ 78

感謝room.cpp非常にあなたあなたの助けに!代わりに、ローカルに宣言され、

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

あなたが部屋のコンストラクタでRoom::meshを構築されていません。

+2

C++とOpenGLを同時に学習しますか?それはかなり野心的です! – DeathByTensors

+1

ドリューに同意します。これはかなり単純な問題です。あなたが初めて両方に近づいているなら、C++とOpenGLの両方でそれらの多くを打つでしょう。あなたの問題は、インスタンス変数がメッシュメッシュとして宣言されているため、デフォルトのコンストラクタが動作する必要があります。あなたはそれをMesh * meshとして宣言し、mesh = new Mesh(... parameters ...)を使ってそれを作成する必要があります –

+0

@MarianoRuggieroあなたの助けてくれてありがとうMariano、インスタンスは今Roomのプライベートメッシュとして保存されています。しかし、メソッドdrawRoom()を追加しました。このメソッドでは、メッシュクラスでDraw()メソッドを使用するメッシュオブジェクトを取得できません。私はvoid drawRoom()をプロトタイプしました。 Room.cppではvoid drawRoom(){mesh.Draw()}を定義しましたが、コンパイルされません。 - –

答えて

1

メッシュがポインタ(Mesh* mesh;)です。 Drawを呼び出すには、矢印の表記mesh->Draw();を使用する必要があります。

後で問題が発生したくない場合は、Drawを呼び出す前にmesh != nullptrをチェックする必要があります(初期化されていない部屋などを描画しようとしているだけでログできます)またはsegfaults)。あなたはこのように、unique_ptrを使用してメッシュを宣言しても良く、関連するメモリを解放するラインdelete mesh;およびその他のリソースメッシュのインスタンスを使用して(または、される可能性がありますしている必要がありデストラクタで最後に

:それはポインタのように振る舞うように、std::unique_ptr<Mesh>けどあなたの部屋のインスタンスを破壊すると自動的に削除されます。

+0

ありがとうございました。 –

-1

メッシュは、次のコンストラクタが定義されているため(パラメータを取らない1)デフォルトコンストラクタを持っていませんコンストラクタの終了後に破棄される変数。適切Room::meshを構築するために、あなたはこのような何かをする必要があります。

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

ありがとうございました。 –

関連する問題