四元数在iOS OpenGL ES中的翻译和旋转
我正在努力与iOS中的一些四元数代码。 我有一个开放的立方体,我已经旋转到等轴测视图。 我可以通过触摸旋转立方体并围绕其轴旋转,并放大/缩小。 我也有与立方体相关的标签 - 也需要与立方体一起旋转。 再次,我设法做到了这一点。
但是,我现在试图实现能够将标签(即翻译它)从一个位置拖动到另一个位置。 如果我们看下面的图片,我试图说明的是,我希望能够将标签从“label from”转换为“label to”位置。 然后,当我旋转立方体时,标签应该保持在新的位置并与立方体一起旋转。 然而,我正在翻译这个翻译,当我尝试旋转立方体时,标签跳转到一个新的位置,因为我没有正确设置标签坐标。
我有与该立方体相关的四元数。
使用下面的代码,当四元数设置为[0,0,0,1]时,我能够正确地翻译标签(使立方体正面 - 从这个位置看起来像一个正方形)。
- (void) rotateWithAngle:(float) radians andVector:(GLKVector3) axis andScale:(float) scale
{
if (radians != self.lastRadians
|| (axis.v[0] != self.lastAxis.v[0] || axis.v[1] != self.lastAxis.v[1] || axis.v[2] != self.lastAxis.v[2])
|| scale != self.lastScale)
{
GLKMatrix4 m = GLKMatrix4MakeTranslation(self.normX, self.normY, self.normZ);
if (radians != 0)
m = GLKMatrix4Rotate(m, radians, axis.x, -axis.y, axis.z);
m = GLKMatrix4Scale(m, scale, scale, scale);
float x = (m.m00 * m.m30) + (m.m01 * m.m31) + (m.m02 * m.m32) + (m.m03 * m.m33);
float y = (m.m10 * m.m30) + (m.m11 * m.m31) + (m.m12 * m.m32) + (m.m13 * m.m33);
float z = (m.m20 * m.m30) + (m.m21 * m.m31) + (m.m22 * m.m32) + (m.m23 * m.m33);
x /= m.m33;
y /= m.m33;
z /= m.m33;
float w = (((x+self.winSz) / (self.winSz * 2.0)) * self.parentFrame.size.width) + self.parentFrame.origin.x;
float h = (((y+self.winSz) / (self.winSz * 2.0)) * self.parentFrame.size.height) + self.parentFrame.origin.y;
self.lastRadians = radians;
self.lastAxis = axis;
self.lastScale = scale;
[self setCenter:CGPointMake(w,h)];
}
}
- (void) translateFromTouch:(UIPanGestureRecognizer *) pan
{
CGPoint translation = [pan translationInView:self];
CGPoint imageViewPosition = self.center;
GLKVector3 axis = GLKQuaternionAxis(*_quaternion);
float rot = GLKQuaternionAngle(*_quaternion);
CGFloat h = self.parentFrame.size.height;
CGFloat w = self.parentFrame.size.width;
imageViewPosition.x += translation.x;
imageViewPosition.y += translation.y;
self.center = imageViewPosition;
// recalculate the norm position
float x = ((2.0 * self.winSz * (imageViewPosition.x - self.parentFrame.origin.x)) / w) - self.winSz;
float y = ((2.0 * self.winSz * (imageViewPosition.y - self.parentFrame.origin.y)) / h) - self.winSz;
self.normX = x;
self.normY = y;
[pan setTranslation:CGPointZero inView:self];
}
如果拖动标签(基于UILabel)或旋转立方体(或opengl场景),则会触发这些方法。
这在我们正面看时很有用,因此x,y值可以很容易地从像素坐标转换成正常或世界坐标。 但是,当轴不在前面时,我正在努力想出来。 例如,我们将四元数设置为(0,sqrt(2)/ 2,0,sqrt(2)/ 2),那么所有x个翻译对应于z个世界坐标。 那么我怎么做这个连接/计算? 我相信这很容易,但是我已经打了一堵墙。
(winSz我已经设置为-1.5和-1之间的模型坐标)
链接地址: http://www.djcxy.com/p/14351.html上一篇: Quaternion translation and rotation in iOS OpenGL ES
下一篇: CSS3 Matrix rotation