- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在寻找一种在具有四元数的 3D 模型上进行轨迹球旋转的简单实现,特别是在 iOS 上使用 GLKit。到目前为止,我已经检查了以下来源:
我也一直在尝试从 here 中理解源代码和数学和 here .我可以旋转我的物体,但它一直以特定角度跳来跳去,所以我担心万向节锁在起作用。我正在使用手势识别器来控制旋转(平移手势影响滚动和偏航,旋转手势影响俯仰)。我附上了四元数处理和模型 View 矩阵转换的代码。
变量:
GLK四元数旋转E;
四元数处理:
- (void)rotateWithXY:(float)x and:(float)y
{
const float rate = M_PI/360.0f;
GLKVector3 up = GLKVector3Make(0.0f, 1.0f, 0.0f);
GLKVector3 right = GLKVector3Make(1.0f, 0.0f, 0.0f);
up = GLKQuaternionRotateVector3(GLKQuaternionInvert(self.rotationE), up);
self.rotationE = GLKQuaternionMultiply(self.rotationE, GLKQuaternionMakeWithAngleAndVector3Axis(x*rate, up));
right = GLKQuaternionRotateVector3(GLKQuaternionInvert(self.rotationE), right);
self.rotationE = GLKQuaternionMultiply(self.rotationE, GLKQuaternionMakeWithAngleAndVector3Axis(y*rate, right));
}
- (void)rotateWithZ:(float)z
{
GLKVector3 front = GLKVector3Make(0.0f, 0.0f, -1.0f);
front = GLKQuaternionRotateVector3(GLKQuaternionInvert(self.rotationE), front);
self.rotationE = GLKQuaternionMultiply(self.rotationE, GLKQuaternionMakeWithAngleAndVector3Axis(z, front));
}
模型 View 矩阵转换(内部绘制循环):
// Get Quaternion Rotation
GLKVector3 rAxis = GLKQuaternionAxis(self.transformations.rotationE);
float rAngle = GLKQuaternionAngle(self.transformations.rotationE);
// Set Modelview Matrix
GLKMatrix4 modelviewMatrix = GLKMatrix4Identity;
modelviewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, -0.55f);
modelviewMatrix = GLKMatrix4Rotate(modelviewMatrix, rAngle, rAxis.x, rAxis.y, rAxis.z);
modelviewMatrix = GLKMatrix4Scale(modelviewMatrix, 0.5f, 0.5f, 0.5f);
glUniformMatrix4fv(self.sunShader.uModelviewMatrix, 1, 0, modelviewMatrix.m);
非常感谢任何帮助,但我确实希望尽可能简单并坚持使用 GLKit。
最佳答案
这里似乎存在一些问题。
您说您正在使用 [x,y] 进行平移,但看起来更像是您在使用它们进行俯仰和偏航。至少对我来说,平移是平移,而不是旋转。
除非我遗漏了什么,否则您每次尝试更新它时似乎都在替换整个轮换。您通过当前旋转的倒数旋转矢量,然后从该矢量和某个角度创建四元数。我相信这相当于从原始向量创建四元数,然后通过当前旋转逆向旋转它。所以你有 q_e'*q_up
。然后将其与当前旋转相乘,得到 q_e*q_e'*q_up = q_up
。当前旋转被取消。这似乎不是您想要的。
您真正需要做的就是从轴和角度创建一个新的四元数,然后将其与当前四元数相乘。如果新的四元数在左边,方向变化将使用眼局部坐标系。如果新的四元数在右边,则方向变化将在全局框架中进行。我想你想要:
self.rotationE =
GLKQuaternionMultiply(
GLKQuaternionMakeWithAngleAndVector3Axis(x*rate, up),self.rotationE);
执行此操作,对于所有三种情况均不使用反向预旋转。
我从未使用过 GLKit,但在从四元数转换为矩阵时提取轴角并不常见。如果角度为零,则轴未定义。当它接近于零时,您将遇到数字不稳定性。看起来您应该使用 GLKMatrix4MakeWithQuaternion
,然后将生成的矩阵与平移矩阵和比例矩阵相乘:
GLKMatrix4 modelviewMatrix =
GLKMatrix4Multiply( GLKMatrix4MakeTranslation(0.0f, 0.0f, -0.55f),
GLKMatrix4MakeWithQuaternion( self.rotationE ) );
modelviewMatrix = GLKMatrix4Scale( modelviewMatrix, 0.5f, 0.5f, 0.5f );
关于ios - 四元数的 Arcball 旋转(使用 iOS GLKit),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14075566/
我在处理以下文件时遇到一些问题: 我在这个文件上有 arcball 结构: #ifndef ARCBALL_H_ #define ARCBALL_H_ #include "ex1.h" ... ext
在我的 OpenGL 应用程序中,我需要使用 ArcBall 旋转来使用鼠标旋转对象。 读完这篇文章后,我意识到我必须使用四元数 - http://www.gamedev.net/page/resou
我正在尝试创建一个用于我的 3D Android 游戏的 arcball 相机(注意:我使用的是 libGDX 框架)...我无法弄清楚如何创建它。我或许可以在 libGDX 中扩展当前的 Persp
我正在使用旧版 OpenGL 绘制网格。我现在正在尝试实现一个 arcball 类来用鼠标旋转对象。但是,当我移动鼠标时,对象要么不旋转,要么旋转角度太大。 这是单击鼠标时调用的方法: void Ar
我的任务是创建一个 OpenGL 场景,实现简单移动和 Arcball 界面等想法。我遇到的问题是处理 NeHe 的 Arcball 类 ( http://nehe.gamedev.net/data/
我正在尝试实现一个 arcball 风格的相机。我使用 glm::lookAt 使相机保持指向目标,然后使用方位角/倾角在球体表面移动它以旋转 View 。 我遇到了一个问题,当方位角接近 90 度时
我正在按照本教程进行 3d 轨迹球导航: https://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Arcball
我正在寻找一种在具有四元数的 3D 模型上进行轨迹球旋转的简单实现,特别是在 iOS 上使用 GLKit。到目前为止,我已经检查了以下来源: Arcball rotation with GLKit H
我基本上是在尝试模仿相机在 Maya 中的旋转方式。 Maya 中的轨迹球始终与 y 轴对齐。因此,无论向上 vector 指向何处,它仍然会沿 y 轴旋转或与向上 vector 对齐。 我已经能够使
我正在修改一个 arcball 类,使其在每次调用 rollforward() 时旋转 1 度。我很难阅读代码,但我相信我需要编写 XY_to_sphere() 的替代方法,其中;设点 1 = v1,
我是一名优秀的程序员,十分优秀!