3

我是计算机工程专业的四年级学生,并且有一些 Android 开发经验。

我正在开发一个具有 3D 组件的应用程序,这需要我能够旋转它。我正在查看 android 资源站点上的示例。

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/TouchRotateActivity.html

这个例子没有讨论围绕 z 轴的旋转。我已经尝试使用四元数进行旋转,但我不明白如何围绕 z 轴进行旋转。

旋转某些东西后,轴不再相同(x,y),那么您如何找出在哪个轴上旋转了多少?

我想知道是否有人可以帮助我学习如何围绕物体旋转。像上面的例子一样,但也围绕 z 轴。我已经花了大约 24 小时搜索并试图弄清楚这一点。

更大的问题是,一旦您围绕 y 轴旋转 90 度,您如何检测到下一次旋转(在触摸屏上垂直旋转)应该围绕 z 轴。

先感谢您。

4

4 回答 4

1

将 xAngle 和 yAngle 添加到当前矩阵。

Matrix.rotateM(matrix, 0, xAngleADD, matrix[1], matrix[5], matrix[9]);
Matrix.rotateM(matrix, 0, yAngleADD, matrix[0], matrix[4], matrix[8]);
gl.glMultMatrixf(matrix, 0);
于 2012-01-13T14:55:18.430 回答
0

You can also rotate the camera around the center instead of rotating the object.

于 2011-01-26T13:39:36.353 回答
0

你的问题不太对。不要问“一旦你旋转了某个东西,轴就不再是相同的(x,y),那么你怎么知道在哪个轴上旋转了多少?”,问“我怎样才能围绕全局轴而不是局部轴旋转轴?”。您希望围绕全局 x 的旋转始终是围绕全局 x 的旋转,而不是围绕对象的局部 x 轴的旋转。您不会根据当前状态进行不同的旋转,您只需更改您在概念上旋转的内容。

首先,您可能正在存储 rotX、rotY 和 rotZ 并调用 glRotatef 来应用旋转?这对于你想做的事情来说还不够好。您正在做的是用欧拉角描述方向。您总是会遇到gimbal lock,这是其中一个轴的某些值将其他两个轴变成同一轴的地方。所以你失去了一定程度的自由。查看文章以获得正确的解释。

因为作为 OpenGL 编码器,您会对它们非常满意,假设您将对象方向直接存储为称为 M 的矩阵。您将旋转存储为您应用以实现旋转的矩阵。没有明确的角度或轴概念。

假设你想绕 x 旋转。您围绕 x 轴生成一个合适的旋转矩阵,称为 R。这样的矩阵将是 OpenGL 在内部构建以执行 glRotatef(angle, 1, 0, 0) 的东西。

那么你实际上有两个选择——用 MR 替换 M 或用 RM 替换 M。矩阵乘法不是可交换的,所以它们不一样。就像使用 OpenGL 矩阵堆栈将 6 向左平移然后旋转 40 度产生的结果与旋转 40 度然后将 6 向左平移产生不同的结果。

在这种情况下,R 是对象,所以 MR 是后乘法,RM 是预乘法。矩阵的乘法创建一个矩阵,当应用于向量时,与应用第二个然后应用第一个具有相同的效果。因此,如果您进行后乘,您会得到结果,就好像您将对象旋转了新的旋转,然后是它之前的所有对象。这显然是错误的方法。您希望新的修改在迄今为止的所有其他修改之后生效。所以你预乘。然后将结果存储为新的 M。

实际上,仅此而已。您可以显式地使用 GL 矩阵堆栈快速进行概念验证,例如:

// ... I assume the modelview stack is active, M is an array of 16 floats ...

// ensure whatever's on the stack currently is kept safe
glPushMatrix();

    // but we don't actually care what it was, so load the identity
    glLoadIdentity();

    // build our rotation matrix first
    glRotatef(changeAroundX, 1, 0, 0);
    glRotatef(changeAroundY, 0, 1, 0);

    // multiply by M. OpenGL postmultiplies by the newer matrix, so this
    // is premultiplying M by whatever we just loaded
    glMultMatrixf(M);

    // read the new M back
    glGetFloatv(GL_MODELVIEW_MATRIX, M);

// and pretend we never touched the stack
glPopMatrix();

然后使用 glMultMatrixf(M) 代替 glRotatef 来应用当前对象旋转。这只是一个概念证明,因为你很快就会在 M 中得到一些令人讨厌的数字错误,这只是你对它进行大量操作的结果。您可以随时修复 M,但如果您已经拥有四元数代码并且对它们感到满意,那么沿着这条路线走可能会更聪明。只需用等价的四元数替换逻辑矩阵运算。

于 2011-01-27T00:26:34.957 回答
-1

我建议你阅读这本书的链接

特别是您的问题:请参阅第 3.3.1 部分

于 2011-01-26T13:32:53.843 回答