我正在尝试使用触摸屏围绕对象旋转相机。围绕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;
}
答案 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的方法。它不知道目标,所以我猜旋转是根据中心完成的,而不是根据火箭(没有完全检查,只是一个猜测)。可能有两种解决方案:
看起来像这样:
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但不要依赖它就能完成这项工作。