iOS 中 openGL 2 中的旋转模型
Rotating model in openGL 2 in iOS
我正在 iOS 和 Android 上使用 OpenGl,我想做的是绘制一个模型,一个球体,在球体内设置 camera/eye 坐标,设置纹理并启用平移和缩放以实现 360 度效果,我只是使用 OpenGl 1.0 为 Android 制作,但我在 iOS 中遇到很多问题,所以我使用 OpenGl 制作它2.0,一切都已设置并正常工作,但我在平移时遇到问题,为了旋转模型视图矩阵,我正在应用旋转变换,它有效但如果我更改任何轴旋转,它会弄乱另外两个轴,最后如果我在两个轴 X 和 Y 上应用旋转,球体旋转就像在 Z 轴上进行了某种变换一样,纹理结束倒置或以对角线显示,我我在 Android 中进行完全相同的转换,我在那里没有任何问题,有人对这个问题有一些经验吗?有什么建议吗?线索?代码?文章?我认为当我应用第一个转换时,space 中的坐标只是改变,下一个转换没有正确应用。
这是我的 iOS 代码:
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
glClear(GL_COLOR_BUFFER_BIT);
GLKMatrixStackPush(_obStack);
GLKMatrixStackRotate(_obStack,
GLKMathDegreesToRadians(_obAngleX),
0.0f, 1.0f, 0.0f);
GLKMatrixStackRotate(_obStack,
GLKMathDegreesToRadians(_obAngleY),
1.0f, 0.0f, 0.0f);
GLKMatrixStackScale(_obStack,
_obScaleFactor,
_obScaleFactor,
_obScaleFactor);
self.obEffect.transform.modelviewMatrix = GLKMatrixStackGetMatrix4(_obStack);
// Prepare effect
[self.obEffect prepareToDraw];
// Draw Model
glDrawArrays(GL_TRIANGLES, 0, panoramaVertices);
GLKMatrixStackPop(_obStack);
self.obEffect.transform.modelviewMatrix = GLKMatrixStackGetMatrix4(_obStack);
}
这是我的 Android 代码:
public void onDrawFrame(GL10 arGl) {
arGl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
arGl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
arGl.glPushMatrix();
arGl.glRotatef(obAngleY, 1.0f, 0.0f, 0.0f);
arGl.glRotatef(obAngleX, 0.0f, 1.0f, 0.0f);
arGl.glScalef(obScaleFactor, obScaleFactor, obScaleFactor);
if (obModel != null) {
obModel.draw(arGl);
}
arGl.glPopMatrix();
}
我一遍又一遍地尝试了几个实现,每次都没有成功,最后,我回去为 iOS 实现了 OpenGL 1.0 版本,在这种情况下,每当矩阵正在旋转,轴没有,所以这是我的解决方案,实现 OpenGL 1.0 版本。
我正在 iOS 和 Android 上使用 OpenGl,我想做的是绘制一个模型,一个球体,在球体内设置 camera/eye 坐标,设置纹理并启用平移和缩放以实现 360 度效果,我只是使用 OpenGl 1.0 为 Android 制作,但我在 iOS 中遇到很多问题,所以我使用 OpenGl 制作它2.0,一切都已设置并正常工作,但我在平移时遇到问题,为了旋转模型视图矩阵,我正在应用旋转变换,它有效但如果我更改任何轴旋转,它会弄乱另外两个轴,最后如果我在两个轴 X 和 Y 上应用旋转,球体旋转就像在 Z 轴上进行了某种变换一样,纹理结束倒置或以对角线显示,我我在 Android 中进行完全相同的转换,我在那里没有任何问题,有人对这个问题有一些经验吗?有什么建议吗?线索?代码?文章?我认为当我应用第一个转换时,space 中的坐标只是改变,下一个转换没有正确应用。
这是我的 iOS 代码:
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
glClear(GL_COLOR_BUFFER_BIT);
GLKMatrixStackPush(_obStack);
GLKMatrixStackRotate(_obStack,
GLKMathDegreesToRadians(_obAngleX),
0.0f, 1.0f, 0.0f);
GLKMatrixStackRotate(_obStack,
GLKMathDegreesToRadians(_obAngleY),
1.0f, 0.0f, 0.0f);
GLKMatrixStackScale(_obStack,
_obScaleFactor,
_obScaleFactor,
_obScaleFactor);
self.obEffect.transform.modelviewMatrix = GLKMatrixStackGetMatrix4(_obStack);
// Prepare effect
[self.obEffect prepareToDraw];
// Draw Model
glDrawArrays(GL_TRIANGLES, 0, panoramaVertices);
GLKMatrixStackPop(_obStack);
self.obEffect.transform.modelviewMatrix = GLKMatrixStackGetMatrix4(_obStack);
}
这是我的 Android 代码:
public void onDrawFrame(GL10 arGl) {
arGl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
arGl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
arGl.glPushMatrix();
arGl.glRotatef(obAngleY, 1.0f, 0.0f, 0.0f);
arGl.glRotatef(obAngleX, 0.0f, 1.0f, 0.0f);
arGl.glScalef(obScaleFactor, obScaleFactor, obScaleFactor);
if (obModel != null) {
obModel.draw(arGl);
}
arGl.glPopMatrix();
}
我一遍又一遍地尝试了几个实现,每次都没有成功,最后,我回去为 iOS 实现了 OpenGL 1.0 版本,在这种情况下,每当矩阵正在旋转,轴没有,所以这是我的解决方案,实现 OpenGL 1.0 版本。