0

所以我试图在 iPad 上使用 GLKit 绘制和旋转立方体。我的问题是,当立方体旋转时,它似乎随着纵横比的变化而变化,在它旋转时挤压它。我的意思可以在后面的三个图像中看到,立方体逆时针旋转 90 度。尽管在开始时(第一张图片),立方体的宽度/高度比约为。我设定的 1/2

GLKMatrix4 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);
}

我不确定您是否可能需要代码的其他部分来告诉我我在这里做错了什么......

4

1 回答 1

0

矩阵乘法作为一系列几何变换从右到左工作并且不可交换。也就是说,给定一个旋转矩阵R和缩放矩阵S,乘积的S x R意思是“先旋转R再缩放S”,这与“先缩放S再旋转R”的结果不同(由乘积给出R x S)。

旋转后进行缩放:不是将立方体挤压成矩形棱柱然后旋转它,而是旋转立方体然后挤压生成的图像。反转和的乘法,scaleMatrixrotationMatrix应该会看到预期的结果。

(此外,您translateMatrix指定了零的平移,因此将其乘以模型视图矩阵没有任何作用。但是,如果它不是零,您应该以什么顺序将其乘以模型视图矩阵?)

于 2013-10-01T21:54:28.377 回答