まず、私たち(私の友人と私)は、空間コンテキストで相互作用する粒子(この場合は小さな立方体(mesh3d))をシミュレートすることになっているコンピューターグラフィックスプロジェクトに取り組んでいます。これは、物理法則を使用して何百もの粒子が爆発し、互いに引き付け合うことです。
私たちは、学校から提供されたフレームワークに基づいて実装を行ったため、それに「適応」する必要があります。
立方体(mesh3d)を作成するときに、テクスチャを含むマテリアルを提供します。
Mesh3D*
SolarViewer::
createCube()
{
// initialize Mesh3D
Mesh3D *cube = new Mesh3D();
MeshMaterial* mat = new MeshMaterial; //we create the material for the cube
mat->m_diffuseTexture.create("particle.tga"); //we create the diffuse texture of the material to be particle.tga
// setup uniform cube with side length 0.5 and center of cube being (0,0,0)
std::vector< Vector3 > cubeVertices;
std::vector< Vector3 > cubeNormals;
std::vector< Vector3 > cubeColors;
std::vector< unsigned int > cubeIndices;
float d = 1.0;
// front
cubeVertices.push_back(Vector3(-d,-d, d));
cubeVertices.push_back(Vector3( d,-d, d));
cubeVertices.push_back(Vector3( d, d, d));
cubeVertices.push_back(Vector3(-d, d, d));
for(int k = 0; k < 4; k++) cubeNormals.push_back(Vector3(0,0,1));
for(int k = 0; k < 4; k++) cubeColors.push_back(Vector3(0.8,0.3,0.3));
cubeIndices.push_back(0);
cubeIndices.push_back(1);
cubeIndices.push_back(2);
cubeIndices.push_back(0);
cubeIndices.push_back(2);
cubeIndices.push_back(3);
// right
cubeVertices.push_back(Vector3( d,-d,-d));
cubeVertices.push_back(Vector3( d,-d, d));
cubeVertices.push_back(Vector3( d, d, d));
cubeVertices.push_back(Vector3( d, d,-d));
for(int k = 0; k < 4; k++) cubeNormals.push_back(Vector3(1,0,0));
for(int k = 0; k < 4; k++) cubeColors.push_back(Vector3(0.3,0.8,0.3));
cubeIndices.push_back(4);
cubeIndices.push_back(5);
cubeIndices.push_back(6);
cubeIndices.push_back(4);
cubeIndices.push_back(6);
cubeIndices.push_back(7);
// back
cubeVertices.push_back(Vector3( d,-d,-d));
cubeVertices.push_back(Vector3(-d,-d,-d));
cubeVertices.push_back(Vector3(-d, d,-d));
cubeVertices.push_back(Vector3( d, d,-d));
for(int k = 0; k < 4; k++) cubeNormals.push_back(Vector3(0,0,-1));
for(int k = 0; k < 4; k++) cubeColors.push_back(Vector3(0.3,0.3,0.8));
cubeIndices.push_back(8);
cubeIndices.push_back(9);
cubeIndices.push_back(10);
cubeIndices.push_back(8);
cubeIndices.push_back(10);
cubeIndices.push_back(11);
// left
cubeVertices.push_back(Vector3(-d,-d, d));
cubeVertices.push_back(Vector3(-d,-d,-d));
cubeVertices.push_back(Vector3(-d, d,-d));
cubeVertices.push_back(Vector3(-d, d, d));
for(int k = 0; k < 4; k++) cubeNormals.push_back(Vector3(-1,0,0));
for(int k = 0; k < 4; k++) cubeColors.push_back(Vector3(0.8,0.8,0.3));
cubeIndices.push_back(12);
cubeIndices.push_back(13);
cubeIndices.push_back(14);
cubeIndices.push_back(12);
cubeIndices.push_back(14);
cubeIndices.push_back(15);
// top
cubeVertices.push_back(Vector3(-d, d,-d));
cubeVertices.push_back(Vector3( d, d,-d));
cubeVertices.push_back(Vector3( d, d, d));
cubeVertices.push_back(Vector3(-d, d, d));
for(int k = 0; k < 4; k++) cubeNormals.push_back(Vector3(0,1,0));
for(int k = 0; k < 4; k++) cubeColors.push_back(Vector3(0.8,0.3,0.8));
cubeIndices.push_back(16);
cubeIndices.push_back(17);
cubeIndices.push_back(18);
cubeIndices.push_back(16);
cubeIndices.push_back(18);
cubeIndices.push_back(19);
// bottom
cubeVertices.push_back(Vector3( d,-d,-d));
cubeVertices.push_back(Vector3(-d,-d,-d));
cubeVertices.push_back(Vector3(-d,-d, d));
cubeVertices.push_back(Vector3( d,-d, d));
for(int k = 0; k < 4; k++) cubeNormals.push_back(Vector3(0,-1,0));
for(int k = 0; k < 4; k++) cubeColors.push_back(Vector3(0.3,0.8,0.8));
cubeIndices.push_back(20);
cubeIndices.push_back(21);
cubeIndices.push_back(22);
cubeIndices.push_back(20);
cubeIndices.push_back(22);
cubeIndices.push_back(23);
cube->setIndices(cubeIndices, mat); //we set the cubeIndices and the material for the cube
cube->setVertexPositions(cubeVertices);
cube->setVertexNormals(cubeNormals);
cube->setVertexColors(cubeColors);
return cube;
}
次に、描画シーンメソッドですべての立方体を反復処理して描画します。
for (std::vector<Mesh3D*>::iterator mIt = m_meshes.begin(); mIt != m_meshes.end(); ++mIt)
{
Mesh3D* cube = *mIt;
m_meshShaderTexture.setMatrix4x4Uniform("modelworld", cube->getTransformation());
cube->getMaterial(0).m_diffuseTexture.bind();
m_meshShaderTexture.setIntUniform("texture", cube->getMaterial(0).m_diffuseTexture.getLayer());
draw_object(m_meshShaderTexture, cube);// method called to draw the cube
}
この行をメソッド「drawObject」で呼び出しました。このメソッドは、mesh3dオブジェクトを描画することを目的としています。
void SolarViewer::draw_object(Shader& sh, Mesh3D *mesh)
{
sh.setMatrix4x4Uniform("modelworld", mesh->getTransformation() );
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer( 3, GL_DOUBLE, 0, mesh->getVertexPointer() );
glNormalPointer( GL_DOUBLE, 0, mesh->getNormalPointer() );
glTexCoordPointer( 2, GL_DOUBLE, 0, mesh->getUvTextureCoordPointer() );
for(unsigned int i = 0; i < mesh->getNumberOfParts(); i++)
{
glDrawElements( GL_TRIANGLES, mesh->getNumberOfFaces()*3, GL_UNSIGNED_INT, mesh->getVertexIndicesPointer() );
}
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
しかし、最後に、コンパイルしようとしている間、次の行は私たちにBAD_ACCESSを与えます:(
glDrawElements( GL_TRIANGLES, mesh->getNumberOfFaces()*3, GL_UNSIGNED_INT, mesh->getVertexIndicesPointer() );
何が間違っているのですか?次のテクスチャ(.tga)をバインドして、光る効果を得るだけで十分ですか?: http: //i166.photobucket.com/albums/u83/j1m68/star.jpg