【问题标题】:Rotation around 3d object on touch using min3d/Rajawali framework (android)使用 min3d/Rajawali 框架 (android) 在触摸时围绕 3d 对象旋转
【发布时间】:2015-12-17 23:37:51
【问题描述】:

我正在研究一种使用 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);

【问题讨论】:

  • 此堆栈交换是针对特定问题的。这个问题太笼统了。请向我们展示您的尝试以及遇到的问题。那么这里的人可以帮助你。谢谢
  • 我试图实现相机围绕球体的旋转。问题是围绕 X 轴的旋转不能正常工作。我使用了这段代码:pastebin.com/g9pLa61M 我认为 setLookAt() 方法不能正常工作。
  • 当我垂直旋转球体时,我无法完全看到它。例如,转动地球,我无法完全看到南极,因为算法会将相机重置。请告诉我,是否可以不使用“setLookAt”方法实现相机绕物体旋转?

标签: android rotation touch rajawali


【解决方案1】:

有点晚了,但万一有人遇到麻烦,比如我。

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

现在您无需十几行代码即可旋转和缩放对象。

【讨论】:

  • 我们如何设置 ArcballCamera 相对于 3D 对象的位置。目前我必须随着 3D 对象大小的变化而改变相机位置。
【解决方案2】:

如果您希望相机定期更新,则需要调用 setLookAt()。但是您需要更关心创建“RotateAroundAnimation”。更多信息请看这里:http://www.rozengain.com/blog/2012/03/26/rajawali-tutorial-12-animation-classes/

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

【讨论】:

    【解决方案3】:

    这是我根据 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);
    }
    

    通过这种方式,我可以旋转我的模型:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 2021-09-13
      • 1970-01-01
      相关资源
      最近更新 更多