所以我试图在iPad上使用GLKit绘制和旋转立方体。我的问题是,当立方体旋转时,纵横比似乎随之变化,在旋转时挤压它。我的意思可以在三个图像中看到,其中立方体逆时针旋转90度。虽然在开始时(第一张图像),立方体的比例宽度/高度约为。
我设定的1/2GLKMatrix4 scaleMatrix=GLKMatrix4MakeScale(0.5, 1., 0.3);
因为它变成了“挤压”以在pi / 2转弯之后结束,其中作为基础的一侧(在转弯之前)是高度的两倍(第三图像)。我相信我的错误在于我传递给GLKMatrix4MakePerspective
的论据,但由于我对所有对openGL方法的调用都不太满意,而且每个我做的每一个我也放了一些我认为可以与之相关的代码部分。在图像之后。
- (void)draw{
//just a quaternion that rotates the cube
GLKQuaternion glkq=GLKQuaternionMake(_quat.x,_quat.y,_quat.z,_quat.w);
GLKMatrix4 rotationMatrix=GLKMatrix4MakeWithQuaternion (glkq);
GLKMatrix4 scaleMatrix=GLKMatrix4MakeScale(0.5, 1., 0.3);
GLKMatrix4 translateMatrix = GLKMatrix4MakeTranslation(0.,0.,0.);
GLKMatrix4 modelMatrix =GLKMatrix4Multiply(translateMatrix,
GLKMatrix4Multiply(scaleMatrix,rotationMatrix));
GLKMatrix4 viewMatrix = GLKMatrix4MakeLookAt(0, 0, 5, 0, 0, 0, 0, 1 , 0);
effect.transform.modelviewMatrix = GLKMatrix4Multiply(viewMatrix, modelMatrix);
effect.transform.projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(45.0f), 3./4., 3, -5);
[effect prepareToDraw];
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, 0, triangleVertices);
glEnableVertexAttribArray(GLKVertexAttribColor);
glVertexAttribPointer(GLKVertexAttribColor, 4, GL_FLOAT, GL_FALSE, 0, triangleColors);
glDrawArrays(GL_TRIANGLES, 0, 36);
glDisableVertexAttribArray(GLKVertexAttribPosition);
glDisableVertexAttribArray(GLKVertexAttribColor);
}
我不确定你是否需要代码的其他部分来告诉我这里做错了什么......
答案 0 :(得分:0)
矩阵乘法作为一系列几何变换从右到左工作,不是可交换的。也就是说,给定旋转矩阵R
和比例矩阵S
,产品S x R
表示“按R
旋转,然后按S
缩放”,这是“按S
缩放,然后按R
旋转”(由产品R x S
指定)的结果不同。
旋转后缩放:不是将立方体压成矩形棱镜然后旋转它,而是旋转立方体然后压扁生成的图像。反转scaleMatrix
和rotationMatrix
的乘法,您应该看到预期的结果。
(另外,你的translateMatrix
指定零的转换,所以将它乘以模型视图矩阵什么都不做。但是如果它非零,那么你应该以什么顺序将它乘以你的模型视图矩阵?)