iOS 용 OpenGL ES 2.0을 배우고 있으며 몇 개의 튜토리얼 덕분에 쿼터니언을 사용하여 간단한 구체 객체를 회전하고 확대/축소 할 수 있습니다. 스 와이프 완료 후 사용자가 화면에서 손가락을 들어 올리면 지구가 회전 속도를 계속 낮추고 싶습니다. 그래서 구체에 약간의 운동량을주고 싶습니다. 회전에 대해 알아 보려면이 블로그를 사용했습니다 : http://www.raywenderlich.com/12667/how-to-rotate-a-3d-object-using-touches-with-opengl. 아무나 모멘텀을 읽을 수 있습니까? 쿼터니언 (quaternions)으로 추진력을 어떻게 구현할 수 있습니까? 감사! iOS OpenGL ES 2.0 스 와이프 후 모멘텀으로 쿼터니언 회전
// Set up the frustrum and projection matrix
float aspect = fabsf(self.view.bounds.size.width/self.view.bounds.size.height);
GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f);
self.effect.transform.projectionMatrix = projectionMatrix;
// Now perform the interpolation step
//[self slerpToNewLocation];
// Move the globe back so we can see it
GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, GLOBAL_EARTH_Z_LOCATION);
// In update, we convert the quaternion into a rotation matrix, and apply it to the model view matrix as usual.
GLKMatrix4 rotation = GLKMatrix4MakeWithQuaternion(_quat);
GLKMatrix4 rotateMatrix = GLKMatrix4RotateWithVector3(rotation,momentumVar/200,GLKQuaternionAxis(_quat));
_quat = GLKQuaternionMakeWithMatrix4(rotateMatrix);
modelViewMatrix = GLKMatrix4Multiply(modelViewMatrix, rotateMatrix);
// Cap the zoom scale factor max and mins
// only if slerping so that the auto-zoom out and back
// in still works during auto-rotation
if (!_slerping) {
if (scale > 2.0) {
scale = 2.0;
}
if (scale < 1.15) {
scale = 1.15;
}
}
// Apply the zoom factors
if (_slerping) {
//NSLog(@"final scale %f",scale);
}
modelViewMatrix = GLKMatrix4Scale(modelViewMatrix, scale, scale, scale);
// Assign the drawer modelViewMatrix
self.effect.transform.modelviewMatrix = modelViewMatrix;
나는 다음과 같은 질문 보았다 :
Obtaining momentum quaternion from two quaternions and timestep을 -하지만 대답을 이해하지 못했다. 고마워요. 감사합니다. 감사합니다.
// Called when touches are ended
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
// The momentum var is initialized to a value
momentumVar = 0.025;
// Now since we stopped touching, decay the rotation to simulate momentum
momentumTimer = [NSTimer scheduledTimerWithTimeInterval:0.01
target:self
selector:@selector(decayGLKQuaternion)
userInfo:nil
repeats:YES];
}
// Slerp about the current axis after touches ended but for a greater angle (radians)
- (void)decayGLKQuaternion {
if (momentumVar < 0.001) {
// Stop the momentum and timer
momentumVar = 1.0;
[momentumTimer invalidate];
}
else {
// What is the current angle for the quaternion?
float currentQuatAngle = GLKQuaternionAngle(_quat);
// Decay the value each time
momentumVar = currentQuatAngle * 0.95;
}
}
업데이트 : 난 아직도이 알아 내려고 노력하고 있어요, 난에서 업데이트 및 감소 된 값에 대한 사원 수 축을 중심으로 그 행렬을 Matrix4에 업데이트 방법에 현재 사원 수 변환 및 회전 시도 한 번 발사를 시작하는 타이머는 내 응용 프로그램 내에서 TouchesEnded. 결과는 회전을하지만 축이 제대로 보이지 않습니다 (가까이에있는 것처럼 보입니다). 그리고 앵글은 내가 기대했던 반대의 회전 방향을 만듭니다. 그래서 손가락을 내리고 손가락을 들어 올리면 글로브가 속도가 감소하면서 위로 회전합니다. 각도 값의 부호를 변경해도 도움이되지 않습니다. 쿼터니온에서 회전축을 정확히 추출하고, 적절한 각도로 회전시키고, 감속하는 속도로 어떻게 할 수 있습니까? 감사합니다 - 당신은 완전히 UIKit에있는 UIScrollView 클래스를 이용하여 운동량 물리학을 구현하는 것을 방지 할 수 있습니다
// In update, we convert the quaternion into a rotation matrix, and apply it to the model view matrix as usual.
GLKMatrix4 rotation = GLKMatrix4MakeWithQuaternion(_quat);
GLKMatrix4 rotateMatrix = GLKMatrix4RotateWithVector3(rotation,momentumVar/200,GLKQuaternionAxis(_quat));
_quat = GLKQuaternionMakeWithMatrix4(rotateMatrix);
modelViewMatrix = GLKMatrix4Multiply(modelViewMatrix, rotateMatrix);