Slinik/gra w Opengl

0

Witam, mam do stworzenia projekt w opengl jednak nie umiem sobie z nim poradzić. Poszukuję osoby, która była by w stanie mi wytłumaczyć co robię źle.

Projekt jest na GitHub: https://github.com/Swarmet/GameEngineT.git

Główne problemy

  1. Pozycje obiektów podczas ich tworzenia nie są jednoznaczne dla każdego obiektu.
 

        Vector3 pos = makeVector3(2.0f, 0.0f, 0.0f);   //Pozycja dla pierwszego obiektu
     
        GameObject *obj1 = new GameObject("socket", _resourceManager->getVertexBufferArray()->at(0), pos );
	
        GameObject *obj2 = new GameObject("socket", _resourceManager->getVertexBufferArray()->at(1), makeVector3(2.0f, 0.0f, 0.0f));    
        // Pozycja tego obiekty w rzeczywistości będzie wynosić pos + (2.0, 0, 0)

        GameObject *obj3 = new GameObject("socket", _resourceManager->getVertexBufferArray()->at(1), makeVector3(2.5f, 0.0f, 0.0f));    
        // Pozycja tego obiekty w rzeczywistości będzie wynosić pos + obj2.pos + (2.5, 0, 0)

  1. Gdy wprowadzam do InputSystem obiekt tak bym mógł nim poruszać to w przypadku gdy wrzucę pierwszy obiekt z sceny(obj1) to będę sterował wszystkimi które dodałem. Gdy dodam ostatni GameObject to steruje tylko nim...

Nie umiem tego rozgryźć, pewnie robię coś źle z wskaźnikami lub źle korzystam z OpenGl...

Błagam o pomoc.

2

Jest trochę późno i nauka szybkiego czytania potrafi nieźle styrać, ale...

Używasz w pętli dla wszystkich obiektów glTranslate, glRotate, glScale, ale nigdzie nie widzę glPushMatrix i glPopMatrix co na pewno odbija się na twoim świecie.

Mówię o tym:

void RenderSystem::render(std::vector<GameObject *> *gameobjectArray)
{

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


	for (std::vector<GameObject *>::iterator iterator = gameobjectArray->begin(); iterator != gameobjectArray->end(); ++iterator)
	{
		GameObject *gameobject = *iterator;
		
		if (gameobject->getVertexBuffer() != NULL){
			
			glUseProgram(gameobject->getVertexBuffer()->getShader()->getProgramHandle()); 
			
			
			glTranslatef(gameobject->getPosition().x, gameobject->getPosition().y, gameobject->getPosition().z);
			glRotatef(gameobject->getRotation().x, 0.0f, 0.0f, 1.0f);
			glRotatef(gameobject->getRotation().y, 0.0f, 1.0f, 0.0f);
			glRotatef(gameobject->getRotation().z, 1.0f, 0.0f, 0.0f);

			glScalef(gameobject->getScale().x, gameobject->getScale().y, gameobject->getScale().z);

			glUniform4f((gameobject->getVertexBuffer()->getShader())->get_uColor(),
				(gameobject->getVertexBuffer()->getShaderData())->get_uColorValue().x,
				(gameobject->getVertexBuffer()->getShaderData())->get_uColorValue().y,
				(gameobject->getVertexBuffer()->getShaderData())->get_uColorValue().z,
				(gameobject->getVertexBuffer()->getShaderData())->get_uColorValue().w
				);

			glUniform3f((gameobject->getVertexBuffer()->getShader())->get_uLightPosition(),
				(gameobject->getVertexBuffer()->getShaderData())->get_uLightPosition().x,
				(gameobject->getVertexBuffer()->getShaderData())->get_uLightPosition().y,
				(gameobject->getVertexBuffer()->getShaderData())->get_uLightPosition().z);



			gameobject->getVertexBuffer()->configureVertexAttributes();
			gameobject->getVertexBuffer()->renderVertexBuffer();

		}
		else {

			camera = _cameraClass->getCamera();

			glLoadIdentity();
		
			gluLookAt(
				camera->getPosition().x, camera->getPosition().y, camera->getPosition().z,
				camera->getCamVector().x, camera->getCamVector().y, camera->getCamVector().z,
				camera->getUpVector().x, camera->getUpVector().y, camera->getUpVector().z );

			glfwSwapBuffers(_window);

		}

		
		glfwPollEvents();
	}
	
}
0

Dzięki, kompletnie o tym zapomniałem -.- wiedziałem, że coś z renderowaniem zepsułem ale nie umiałem znaleźć -.-

 
void RenderSystem::render(std::vector<GameObject *> *gameobjectArray)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	

	camera = _cameraClass->getCamera();

	glLoadIdentity();

	for (std::vector<GameObject *>::iterator iterator = gameobjectArray->begin(); iterator != gameobjectArray->end(); ++iterator)
	{
		GameObject *gameobject = *iterator;
		

		if (gameobject->getVertexBuffer() != NULL){

			glPushMatrix();

			glUseProgram(gameobject->getVertexBuffer()->getShader()->getProgramHandle()); 

			

			gluLookAt(
				camera->getPosition().x, camera->getPosition().y, camera->getPosition().z,
				camera->getPosition().x, camera->getPosition().y, camera->getCamVector().z,
				camera->getUpVector().x, camera->getUpVector().y, camera->getUpVector().z);
			
			glTranslatef(gameobject->getPosition().x, gameobject->getPosition().y, gameobject->getPosition().z);

			glRotatef(gameobject->getRotation().x, 0.0f, 0.0f, 1.0f);
			glRotatef(gameobject->getRotation().y, 0.0f, 1.0f, 0.0f);
			glRotatef(gameobject->getRotation().z, 1.0f, 0.0f, 0.0f);

			glScalef(gameobject->getScale().x, gameobject->getScale().y, gameobject->getScale().z);
			
			glUniform4f((gameobject->getVertexBuffer()->getShader())->get_uColor(),
				(gameobject->getVertexBuffer()->getShaderData())->get_uColorValue().x,
				(gameobject->getVertexBuffer()->getShaderData())->get_uColorValue().y,
				(gameobject->getVertexBuffer()->getShaderData())->get_uColorValue().z,
				(gameobject->getVertexBuffer()->getShaderData())->get_uColorValue().w
				);

			glUniform3f((gameobject->getVertexBuffer()->getShader())->get_uLightPosition(),
				(gameobject->getVertexBuffer()->getShaderData())->get_uLightPosition().x,
				(gameobject->getVertexBuffer()->getShaderData())->get_uLightPosition().y,
				(gameobject->getVertexBuffer()->getShaderData())->get_uLightPosition().z);
			


			gameobject->getVertexBuffer()->configureVertexAttributes();
			gameobject->getVertexBuffer()->renderVertexBuffer();
			glPopMatrix();
		}
	}

	glfwSwapBuffers(_window);
	glfwPollEvents();
	
}

Wszystkie błędy jakie pojawiały się w projekcie były wynikiem tego, iż nie zerowałem układu po każdym przesunięciu.

Jeszcze raz wielkie dzięki ...

1 użytkowników online, w tym zalogowanych: 0, gości: 1