2017-12-03 19 views
0

나는 C에서 내 자신의 게임 엔진을 구현하고있어 ++와 내가 여기 도움이 필요, 나는 게임 개체가GLM 회전 사원 수는 객체

변형,의 방향 속성은 사원 수와 나는 그것을를 회전하려면 Y 축의 각도입니다.

currentAngle += 0.01; // currentAngle is a member variable, so yes i initialized it 
quat q(currentAngle, vec3(0, 1, 0)); 
myGameObject->SetOrientation(q); 

GameObject::SetOrientation(quat q) 
{ 
myOrientation = q; 
} 

을하지만, 게임 객체가 회전 할 때, 그것은 또한 조정 (변형) 도착 :

그래서, 나는이있다. 나는 변환을 신청하는 방법 그래서 확인

myModelMatrix = Math::CreateTransformationMatrix(
    transformation->GetPosition(), 
    transformation->GetOrientation(), 
    transformation->GetScale()); 


mat4& Math::CreateTransformationMatrix(vec3& translation, quat& orientation, vec3& scaleSize) 
{ 

    mat4 translate = glm::translate(glm::mat4(), translation); 
    mat4 rotate = glm::toMat4(orientation); 
    mat4 scale = glm::scale(glm::mat4(), scaleSize); 

    return translate * rotate * scale; 
} 

행렬 만이 (적어도 나에게) 좋아 보인다, 나는 규모의 행렬이 내가 뭔가를하고 있었다 어떻게 든 할 수 있는지 확인하는 곱셈을 형성 제거. 그러나, 그것은 아무것도 고칠 didnt합니다.

quat q(currentAngle, vec3(0, 1, 0)); 
    quat orientation = myGameObject->GetOrientation(); 
    orientation = orientation *q; 
    myGameObject->SetOrientation(orientation); 

그러나 중 하나가 작동 didnt가 :

는 또한 시도했다. 쉐이더에서 코드를 확인한 결과 긍정적이지는 않습니다.

내가 셰이더 매트릭스를 보내는 방법이 있습니다 :

glUseProgram(progarmId);1 
    glUniformMatrix4fv(uniforms[name], 1, GL_FALSE, glm::value_ptr(matrix)); 
나는 True로 3 매개 변수를 수정하고 투영 뷰 행렬 곱셈의 순서를 교환 시도

과 작동 didnt는 다음 중 하나를/

그래서, 얘들 아 ... 내가 뭘 잘못했는지 생각해? 나는 아이디어가 없습니다 :/

+0

방법은'myOrientation' 필드 인 익숙한? – meowgoesthedog

+0

@ myowgoesthedog myOrientation에 뮤 테이타가 myGameObject-> GetOrientation()입니다. Math :: CreateTransformationMatrix를 호출 할 때 사용합니다. – Camilo

답변

-1

GLM에 대한 경험이 없지만 코드가 정상적으로 보입니다. 난 문제가 당신이 게시 한 코드 밖에 있다고 생각합니다.

세계 *보기 * 투영 행렬을 계산하여 쉐이더로 전달하는 코드 일 수 있습니다. 곱하기 순서를 뒤집어 봅니다.

버텍스 쉐이더에있을 수 있습니다.

또한 일부 플랫폼/프레임 워크에서는 GPU로 전달할 때 매트릭스를 조 변경해야합니다.

+0

답장을 보내 주셔서 감사합니다. 질문을 업데이트했습니다. – Camilo

+0

아이디어가 없습니다. 디버거 (https://renderdoc.org/)를 사용해보십시오. – Soonts

0

그래서 알아 냈습니다.

I이 수행 될 때 :

currentAngle += 0.01; // currentAngle is a member variable, so yes i initialized it 
quat q(currentAngle, vec3(0, 1, 0)); 
myGameObject->SetOrientation(q); 

쿼드 끝에 있도록 GLM에서 축법에 각도를 사용하여 먼저 변환해야

currentAngle = 0.01; // currentAngle is a member variable, so yes i initialized it 
    //quat q(currentAngle, vec3(0, 1, 0)); 
    vec3 up(0, 1, 0); 
    quat q = glm::angleAxis(currentAngle, up); 
    GameObject->Rotate(q);