使用min3d / Rajawali框架(android)在3d对象上旋转

时间:2012-08-04 18:28:54

标签: android rotation touch rajawali

我正在研究一种使用Min3d / Rajawali框架围绕3D物体旋转相机的算法。

通过我的实现,围绕X轴的旋转无法正常工作。我认为方法setLookAt()无法正常工作。

问题:

当我垂直旋转球体时,我无法完全看到它。例如,转动地球,我无法完全看到南极,因为算法会重置相机。

是否可以在不使用“setLookAt”方法的情况下实现相机围绕物体旋转?

我尝试了不同的解决方案,但未能使其正常工作。

以下是我的代码:

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;
    }

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 :(得分:6)

有点晚了,但万一有人遇到麻烦,就像我一样。

Rajawali提供了一个名为ArcballCamera的相机,它完全符合您/我们的目标。

在渲染器中添加以下内容:

 ArcballCamera arcball = new ArcballCamera(mContext, ((Activity)mContext).findViewById(R.id.contentView)); 
 arcball.setTarget(mObjectGroup); //your 3D Object

 arcball.setPosition(0,0,4); //optional

 getCurrentScene().replaceAndSwitchCamera(getCurrentCamera(), arcball);

现在您可以在没有十几行代码的情况下旋转和缩放对象。

答案 1 :(得分:0)

如果您希望相机定期更新,则需要在onDrawFrame上调用setLookAt()。但是你需要更多关注创建“RotateAroundAnimation”。有关详细信息,请参阅此处:http://www.rozengain.com/blog/2012/03/26/rajawali-tutorial-12-animation-classes/

您必须制作yourAnimation.setTransformable3D(mCamera),然后才能控制您的主摄像头。我经常使用这种方法,然后在触摸或其他外部刺激时调用“yourAnimation.start()”。

答案 2 :(得分:0)

这是我根据x和y

旋转3d模型的方法

在渲染类

public boolean left, right;
public boolean up, down;

和onDrawFrame

@Override
public void onDrawFrame(GL10 glUnused) {
    super.onDrawFrame(glUnused);
    // getCurrentCamera().setRotY(getCurrentCamera().getRotY() + 1);
    if (left) {
        getCurrentCamera().setRotX(getCurrentCamera().getRotX() - 1);
    }
    if (right) {
        getCurrentCamera().setRotX(getCurrentCamera().getRotX() + 1);
    }
    if (up) {
        getCurrentCamera().setRotY(getCurrentCamera().getRotY() - 1);
    }
    if (down) {
        getCurrentCamera().setRotY(getCurrentCamera().getRotY() + 1);
    }
}

并在MainActivity中

@Override
public boolean onTouchEvent(MotionEvent event) {

    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        xpos = event.getX();
        ypos = event.getY();
    }

    if (event.getAction() == MotionEvent.ACTION_UP) {
        xpos = -1;
        ypos = -1;
        mRender.left = false;
        mRender.right = false;
        mRender.up = false;
        mRender.down = false;

    }

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

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

        if (xd < 0) {
            mRender.up = true;
        } else {
            mRender.down = true;
        }
        if (yd < 0) {
            mRender.left = true;
        } else {
            mRender.right = true;
        }

    }

    return super.onTouchEvent(event);
}
通过这种方式,我可以旋转我的模型:)