Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 基于旋转矩阵的OpenGL ES平移(X,Y,Z)_Ios_Opengl Es_Glkit - Fatal编程技术网

Ios 基于旋转矩阵的OpenGL ES平移(X,Y,Z)

Ios 基于旋转矩阵的OpenGL ES平移(X,Y,Z),ios,opengl-es,glkit,Ios,Opengl Es,Glkit,我正在为OpenGL ES 2.0 iOS应用程序实施平移,在某些情况下,我正在努力进行z方向的平移。最初,当模型加载时,y+朝向屏幕顶部,x+指向屏幕左侧,z+从屏幕向用户伸出。在此情况下,平移按预期工作-平移“右”按预期沿正x轴移动模型。Y也可以工作-平移“向上”沿Y轴正方向移动模式(坐标为负,因此我们只需翻转坐标即可正确操作)。问题总是在z轴上,当模型旋转时,z+轴现在指向右侧,平移“右”时,我接收到负z值,向左平移时,我得到正值,因此看起来坐标像z轴一样翻转。当z+指向屏幕左侧时,会出现

我正在为OpenGL ES 2.0 iOS应用程序实施平移,在某些情况下,我正在努力进行z方向的平移。最初,当模型加载时,y+朝向屏幕顶部,x+指向屏幕左侧,z+从屏幕向用户伸出。在此情况下,平移按预期工作-平移“右”按预期沿正x轴移动模型。Y也可以工作-平移“向上”沿Y轴正方向移动模式(坐标为负,因此我们只需翻转坐标即可正确操作)。问题总是在z轴上,当模型旋转时,z+轴现在指向右侧,平移“右”时,我接收到负z值,向左平移时,我得到正值,因此看起来坐标像z轴一样翻转。当z+指向屏幕左侧时,会出现相同的逻辑-向左平移为负值,向右平移为正值。到目前为止还不错


当z+现在朝向屏幕顶部时,向上平移为正值,而沿z+平移时,所有其他方向为负值。向下平移会得到负值。所以当z是左/右时,我需要翻转坐标,但是当z是上/下时,如果我这样做,平移是向后的。我所做的就是从平移手势中检索触摸位置,创建一个z=0的
GLKVector3
,然后将当前模型视图矩阵应用于该向量。模型视图矩阵应该应用当前的旋转,所以给定的点,并根据旋转输出相应的点…或者我认为是这样。是否缺少一些逻辑来精确处理z方向的平移?

如果要在摄影机空间中移动(沿摄影机的左向量和上向量),请使用摄影机方向的轴乘以x和y平移值


要在对象空间中进行变换,可以将向量与模型视图矩阵的逆矩阵相乘。(为了精确起见,您可以使用模型视图投影矩阵的逆矩阵,但您应该使用z=近平面而不是0)

基本上我的相机从不移动,它始终聚焦在0、0和近平面上。我想这就是为什么你还要加上第二句,因为这听起来像是我想要完成的。从眼睛坐标取我的平移点,使用z=近平面,然后乘以逆矩阵或模型视图矩阵*投影矩阵?是,这将在你的对象空间中改变它。这将产生相反的效果-z+指向顶部屏幕正确工作,因为z值是负向上平移和正向下平移。当z+运行到屏幕右侧时,z值为+向右平移和负向左平移,因此一组仍按预期平移相反方向。locationVector=GLKmatrix4MultiplyVector 3(GLKMatrix4Multiply(inverseModelViewMatrix,self.projectionMatrix),locationVector);您需要locationVector=MultiplyVector(逆(Multiply(modelViewMatrix,projectionMatrix)),locationVector(使用精确的语法,我不知道您这边的函数名是什么)也尝试过,结果相同。基本上我不知道为什么z+有不同的行为来决定它是否指向屏幕的顶部而不是屏幕的右侧。我想我的旋转矩阵会负责确定这一点。