因此,我试图使用GLKit在iPad上绘制和旋转一个立方体。我的问题是,当立方体旋转时,它似乎随着长宽比的变化而旋转,当它旋转时挤压它。我的意思是,在接下来的三张图片中可以看到立方体逆时针旋转90度。虽然在开始(第一张图像),比宽度/高度的立方体是大约。1/2我已经设定了
GLKMatrix4 scaleMatrix=GLKMatrix4MakeScale(0.5, 1., 0.3);当它变成“挤压”结束后,π/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);
}我不确定你是否需要代码的其他部分来告诉我我在这里做错了什么.
发布于 2013-10-01 21:54:28
矩阵乘法作为一系列的几何变换,从右到左工作,是不可交换的。即,给定一个旋转矩阵R和标度矩阵S,乘积S x R的意思是“按R旋转,然后由S缩放”,这与“S缩放,然后由R旋转”(如乘积R x S)的结果不同。
旋转后缩放:不是将一个立方体挤压成一个矩形棱镜,然后旋转它,而是旋转一个立方体,然后挤压产生的图像。逆转scaleMatrix和rotationMatrix的乘法,您就会看到预期的结果。
(而且,您的translateMatrix指定了零的转换,因此将其乘以模型视图矩阵没有任何作用。如果它是非零,那么你应该把它按什么顺序乘成模型视图矩阵?)
https://stackoverflow.com/questions/19103571
复制相似问题