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移动精灵时,精灵确实会按预期移动。旋转中心让我感到困惑。