四元数在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