2016-09-04 9 views
1

OpenGLの基本を学び、三角形や単純なカメラクラスなどを学ぶために、私はちょっと入門コースをYouTubeで見ました。ボクセルエンジン私が考えた最初のことは、私が最終的に複製できる単純なキューブでした。私の問題は、頂点と三角形をレンダリングするときに、キューブクラスでハードコードされたものに似ていない混乱しているように見えることです。私は0,0が画面の中心であることを知っています。 x軸の1は右です。 -1は左です。 y軸の1が上部、-1が下部です。しかし、頂点と三角形を頂点バッファに送ると、まったく別のことをしているようです。それは私のところでは本当に愚かな間違いでしょう。であることドロー機能は、私のメッシュクラスからmesh.hで反転X軸OpenGL

void Mesh::Draw(Vertex* vertices, unsigned int numVertices, Triangle* triangles, unsigned int numTriangles) 
{ 
//Array of indices 
std::vector<unsigned int> indices; 
for (int i = 0; i < numTriangles; i++) 
{ 
    indices.push_back(triangles[i].GetTriangle()[0]); 
    indices.push_back(triangles[i].GetTriangle()[1]); 
    indices.push_back(triangles[i].GetTriangle()[2]); 
} 

//How many vertices to draw 
m_drawCount = indices.size(); 

//Generate and bind vertex array 
glGenVertexArrays(1, &m_vertexArrayObject); 
glBindVertexArray(m_vertexArrayObject); 

//Generate and bind buffers 
glGenBuffers(NUM_BUFFERS, m_vertexArrayBuffers); 
glBindBuffer(GL_ARRAY_BUFFER, m_vertexArrayBuffers[POSITION_VB]); 
//Write vertex data to the buffer 
glBufferData(GL_ARRAY_BUFFER, numVertices * sizeof(vertices[0]), &vertices[0], GL_STATIC_DRAW); 

//Only one attribute for the vertex data 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vertexArrayBuffers[INDEX_VB]); 
//Write vertex data to the buffer 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices[0]) * indices.size(), &indices[0], GL_STATIC_DRAW); 

//Unbind vertex array 
glBindVertexArray(0); 

glBindVertexArray(m_vertexArrayObject); 

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 
glDrawElements(GL_TRIANGLES, m_drawCount, GL_UNSIGNED_INT, 0); 

glBindVertexArray(0); 
} 

頂点とトライアングル構造体

struct Vertex 
{ 
public: 
//Constructor 
Vertex() 
{ 

} 
//Constructor 
Vertex(const glm::vec3& pos) 
{ 
    //Set vertex position 
    this->m_pos = pos; 
} 
protected: 

private: 
//Vertex position 
glm::vec3 m_pos; 
}; 

struct Triangle 
{ 
public: 
//Constructor 
Triangle() 
{ 

} 

//Constructor 
Triangle(int point1, int point2, int point3) 
{ 
    SetTriangle(point1, point2, point3); 
} 

int* GetTriangle() 
{ 
    return m_points; 
} 

void SetTriangle(int point1, int point2, int point3) 
{ 
    m_points[0] = point1; 
    m_points[1] = point2; 
    m_points[2] = point3; 
} 
protected: 

private: 
int m_points[3]; 
}; 

カメラ機能

Camera::Camera(const glm::vec3 pos, float fov, float aspect, float zNear, float zFar) 
{ 
m_perspectiveMatrix = glm::perspective(fov, aspect, zNear, zFar); 
m_pos = pos; 
m_forward = glm::vec3(0, 0, 1); 
m_up = glm::vec3(0, 1, 0); 
} 

glm::mat4 Camera::GetViewProjection() const 
{ 
return m_perspectiveMatrix * glm::lookAt(m_pos, m_pos + m_forward, m_up); 
} 

注意を継承し

