我正在研究一种使用Min3d / Rajawali框架围绕3D物体旋转相机的算法 .
在我的实现中,绕X轴的旋转不能正常工作 . 我认为方法 setLookAt()
无法正常工作 .
The problem:
当我垂直旋转球体时,我无法完全看到它 . 例如,转动地球,我无法完全看到南极,因为算法会重置相机 .
是否可以在不使用“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 回答
有点晚,但万一有人遇到麻烦,像我一样 .
Rajawali提供了一款名为ArcballCamera的相机,它完全符合您/我们的目标 .
在您的渲染器中添加以下内容:
现在,您可以旋转和缩放对象,而无需十几行代码 .
如果您希望相机定期更新,则需要在setDookFt上调用setLookAt() . 但是你需要更多关心创建一个"RotateAroundAnimation" . 有关详细信息,请参阅此处:http://www.rozengain.com/blog/2012/03/26/rajawali-tutorial-12-animation-classes/
你必须制作yourAnimation.setTransformable3D(mCamera),然后才能控制你的主摄像头 . 我经常使用这种方法,然后在触摸或其他外部刺激时调用“yourAnimation.start()” .
这是我按照x和y旋转3d模型的方法
在Render类中
并在onDrawFrame中
并在MainActivity中
通过这种方式,我可以旋转我的模型:)