使用Node.setLookDirection旋转ARCore ModelRenderable时出现问题

时间:2019-06-19 03:12:12

标签: rotation local arcore

ARCore ModelRenderable构建器是否移动它加载的OBJ模型的本地原点?

在ARCore中,我想旋转一个精灵,使其始终面对镜头。我正在使用ModelRenderable加载obj文件。我将ModelRenderable附加到附加到世界上的Anchor的Node上。一切加载并呈现良好,除了我调用Node.setLookDirection()时,精灵围绕其底边中心的一个点旋转,而不是围绕其所有顶点的(0,0)旋转。我可以使用setLocalPosition移动节点,但旋转点始终位于精灵的底部中心。这使我相信问题出在ModelRenderable,而不是Node.setLookDirection()。任何评论表示赞赏。

这是OBJ文件:

# File: Sprite.obj

mtllib Yel.mtl

#
# object Sprite
#
#   -1,1         1,1
#       v2     v1
#
#           +
#
#       v4     v3
#   -1,-1        1,-1
#

v   0.25  0.25 0.0
v  -0.25  0.25 0.0
v   0.25 -0.25 0.0
v  -0.25 -0.25 0.0
# 4 vertices

# temporary test:
#v   0.25 -1.00 0.0
#v  -0.25 -1.00 0.0
#v   0.25 -1.50 0.0
#v  -0.25 -1.50 0.0

vt 1.0 1.0 0.0
vt 0.0 1.0 0.0
vt 1.0 0.0 0.0
vt 0.0 0.0 0.0
# 4 texture coords

o Sprite
g Sprite
usemtl Yel
f 1/1 2/2 3/3
f 3/3 2/2 4/4
# 2 faces

以下是要加载和旋转的代码(摘要):

ModelRenderable oSprite;
Node oSpriteNode;


protected void onCreate(Bundle savedInstanceState) {
  ArFragment arFragment = (ArFragment)getSupportFragmentManager().findFragmentById(R.id.RENDER_SCRN);
  arFragment.getArSceneView().getScene().addOnUpdateListener(this);
  arFragment.getArSceneView().getScene().addOnUpdateListener(arFragment);

  // Load the sprite model

  ModelRenderable.builder()
                 .setSource(this, Uri.parse("Sprite.sfb"))
                 .build()
                 .thenAccept(renderable -> oSprite = renderable)
                 .exceptionally(throwable -> {
                     Toast toast = Toast.makeText(this, "Unable to load sprite renderable", Toast.LENGTH_LONG);
                     toast.setGravity(Gravity.CENTER, 0, 0);
                     toast.show();
                     return null;
                 });

  // Anchor the sprite in the world

  arFragment.setOnTapArPlaneListener(
    (HitResult hitresult, Plane plane, MotionEvent motionevent) -> {
      Anchor anchor = hitresult.createAnchor();
      AnchorNode anchorNode = new AnchorNode(anchor);
      anchorNode.setParent(arFragment.getArSceneView().getScene());

      oSpriteNode = new Node();
      oSpriteNode.setParent(anchorNode);
      oSpriteNode.setRenderable(oSprite);

//MOVE      Vector3 vSpriteCtr = new Vector3(0, 1, 0);
//MOVE      oCloudOrigin.setLocalPosition(vSpriteCtr);
      Log.i(TAG, "OnTapArPlaneListener: Dropping a new sprite at " + oSpriteNode.getWorldPosition());
    }
  );
}


public void onUpdate(FrameTime oFrameTime) {

  // Update the sprite rotation

  Frame frame = arFragment.getArSceneView().getArFrame();
  Camera cam = frame.getCamera();
  Pose pose = cam.getDisplayOrientedPose();
  float[] afPos = pose.getTranslation();
  Vector3 vEye = new Vector3(afPos[0], afPos[1], afPos[2]);

  Vector3 vSpritePos = new Vector3();
  vSpritePos.x = oSpriteNode.getWorldPosition().x;
  vSpritePos.y = oSpriteNode.getWorldPosition().y;
  vSpritePos.z = oSpriteNode.getWorldPosition().z;

  // Rotate the sprite to face the AR camera.

  Vector3 vLook = Vector3.subtract(vSpritePos, vEye);  // From camera to sprite
  Vector3 vUp = Vector3.up();
  oSpriteNode.setLookDirection(vLook, vUp);
}

上面的代码不会单独运行,但是我相信我已经包含了所有相关内容。给定模型,我希望子图形绕其中心旋转。相反,仿佛原点已移动到底部边缘的中心,并且绕其局部X轴旋转,就像在水平面上垂直站立的扑克牌一样。绕Y旋转的效果符合预期。将OBJ文件中的顶点Y值偏移较大的数字(请参见注释掉的顶点)完全没有区别。

我缺少明显的东西吗?某处是否有一个标语,上面写着“是的,我真的想定义自己的出生地”?

我要重申的是,当我使用setLocalPosition移动精灵时,精灵确实会按预期移动。旋转中心让我感到困惑。

0 个答案:

没有答案