Cube::Cube() 
{ 
m_vertices[0] = Vertex(glm::vec3(-0.5, -0.5, 0)); 
m_vertices[1] = Vertex(glm::vec3(-0.5, 0.5, 0)); 
m_vertices[2] = Vertex(glm::vec3(0.5, 0.5, 0)); 
m_vertices[3] = Vertex(glm::vec3(0.5, -0.5, 0)); 
m_vertices[4] = Vertex(glm::vec3(-0.5, -0.5, 1)); 
m_vertices[5] = Vertex(glm::vec3(-0.5, 0.5, 1)); 
m_vertices[6] = Vertex(glm::vec3(0.5, 0.5, 1)); 
m_vertices[7] = Vertex(glm::vec3(0.5, -0.5, 1)); 

m_triangles[0] = Triangle(0, 1, 2); //Front 
//m_triangles[1] = Triangle(0, 2, 3); //Front 

//m_triangles[2] = Triangle(1, 5, 6); //Top 
//m_triangles[3] = Triangle(1, 6, 2); //Top 

//m_triangles[4] = Triangle(3, 5, 4); //Left 
//m_triangles[5] = Triangle(3, 5, 4); //Left 

//m_triangles[6] = Triangle(3, 2, 7); //Right 
//m_triangles[7] = Triangle(3, 3, 7); //Right 

//m_triangles[8] = Triangle(7, 6, 4); //Back 
//m_triangles[9] = Triangle(5, 6, 7); //Back 

//m_triangles[10] = Triangle(0, 4, 7); //Bottom 
//m_triangles[11] = Triangle(0, 3, 7); //Bottom 
} 

void Cube::Render() 
{ 
    Draw(m_vertices, sizeof(m_vertices)/sizeof(m_vertices[0]), m_triangles, (sizeof(m_triangles)/sizeof(m_triangles[0]))); 
} 

キューブのコンストラクタ私は唯一です左下、左上、右上もまだ、これは結果である必要がある1つの三角形を作成:

The triangle isn't where I specified it

別のノートでは、私のカメラの回転が同様にオフに思われることです。 yの回転を実際に回転させるとx軸上で回転し、xの回転の変化はy軸で回転します。

また、誰かがキューブを作成してレンダリングする優れた方法があれば、私は感謝します。私がそれを行うことができたら、私はほとんどの場合、makeMakeavoxelengineチュートリアルを調べます。

編集:x軸とy軸が反転しているように感じます。私はそれに対抗するためにすべての機能を逆転することができますが、それはその周りにハックリのようなものであり、後でさらに問題を引き起こす根本的な問題を解決しません。

EDIT2:Transform.h

#pragma once 
#include <glm\glm.hpp> 
#include <glm\gtx\transform.hpp> 
#include "Camera.h" 

struct Transform 
{ 
public: 
//Constructor 
Transform(const glm::vec3& pos = glm::vec3(), const glm::vec3& rot = glm::vec3(), const glm::vec3& scale = glm::vec3(1.0f, 1.0f, 1.0f)) 
{ 
    this->m_pos = pos; 
    this->m_rot = rot; 
    this->m_scale = scale; 
} 

//Get the model matrix 
inline glm::mat4 GetModelMatrix() const 
{ 
    //Create all the transform matrices 

    //Position matrix 
    glm::mat4 posMatrix = glm::translate(m_pos); 
    //Scale matrix 
    glm::mat4 scaleMatrix = glm::scale(m_scale); 
    //Rotation matrix X 
    glm::mat4 rotXMatrix = glm::rotate(m_rot.x, glm::vec3(1.0f, 0.0f, 0.0f)); 
    //Rotation matrix Y 
    glm::mat4 rotYMatrix = glm::rotate(m_rot.y, glm::vec3(0.0f, 1.0f, 0.0f)); 
    //Rotation matrix Z 
    glm::mat4 rotZMatrix = glm::rotate(m_rot.z, glm::vec3(0.0f, 0.0f, 1.0f)); 
    //Combined rotation matrix 
    glm::mat4 rotMatrix = rotXMatrix * rotYMatrix * rotZMatrix; 

    return posMatrix * rotMatrix * scaleMatrix; 
} 

inline glm::mat4 GetMVP(const Camera& camera) const 
{ 
    glm::mat4 ViewProjection = camera.GetViewProjection(); 
    glm::mat4 ModelMatrix = GetModelMatrix(); 

    return ViewProjection * ModelMatrix;//camera.GetViewProjection() * GetModel(); 
} 

//Get position 
inline glm::vec3* GetPosition() { return &m_pos; } 
//Get rotation 
inline glm::vec3* GetRotation() { return &m_rot; } 
//Get scale 
inline glm::vec3* GetScale() { return &m_scale; } 

//Set Position 
inline void SetPosition(const glm::vec3& pos) { this->m_pos = pos; } 
//Set Rotation 
inline void SetRotation(const glm::vec3& rot) { this->m_rot = rot; } 
//Set Scale 
inline void SetScale(const glm::vec3& scale) { this->m_scale = scale; } 

private: 
//Transform position 
glm::vec3 m_pos; 
//Transform rotation 
glm::vec3 m_rot; 
//Transform scale 
glm::vec3 m_scale; 
}; 

