我有一个问题,我无法理解。
我使用球体,当用户触摸球体上的任何位置时,我会在opengl坐标中得到一个3D矢量(x,y,z)形式的点。
我在球体上也有一个定义的点,也是一个3D矢量。
例如:
real V x:-0.2881811,y:0.25460157,z:0.9231087
其中“真实V”是定义为开头的点。 (球体的读数为1.0)
在使用gl.glRotatef旋转球体后,我想用OpenGL坐标“真实V”来确定新点。
通过这样做我使用这样的东西:
real.rotate(-model.getRotationX(), 1f, 0f, 0);
real.rotate(-model.getRotationY(), 0f, 1f, 0);
其中“getRotationX和Y是球体的总旋转(我知道是正确的)。
和真实。旋转看起来像这样:
public Vector3 rotate(float angle, float axisX, float axisY, float axisZ)
{
inVec[0] = x;
inVec[1] = y;
inVec[2] = z;
inVec[3] = 1;
Matrix.setIdentityM(matrix, 0);
Matrix.rotateM(matrix, 0, angle, axisX, axisY, axisZ);
Matrix.multiplyMV(outVec, 0, matrix, 0, inVec, 0);
x = outVec[0];
y = outVec[1];
z = outVec[2];
return this;
}
当这样做并且通过将spehere的原始向量添加到“真(V)”向量来翻译向量“real(V)”时,我相信我会在spehere上获得正确的新点,我将能够例如,在。
设置一个标志或类似物问题是在向量旋转后某些事情没有正确。
如果我不旋转球体从而不旋转矢量,一切都成为我想要的方式。但是当我旋转它时,旋转越多,我就越来自正确的点。
以下是LogCat的概要:
real V x:-0.2881811,y:0.25460157,z:0.9231087
旋转V x:0.10823092,y:0.79800075,z:0.5928582
添加V x:0.10823092,y:0.79800075,z:-3.4071417
减去V x:0.10823092,y:0.79800075,z:0.5928583
backRotated V x:-0.5257477,y:0.21287462,z:0.8235738
正如你可以看到的那样,当反向旋转时,由于某种原因,它与原版不同。
Vector3 real = Result.getRealVector(location);
Log.d(TAG, "real V "+ real.toString());
real.rotate(-model.getRotationX(), 1f, 0f, 0);
real.rotate(-model.getRotationY(), 0f, 1f, 0);
Log.d(TAG, "rotated V " + real.toString());
real.add(model);
Log.d(TAG, "added V " + real.toString());
real.sub(model);
Log.d(TAG, "subtracted V " + real.toString());
real.rotate(model.getRotationX(), 1f, 0f, 0f);
real.rotate(model.getRotationY(), 0f, 1f, 0f);
Log.d(TAG, "backRotated V " + real.toString());
不是那么远,关键点总是在它应该的位置附近,但仍然......
我知道可能很难理解我的问题,有点难以解释。 我所希望的是有人看到任何明显的问题。
答案 0 :(得分:4)
使用矩阵运算顺序非常重要。如果围绕每个轴单独旋转,为了撤消这些操作,您需要以相反的顺序执行逆操作以恢复原始矢量。
real.rotate(-model.getRotationX(), 1f, 0f, 0f);
real.rotate(-model.getRotationY(), 0f, 1f, 0f);
...
real.rotate(model.getRotationY(), 0f, 1f, 0f);
real.rotate(model.getRotationX(), 1f, 0f, 0f);
以数学方式说: (其中A和B是矩阵,A-1和B-1都有相应的逆矩阵,I是单位矩阵)
A * B * B-1 * A-1 == I
然而
A * B * A-1 * B-1!= I
如果您还没有线性代数,我建议稍微研究一下,因为在进行图形编程时,良好的基本理解非常有用。