Android min3D使用触摸旋转对象

时间:2012-01-03 15:15:10

标签: java android opengl-es

我正在尝试使用触摸屏围绕对象旋转相机。围绕Y轴的旋转工作正常(X轴被禁用)。绕X轴旋转真的很奇怪。当对象(它的火箭)变得更高rocket.position().y++ & scene.camera().position.y++时,围绕x轴的旋转变得更大和奇怪。如果火箭停止rocket.position().y = 500; & scene.camera().position.y = 500;,我无法围绕x轴旋转,而是放大或缩小对象。两个轴都启用了它的怪异。

initScene中,我将相机设置为观察火箭的中心。

这是我的代码:

initScene:
    scene.camera().position.z = 90;
    scene.camera().target = raketeOBJ.position();

onTouchEvent:
    public boolean onTouchEvent(MotionEvent me) {
     if (me.getAction() == MotionEvent.ACTION_DOWN) {
        xpos = me.getX();
        ypos = me.getY();
        return true;
    }

    if (me.getAction() == MotionEvent.ACTION_UP) {
        xpos = -1;
        ypos = -1;
        touchTurn = 0;
        touchTurnUp = 0;
        return true;
    }

    if (me.getAction() == MotionEvent.ACTION_MOVE) {
        float xd = me.getX() - xpos;
        float yd = me.getY() - ypos;

        xpos = me.getX();
        ypos = me.getY();

        touchTurn = xd / -200f;
        touchTurnUp = yd / -200f;
        return true;
    }

    try {
        Thread.sleep(15);
    } catch (Exception e) {

    }

    return super.onTouchEvent(me);
}

UpdateScene:

    if (touchTurn != 0) {
        scene.camera().position.rotateY(touchTurn);
        touchTurn = 0;
    }

    if (touchTurnUp != 0) {
        scene.camera().position.rotateX(touchTurnUp);
        touchTurnUp = 0;
    }

3 个答案:

答案 0 :(得分:1)

我认为这是一个以观点为导向的问题。尝试基本的android opengl示例“旋转立方体”,我认为这是一种类似的行为。

要避免这种情况,您必须将显示坐标转换为min3D对象旋转坐标。

考虑将手指向左移动1厘米左右,用手指按住3D对象。这意味着x_display = x_object。 如果旋转对象,则显示和对象之间仍然存在固定连接。 (x_display = - 1cm)等于(x_object = -1cm)
在90°和270°您的物体将以xy反转方式移动,在180°时,您的物体将向x方向移动。

使用一些sin / cos来克服这个问题。

编辑:还是rotationangle(对象)= - rotationangle(相机)

答案 1 :(得分:0)

一种选择是旋转容器本身而不是相机。在min3d中,您经常使用Object3dContainer作为显示模型的活动中的类变量。获取MotionEvent后,可以使用Object3dContainer类中的rotation()方法,并根据需要设置x或y属性。

答案 2 :(得分:0)

你一直说得很奇怪,但你知道它并没有描述你所看到的。 Rotate实际上是Number3d的方法。它不知道目标,所以我猜旋转是根据中心完成的,而不是根据火箭(没有完全检查,只是一个猜测)。可能有两种解决方案:

  1. 最简单的方法是将火箭设置为(0,0,0),然后移动火箭,移动其他东西。那将是一个愚蠢的建议。算了吧。
  2. 另一个解决方案是使用sin()和cos()
  3. 计算相机旋转轨迹
  4. 可能有第三种解决方案,但我对它没有太多考虑,而且可能是错误的。你需要做的就是移动相机,就像目标位于(0,0,0),旋转然后返回相机。
  5. 看起来像这样:

    Number3d target = scene.camera.target;
    Number3d cp = scene.camera.position.clone();
    // move position like target is (0,0,0)
    cp.x -= target.x;
    cp.y -= target.y;
    cp.z -= target.z;
    
    cp.roateX(angle);
    
    // restore offset
    cp.x += target.x;
    cp.y += target.y;
    cp.z += target.z;
    scene.camera.position.setAllFrom(cp);
    

    你可以尝试3但不要依赖它就能完成这项工作。