내 자신의 쿼터니언 클래스를 만들려고하고 있는데 이상한 결과가납니다. 회전하려고하는 큐브가 미친 듯이 깜박이거나 뒤 틀릴 수 있습니다.쿼터니언이 뒤틀 리거나 깜박임
entity->Quat.AddRotation(vec4(1.0f, 1.0f, 0.0f, 45.f));
그리고 작은 금액으로 추가하여 회전하려고 각 프레임 : 내가 엔티티를 생성 할 때 나는 그것을 사원 수를 줄
void Quaternion::AddRotation(vec4 v)
{
Quaternion temp(v.x, v.y, v.z, v.w);
*this = temp * (*this);
}
mat4 Quaternion::GenerateMatrix(Quaternion &q)
{
q.Normalize();
//Row order
mat4 m(1 - 2*q.y*q.y - 2*q.z*q.z, 2*q.x*q.y - 2*q.w*q.z, 2*q.x*q.z + 2*q.w*q.y, 0,
2*q.x*q.y + 2*q.w*q.z, 1 - 2*q.x*q.x - 2*q.z*q.z, 2*q.y*q.z + 2*q.w*q.x, 0,
2*q.x*q.z - 2*q.w*q.y, 2*q.y*q.z - 2*q.w*q.x, 1 - 2*q.x*q.x - 2*q.y*q.y, 0,
0, 0, 0, 1);
//Col order
// mat4 m(1 - 2*q.y*q.y - 2*q.z*q.z,2*q.x*q.y + 2*q.w*q.z,2*q.x*q.z - 2*q.w*q.y,0,
// 2*q.x*q.y - 2*q.w*q.z,1 - 2*q.x*q.x - 2*q.z*q.z,2*q.y*q.z - 2*q.w*q.x,0,
// 2*q.x*q.z + 2*q.w*q.y,2*q.y*q.z + 2*q.w*q.x,1 - 2*q.x*q.x - 2*q.y*q.y,0,
// 0,0,0,1);
return m;
}
:
이
내 코드입니다for (int i = 0; i < Entities.size(); i++)
{
if (Entities[i] != NULL)
{
Entities[i]->Quat.AddRotation(vec4(0.5f, 0.2f, 1.0f, 0.000005f));
Entities[i]->DrawModel();
}
else
break;
}
마지막으로 각 큐브를 그립니다.
void Entity::DrawModel()
{
glPushMatrix();
//Rotation
mat4 RotationMatrix;
RotationMatrix = this->Quat.GenerateMatrix(this->Quat);
//Position
mat4 TranslationMatrix = glm::translate(mat4(1.0f), this->Pos);
this->Trans = TranslationMatrix * RotationMatrix;
glMultMatrixf(value_ptr(this->Trans));
if (this->shape != NULL)
this->shape->DrawShape();
glPopMatrix();
}
EDIT 0 :이 내가 쿼터니온을 학습하는 데 사용하는 튜토리얼입니다 : 결국에 회전 행렬을 공부하지 않고 http://www.cprogramming.com/tutorial/3d/quaternions.html
그러면 코드가 어딘가 잘못되었습니다. 테스트 케이스를 단순화하고 각각의 쿼터니언 방식을 단위 테스트 할 수 있습니까? 손으로 간단한 케이스를 전달하고 가장자리 케이스의 정확성을 확인하십시오. 안타깝게도 체계적이고 합리적인 코딩 이외에는 아마도 앞서 언급 한 TDD가있는 것은 아닙니다. –
예, 코드가 올바르지 않습니다. 나는 당신의 답을 이해할 수 있는지 100 % 확신하지 못했습니다. 제 영어는 최고가 아닙니다. 나는 간단한 큐브를 렌더링하는 것만으로 가능한 한 기본으로 유지하려고 노력했습니다. 더 쉬운 테스트 케이스를 설정하는 방법을 모르겠습니다. 미안합니다. 이것은 쿼터니언에 관해서 제가 사용하고있는 모든 코드입니다. 응답 해 주셔서 감사합니다! – Edvin
더 간단한 코드는 아무 것도 렌더링하지 않으며 매우 간단한 데이터에서 숫자를 계산하고 출력하여 직접 확인할 수 있습니다. 행렬 및 쿼터니언 (또는 더 신뢰할 수있는 다른 쿼터니언 라이브러리)을 사용하여 동등한 변환을 시도한 다음 결과가 동일한 지 확인할 수 있습니다. 희망을 조금 지워줍니다. –