문제가 다시 발생합니다. 며칠 쯤에 저는 짐벌 잠금 장치없이 자바로 카메라를 작성하려고합니다. 이 문제를 해결하기 위해 OpenGL에서 Quaternions 및 glMultMatrix를 사용하려고합니다. 또한 라이브러리 "LWJGL"을 특히 Matrix4f, Vector4f 및 Quaternions 클래스를 사용합니다. I는 행렬로 쿼터니언 변환quaternions 및 glMultMatrix (OpenGL)로 그리기
int DX = Mouse.getDX(); //delta-mouse-movement
int DY = Mouse.getDY();
Vector4f axisY = new Vector4f();
axisY.set(0, 1, 0,DY);
Vector4f axisX = new Vector4f();
axisX.set(1, 0, 0, DX);
Quaternion q1 = new Quaternion();
q1.setFromAxisAngle(axisX);
Quaternion q2 = new Quaternion();
q2.setFromAxisAngle(axisY);
Quaternion.mul(q1, q2, q1);
Quaternion.mul(camera,q1,camera);
그리고이 엉 : 여기서 상기 쿼터니언을 계산 코드
-0.5191307 0.027321965 -0.85425806 0.0
0.048408303 -0.9969446 -0.061303165 0.0
-0.8533229 -0.07317754 0.51622194 0.0
0.0 0.0 0.0 1.0
:
public Matrix4f quatToMatrix(Quaternion q){
double sqw = q.w*q.w;
double sqx = q.x*q.x;
double sqy = q.y*q.y;
double sqz = q.z*q.z;
Matrix4f m = new Matrix4f();
// invs (inverse square length) is only required if quaternion is not already normalised
double invs = 1/(sqx + sqy + sqz + sqw);
m.m00 = (float)((sqx - sqy - sqz + sqw)*invs) ; // since sqw + sqx + sqy + sqz =1/invs*invs
m.m11 = (float)((-sqx + sqy - sqz + sqw)*invs);
m.m22 =(float) ((-sqx - sqy + sqz + sqw)*invs);
double tmp1 = q.x*q.y;
double tmp2 = q.z*q.w;
m.m10 = (float) (2.0 * (tmp1 + tmp2)*invs);
m.m01 = (float) (2.0 * (tmp1 - tmp2)*invs) ;
tmp1 = q.x*q.z;
tmp2 = q.y*q.w;
m.m20 = (float)(2.0 * (tmp1 - tmp2)*invs) ;
m.m02 = (float)(2.0 * (tmp1 + tmp2)*invs) ;
tmp1 = q.y*q.z;
tmp2 = q.x*q.w;
m.m21 = (float)(2.0 * (tmp1 + tmp2)*invs) ;
m.m12 = (float)(2.0 * (tmp1 - tmp2)*invs) ;
return m;
}
A는 쿼터니언이 같은 예를 들어 본다 변환
이 코드를 사용하여 장면을 그립니다.
java.nio.FloatBuffer fb = BufferUtils.createFloatBuffer(32);
quatToMatrix(camera).store(fb);
GL11.glMultMatrix(fb);
drawPlayer();
이제 내 문제는 카메라가 움직이지 않거나 충분히 움직이지 않는다는 것입니다. 왜냐하면 나는 내 플레이어 모델 만 볼 수 있고 다른 것은 볼 수 없기 때문입니다 (플레이어 모델 이후에 장면에 또 다른 큐브가 있습니다) .
나는 정확히 무엇이 잘못되었는지 알지 못합니다. 그것은 그림인가, 회전인가, 혹은 개종자인가? 도와주세요.
편집 :
내 OpenGL을 초기화입니다: 무엇이 잘못되었는지
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GLU.gluPerspective(45.0f, ((float) setting.displayW()/(float) setting.displayH()), 0.1f,10000.0f);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
GL11.glLoadIdentity();
GL11.glShadeModel(GL11.GL_SMOOTH);
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDepthFunc(GL11.GL_LEQUAL);
GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST);
어떤 생각?
답장을 보내 주셔서 감사합니다. 내 OpenGL 초기화입니다 : \t \t GL11.glMatrixMode (GL11.GL_PROJECTION); \t \t GL11.glLoadIdentity(); \t \t GLU.gluPerspective (45.0f, (float) setting.displayW()/(float) setting.displayH()), 0.1f, 10000.0f); \t \t GL11.glMatrixMode (GL11.GL_MODELVIEW); \t \t GL11.glLoadIdentity(); \t \t GL11.glShadeModel (GL11.GL_SMOOTH); \t \t GL11.glEnable (GL11.GL_DEPTH_TEST); \t \t GL11.glDepthFunc (GL11.GL_LEQUAL); \t \t GL11.glHint (GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST); - X- 운동의 쿼터니언이란 정확히 무엇을 의미합니까? 이것을 의미합니까? axisX.set (1, 0, 0, DY); ? – mick
@mick 좋은 댓글;) –
mmh ... 나는 더 잘 읽을 수있는 글을 올리는 방법을 모른다. 어떤 문제가 내 문제를 해결하는 방법? – mick