我尝试使用平底锅旋转3d view
中的对象。有2个旋转轴:物体y轴和全局固定x轴。在y轴周围,我简单地使用方法CATransform3DRotate
生成的旋转矩阵旋转,并且在固定的x轴周围使用四元数。
这里有一些代码可以演示这种行为:
UITouch* touch = [touches anyObject];
CGPoint location = [touch locationInView: viewController.view];
CGPoint lastLoc = [touch previousLocationInView: viewController.view];
CGPoint diff = CGPointMake(lastLoc.x - location.x, lastLoc.y - location.y);
float rotX = 1 * DEGREES_TO_RADIANS(diff.y / 4.0);
float rotY = -1 * DEGREES_TO_RADIANS(diff.x / 4.0);
CATransform3D m = glView.modelTransform;
if(fabs(diff.y) > fabs(diff.x) * 5.0) { //up-down
Vector3D xAxis = {1.0, 0.0, 0.0};
Vector4D quaternion = [self makeQuaternionFromAxis: xAxis andAngle:rotX];
Vector4D currentQuaterion = [self makeQuaternionFromRotationMatrix: m];
quaternion = [self multiplyQuaternion:currentQuaterion buAnother:quaternion];
m = [self makeRo
tationMatrixFromQuaternion:quaternion];
m = CATransform3DConcat(m, origin);
}
else { //right-left
Vector3D yAxis = {0.0, 1.0, 0.0};
m = CATransform3DRotate(m, rotY, yAxis.x, yAxis.y,yAxis.z);
}
glView.modelTransform = m;
我将水平和垂直运动分开。原点变量是三维视图中物体的原始位置。问题是有时物体会产生偏航角度旋转并且旋转变得混乱,有时物体本身!当我在屏幕上混乱地制作平底锅时会出现这种情况。我试图使运动正常化,但这对我没有帮助。有人能告诉我我做错了什么。
答案 0 :(得分:0)
修正了这样的代码:
Vector4D quaternion;
if( fabs(diff.y) > fabs(diff.x) ) { //up-down
Vector3D xAxis = {1.0, 0.0, 0.0};
quaternion = [self makeQuaternionFromAxis: xAxis andAngle:rotX];
quaternion = [self multiplyQuaternion:quaternion buAnother:currentQuaterion];
}
else { //right-left
Vector3D yAxis = {0.0, 1.0, 0.0};
quaternion = [self makeQuaternionFromRotationMatrix:CATransform3DMakeRotation(rotY, yAxis.x, yAxis.y,yAxis.z);
quaternion = [self multiplyQuaternion:quaternion buAnother:currentQuaterion]
}
currentQuaterion = quaternion;
glView.modelTransform = CATransform3DConcat([self makeRotationMatrixFromQuaternion:quaternion],perspective);
currentQuaternion
保持当前对象旋转。
我的摘要:要乘以'旋转',请始终使用四元数,然后将其转换为旋转矩阵。