android - 使用 min3d/Rajawali 框架(android)在触摸时围绕 3d 对象旋转

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

最佳答案

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

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

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

关于android - 使用 min3d/Rajawali 框架(android)在触摸时围绕 3d 对象旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11811059/

相关文章:

android - 可以获取 Picasa 供稿,可以上传和下载 - 不能删除

css - 与容器左侧对齐,元素旋转 -90 度

javascript - iOS Touch 事件在 DOM 插入时传递

android - 在测量 Activity 布局但未在屏幕上绘制后执行某些操作

Android滑出动画,剩余空间由其他 View 填充

android - 为什么 Room 显示 AppDatabase_Impl 不存在错误?

ios - 使用ffmpeg转换时视频向左旋转90度

c# - Helix toolkit 旋转 3D 模型

ios - 如何在 iOS 上用用户手指平滑 move UIView

android - 触摸事件的 webkitForce 属性 : Finger Pressure feedback. 寻找文档