使用min3d/Rajawali框架(android)在触摸屏上围绕3d对象旋转
我正在研究使用Min3d/Rajawali框架围绕3D对象旋转相机的算法 在我的实现中,围绕X轴的旋转无法正常工作。我认为方法使用min3d/Rajawali框架(android)在触摸屏上围绕3d对象旋转,android,rotation,touch,rajawali,Android,Rotation,Touch,Rajawali,我正在研究使用Min3d/Rajawali框架围绕3D对象旋转相机的算法 在我的实现中,围绕X轴的旋转无法正常工作。我认为方法setLookAt()工作不正常 问题: 当我垂直旋转球体时,我无法完全看到它。例如,转动地球时,我无法完全看到南极,因为算法会重置相机 是否可以在不使用“setLookAt”方法的情况下实现相机围绕对象旋转 我尝试了不同的解决方案,但未能使其正常工作 下面是我的代码: initScene: scene.camera().position.z = 90;
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);
如果希望相机定期更新,则需要调用onDrawFrame setLookAt()。但您需要更加关注创建“RotateAroundAnimation”。有关更多信息,请参见此处:
你必须制作你的Animation.setTransformable3D(mCamera),然后它才能控制你的主摄像机。我经常使用这种方法,然后在触摸时调用“yourAnimation.start()”或其他外部刺激。这是我根据x和y旋转3d模型的方法 在渲染类中
public boolean left, right;
public boolean up, down;
在一个框架里
@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);
}
}
在主要活动中
@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);
}
@覆盖
公共布尔onTouchEvent(运动事件){
if(event.getAction()==MotionEvent.ACTION\u向下){
xpos=event.getX();
ypos=event.getY();
}
if(event.getAction()==MotionEvent.ACTION\u UP){
xpos=-1;
ypos=-1;
mRender.left=false;
mRender.right=false;
mRender.up=false;
mRender.down=false;
}
if(event.getAction()==MotionEvent.ACTION\u MOVE){
xd=event.getX()-xpos;
yd=event.getY()-ypos;
xpos=event.getX();
ypos=event.getY();
if(xd<0){
mRender.up=true;
}否则{
mRender.down=true;
}
if(yd<0){
mRender.left=true;
}否则{
mRender.right=true;
}
}
返回super.onTouchEvent(事件);
}
通过这种方式,我可以将我的模型旋转:)稍微晚一点,但以防像我这样的人遇到麻烦 Rajawali提供了一款名为的摄像头,它完全符合您/我们的要求 在渲染器中添加以下内容:
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);
现在,您可以旋转和缩放对象,而无需十几行代码。此堆栈交换用于特定问题。这个问题太宽泛了。请告诉我们您尝试了什么,遇到了什么问题。那么这里的人可以帮助你。ThanksI试图实现相机围绕球体旋转。问题是绕X轴旋转无法正常工作。我使用了以下代码:我认为setLookAt()方法工作不正常。当我垂直旋转球体时,我无法完全看到它。例如,转动地球时,我无法完全看到南极,因为算法会重置相机。请告诉我,在不使用“setLookAt”方法的情况下,是否可以实现摄像机围绕对象旋转?我们如何设置ArcballCamera相对于3D对象的位置。目前,我必须改变相机的位置作为三维对象的大小变化。