使用Android min3D如何通过触摸围绕一个物体旋转

4
我正在尝试使用触摸屏围绕对象旋转相机。 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个回答

1

我认为这是一个视角问题。尝试基本的Android OpenGL示例“旋转立方体”,我认为它是类似的行为。

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

想象一下,在显示器上向左移动手指1厘米,3D对象跟随手指移动。这意味着x_display = x_object。 如果您旋转对象,则显示和对象之间仍然存在固定连接。 (x_display = - 1cm)等于(x_object = -1cm)
在90°和270°时,您的对象将移动xy反转,在180°时,您的对象将移动x反转。

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

编辑:还有旋转角度(对象)= -旋转角度(相机)


0

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

  1. 最简单的方法是将火箭设置为(0,0,0),而不是移动火箭,移动其他所有东西。好吧,那是一个愚蠢的建议。忘了它。
  2. 另一个解决方案是使用sin()和cos()计算相机旋转轨迹。
  3. 可能有第三种解决方案,但我没有仔细考虑过,也可能是错误的。你需要做的是像目标在(0,0,0)一样移动相机,然后旋转并返回相机。

看起来应该像这样:

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,但不要指望它能完成工作。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接