【问题标题】:Scale matrix in place就地缩放矩阵
【发布时间】:2015-03-19 22:17:47
【问题描述】:

目前我正在像这样缩放矩阵:

public void scale(float aw, float ah){
    Matrix.scaleM(modelMatrix, 0, aw, ah, 1f);
    updateMVP();
}

private void updateMVP(){
    Matrix.multiplyMM(mvpMatrix, 0, projectionMatrix, 0, modelMatrix, 0);
}

并在我的顶点着色器中使用:gl_Position = u_Matrix * a_Position;u_MatrixmvpMatrix。我使用的摄像头是默认摄像头,projectionMatrix 由以下人员创建:

ASPECT_RATIO = (float) height / (float) width;
orthoM(projectionMatrix, 0, -1f, 1f, -ASPECT_RATIO, ASPECT_RATIO, -1f, 1f);

现在我可以正确缩放我的对象,但唯一的问题是每次缩放矩阵时,对象都会移动一点。我想知道如何在保持中心点而不让对象平移的情况下缩放矩阵。任何人都知道我如何在 Android 上的 OpenGL ES 2.0 中做到这一点?谢谢

【问题讨论】:

  • 从显示的代码中我只能猜测:您是否将平移、旋转和缩放的矩阵分开?如果没有,您只能缩放已经转换的对象/矩阵
  • 目前我只有modelMatrix,我先翻译然后多次缩放
  • 缩放是相对于原点的。您通常首先缩放(相对于对象的空间)然后平移。如果要更改缩放比例,则需要新建一个modelMatrix,而不是乘以当前的,然后再次应用所有内容。
  • 我只翻译一次,我希望对象原点在哪里
  • @Felk 即使我将模型矩阵设置为恒等然后缩放,对象仍然会平移

标签: java android matrix opengl-es scale


【解决方案1】:

您还有其他矩阵(旋转/平移)吗?

如果是这样:您的矩阵可能没有以正确的顺序相乘,这可能会导致问题。

(正确的顺序从右到左相乘) 平移 * 旋转 * 缩放

您的错误听起来像这里解释的错误:

您将船平移 (10,0,0)。它的中心现在在原点的 10 个单位处。 你将你的船缩放 2。每个坐标都相对于距离很远的原点乘以 2……所以你最终会得到一个大的 船,但以 2*10 = 20 为中心。这是你不想要的。

http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/

【讨论】:

  • 所以你告诉我我需要重置我的模型矩阵,缩放它,旋转它然后每次我需要缩放它时平移它?
  • 还是说我每次运算需要三个矩阵,然后相乘得到模型矩阵?
  • 缩放需要在原点才能正常工作,所以是的,您必须重新进行转换计算。我不认为旋转会干扰缩放,但我不是 100% 确定。如果您想在一个计算中完成所有操作,您可以将所有矩阵组合在一起,但它们仍然必须按正确的顺序排列。
  • 你的意思是“翻译”,你说“转换”?所有缩放、旋转和平移都是变换的类型。此外,这看起来是向后的。使用这种乘法顺序,最后应用缩放。至少如果你从右边乘以向量,这是迄今为止最常见的顺序。
  • 是的,我的意思是翻译。我把这两个弄混了,我想我是从左到右输入的,因为在网站上它的顺序是正确的,但在它下面说“!!!当心!!!这行实际上首先执行缩放,然后旋转,然后是平移。这就是矩阵乘法的工作原理。”,所以我一定是按照我阅读的方式输入的。我会解决的。
猜你喜欢
  • 1970-01-01
  • 2012-03-02
  • 2017-05-08
  • 1970-01-01
  • 2021-02-18
  • 2013-05-09
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多