我目前正在尝试在Android中对OpenGL ES 2中的建筑进行可视化。 当我向左滑动时,整个场景应该向左移动(与右,底部和顶部相同)。现在,当我将模型旋转90°时,轴将被交换。当我向右滑动时,模型移动到顶部而不是右边(与另一个轴相同)。
如何在没有当前场景旋转问题的情况下翻译相机?当我正在使用手机时,我总是希望将物体移动到我正在滑动的方向。当我首先调用translate时,翻译工作正常,但旋转有一些错误。
更新:我创建了大部分相机类(建议在答案中):
private Vector3D c = new Vector3D(eye); // copy of eye
private Vector3D l = Vector3D.getNormalized
(Vector3D.subtract(center, eye)); // normalized center-eye
private Vector3D u = new Vector3D(up); // up (normalized)
public void rotateX(float angle) {
// Now you can rotate L vector left and
// right by rotating it around U by any angle. ??
}
public void rotateY(float angle) {
// If you also need to look up and down
// (rotate) you need to rotate both L and U around S ??
}
public void rotateZ(float angle) {
// to tilt left and right you need to rotate U around L. ??
}
// move left and right
// C = C+S * inputfactor
public void translateX(float inputFactor) {
Vector3D s = Vector3D.cross(l, u);
Vector3D sTimesInput = mul(s, inputFactor);
c = new Vector3D(c).add(sTimesInput);
}
// move forward and backward
// C = C+L*inputfactor
public void translateY(float inputFactor) {
Vector3D lTimesInput = mul(l, inputFactor);
c = new Vector3D(c).add(lTimesInput);
}
// move up and down
// C = C+U * inputfactor
public void translateZ(float inputFactor) {
Vector3D uTimesInput = mul(u, inputFactor);
c = new Vector3D(c).add(uTimesInput);
}
// reconstruct lookAt - eye,center,up
public Vector3D getEye() {
return new Vector3D(c);
}
public Vector3D getCenter() {
return new Vector3D(c).add(new Vector3D(l));
}
public Vector3D getUp() {
return new Vector3D(u);
}
public float[] createLookAt() {
Vector3D eye = getEye();
Vector3D center = getCenter();
Vector3D up = getUp();
return new float[] { eye.getX(), eye.getY(), eye.getZ(), center.getX(),
center.getY(), center.getZ(), up.getX(), up.getY(), up.getZ() };
}
// helper-function
public Vector3D mul(Vector3D vec, float factor) {
return new Vector3D(vec.getX() * factor, vec.getY() * factor,
vec.getZ() * factor);
}
如何围绕另一个矢量旋转矢量一个角度?
答案 0 :(得分:2)
如果您定义相机基矢量C
- 中心,L
- 请查看,U
- 向上,C
是相机中心,L
是从中心到您正在查看的点的归一化向量,U
是向上标准化的。现在,您可以围绕L
以任意角度旋转U
向量左右旋转。S
向量
至于左右移动,你必须重建侧向量C = C+S*inputFactor
:L和U之间的叉积(S = LxU)。现在你所要做的就是移动中心:lookAt
。
重建eye = C
center = C+L
up = U
向量:
L
就像一张纸条:如果你还需要向上和向下看(旋转),你需要在U
周围同时旋转S
和U
,向左和向右倾斜你需要围绕L
轮播C = C+L*inputFactor
。向前或向后移动C = C+U*inputFactor
并向上和向下移动{{1}}。
这应解决所有逻辑相机移动和旋转。
答案 1 :(得分:1)
我认为你混合了移动相机和旋转物体的概念。首先,您需要将旋转对象的动作与任何与相机的交互分开。您应该可以对对象执行任何操作而无需更改相机。要做到这一点,只需使用模型矩阵来描述对象的平移/旋转/缩放。然后使用Matrix.setLookAtM和eyeX,eyeY,eyeZ分别处理相机,eyeZ与您的模型位置无关。在你的情况下看一下这一点依赖于eyeX,eyeY,eyeZ,因为你想要一直看着同一个方向。
例如,如果要围绕Y轴旋转对象90度,请使用:
Matrix.rotateM(mModelMatrix, 0, 90, 0.0f, 1.0f, 0.0f);
还要记住,Matrix.setIdentityM之后的所有矩阵运算都将以向后的顺序完成,即如果先旋转然后翻译,就像在代码中执行第一项操作一样,您将首先将对象转换为远离其原点位置,然后围绕原点旋转,使您的对象围绕第一个原点进行旋转,而不是对象的中心。
然后我们假设您已将相机100个单位向左翻译并查看-Z方向,请使用:
Matrix.setLookAtM(mViewMatrix, offset, -100.0f+camX, camY, camZ, -100.0f+camX, camY, -1.0f+camZ, upX, upY, upZ);