キューブ、main.cppに中のコールを変換し、カメラ:

Cube cube; 
Transform transform; 
Camera camera(glm::vec3(0.0f, 0.0f, -3.0f), 70.0f, (float)display.GetWidth()/(float)display.GetHeight(), 0.01f, 100.0f); 

EDIT3:X軸上で反転100%。新しいcube.cppコード:

m_vertices[0] = Vertex(glm::vec3(-0.5, -0.5, 0)); //BottomLeftFront 
m_vertices[1] = Vertex(glm::vec3(-0.5, 0.5, 0)); //TopLeftFront 
m_vertices[2] = Vertex(glm::vec3(0.5, 0.5, 0)); //TopRightFront 
m_vertices[3] = Vertex(glm::vec3(0.5, -0.5, 0)); //BottomRightFront 
m_vertices[4] = Vertex(glm::vec3(-0.5, -0.5, 1)); //BottomLeftBack 
m_vertices[5] = Vertex(glm::vec3(-0.5, 0.5, 1)); //TopLeftBack 
m_vertices[6] = Vertex(glm::vec3(0.5, 0.5, 1)); //TopRightBack 
m_vertices[7] = Vertex(glm::vec3(0.5, -0.5, 1)); //BottomRightBack 

m_triangles[0] = Triangle(0, 1, 2); //Front 
m_triangles[1] = Triangle(0, 2, 3); //Front 

//m_triangles[2] = Triangle(1, 5, 6); //Top 
//m_triangles[3] = Triangle(1, 6, 2); //Top 

m_triangles[4] = Triangle(3, 5, 4); //Left //BottomLeftFront, TopRightBack, BottomRightBack 
//m_triangles[5] = Triangle(3, 5, 4); //Left 

//m_triangles[6] = Triangle(3, 2, 7); //Right 
//m_triangles[7] = Triangle(3, 3, 7); //Right 

//m_triangles[8] = Triangle(7, 6, 4); //Back 
//m_triangles[9] = Triangle(5, 6, 7); //Back 

//m_triangles[10] = Triangle(0, 4, 7); //Bottom 
//m_triangles[11] = Triangle(0, 3, 7); //Bottom 

実際の結果の三角形の点がどのようなものだったかを示す新しい三角形の横にコメントを付けました。私が設定した三角形は、コードに従ってBottomRightFront、TopLeftBack、BottomLeftBackだったはずです。私はそれがどのように見えるのスクリーンショットを追加します。

Triangle was supposed to be BottomRightFront, TopLeftBack, BottomLeftBack

+1

コンパイルする完全なサンプルを提供できますか? 従来は右利きのシステムを使用していました。したがって、x軸が右を指し、y軸が上を指していれば、z軸は後ろ(カメラの方)を指します。 zNearとzFarは正であり、m_forwardsは(0 0 -1)ではなく(0 0 1)です。それはglmのことですか? – Buster

+0

私はそれが同じものであるように見たビデオからソースを見ているので、それはglmものでなければならないと思う。あなたにプロジェクトを送る最善の方法は何ですか?グーグルドライブ? btw:https://github.com/BennyQBD/ModernOpenGLTutorial/blob/master/camera.h – therealkf

+1

"pos"に負のz座標がありますか?そうでなければ、それはおそらく問題です。しかし、おそらくそうではありません。なぜなら、問題がそれだけであれば、イメージは垂直方向に水平に反転することが期待されるからです。 – Buster

答えて

3

Xのご説明とY軸は右に聞こえるが、Z軸が逆転しているようです。たとえば、投稿したコードには、値が(0、0、1)の変数m_forwardがあります。そのとなりますが、私は通常その方向を「後方に」呼びます。

OpenGLプログラムは右利きの座標系を使用しているため、Xが右を指し、Yが上を指していれば、Zは画面外を指します。そのことを覚えておき、コードを見直して、各位置と方向のベクトルのZ成分の符号を調べると、間違いを見つけるはずです。がんばろう!

+1

助けをありがとう! – therealkf

+1

心配しなくても、あなたは本当に自分のために働いていました。 GL HF – Buster