如何将3D OpenGL矩阵变换转换为CoreAnimation CATransform3D?

时间:2011-05-04 18:14:44

标签: objective-c cocoa-touch opengl-es core-animation

使用相同帧的透明CALayer绘制OpenGL ES 1.1渲染表面,并将其直接绑定在其上方。使用4x4矩阵对OpenGL场景中的对象进行变换(平移和旋转)。重叠的CALayer使用CATransform3D(which happens to be a 4x4 matrix, identical to ones used for OpenGL transforms)转换子图层。

OpenGL矩阵以我想要的方式转换场景对象。然后,我想对场景对象使用相同的矩阵变换,让CALayer将其应用于子图层,使子图层与场景对象的位置和方向完全相同。

问题是(我认为)我的OpenGL场景和CALayer的“场景”不同意任意“场景单元”的定义,这种不同意见表现为子的翻译中的差异-layer与场景对象的翻译(旋转很好)。具体来说,CALayer似乎在理解场景单元非常接近屏幕像素的情况下操作,而我的OpenGL场景使用更大的单位,这意味着CALayer只能转换场景对象的一小部分。

所以我正在寻找的是一种将我的OpenGL场景单元中指定的矩阵变换数学转换为CALayer-scene-unit中指定的功能等效矩阵变换的方法。我需要能够根据我的OpenGL场景单元定义CALayer场景单元,但我不知道CALayer如何在幕后与OpenGL接口。

是否有可能以这种方式计算转换?如果没有,是否有其他方法可能会有所帮助?

注意:我已经能够用一种纯粹的经验方法来解决这个问题,这种方法基本上归结为需要对CATransform3D进行哪些调整才能使其在几个位置工作,并进行外推。我希望有更精确的东西。

1 个答案:

答案 0 :(得分:4)

我猜这些问题是由OpenGL视图的投影矩阵引起的。请记住,从世界到视图的转换是view_point = projection x modelview x world_point