当前位置: 首页 > 知识库问答 >
问题:

使用ArCore将静态对象放置在屏幕的角落

孔君浩
2023-03-14

我正在开发一个AR导航应用程序,但我对它的AR方面并不太熟悉。是否可以将物体放置在静态位置,例如屏幕的一角?

我的应用程序基于谷歌的场景形式示例:https://github.com/google-ar/sceneform-android-sdk/tree/master/samples/hellosceneform.我已经导入了我想要使用的3D模型。目前,该应用程序正在寻找可以放置对象的锚。我只想在屏幕的一角放置一个导航箭头,箭头应该仍然能够旋转。

我已经搜索了例子或类似的问题,但没有找到任何。谢谢你的帮助。

共有2个答案

宋经业
2023-03-14
if (useStaticArrow) {
            // Rotation at the registerListeners is measured, so that the arrow points to north in our coordinate system

            camera.getPose().compose(Pose.makeTranslation(0.37f, -0.17f, -1f))
                    .extractTranslation().toMatrix(cameraAnchorMatrix, 0);

            // Rotate the arrow in the needed direction to the next target
            Matrix.rotateM(cameraAnchorMatrix, 0, neededStartRotation + directionChange, 0f, 1f, 0f);

            virtualObject.updateModelMatrix(cameraAnchorMatrix, scaleFactor / 12f);
            virtualObject.draw(viewmtx, projmtx, colorCorrectionRgba, arrowColor);
} 

(Renjith的完整代码段)

闾丘永春
2023-03-14

使三维模型成为摄影机节点的子节点,通过使其成为摄影机节点的子节点,可以强制其位置相对于摄影机而非锚点更新。使用局部旋转来旋转模型。

[更新]

你也可以使用场景表单作为应用程序布局的一部分。xml。在布局中。xml对于视图,添加场景视图作为视图布局的一部分。

<com.google.ar.sceneform.SceneView
        android:id="@+id/sceneView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorPrimary"
/>

然后在你的MainActivity.java

import android.net.Uri
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.widget.Toast
import com.google.ar.sceneform.Node
import com.google.ar.sceneform.Scene
import com.google.ar.sceneform.math.Vector3
import com.google.ar.sceneform.rendering.ModelRenderable
import kotlinx.android.synthetic.main.act_main.*

class MainActivity : AppCompatActivity() {

    private lateinit var scene: Scene
    private lateinit var node: Node

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.act_main)

        scene = sceneView.scene
        render(Uri.parse("coffee_cup.sfb"))
    }

    private fun render(uri: Uri) {
        ModelRenderable.builder()
            .setSource(this, uri)
            .build()
            .thenAccept {
                addNode(it)
            }
            .exceptionally {
                Toast.makeText(this, "Error", Toast.LENGTH_SHORT).show()
                return@exceptionally null
            }

    }

    private fun addNode(model: ModelRenderable?) {
        model?.let {
            node = Node().apply {
                setParent(scene)
                localPosition = Vector3(0f, -2f, -7f)
                localScale = Vector3(3f, 3f, 3f)
                renderable = it
            }

            scene.addChild(node)
        }
    }

    override fun onPause() {
        super.onPause()
        sceneView.pause()
    }

    override fun onResume() {
        super.onResume()
        sceneView.resume()
    }
}
 类似资料:
  • 我正在使用ArCore为Android构建一个简单的导航应用程序(Java)。我开始在Google(https://github.com/google-ar/sceneform-android-sdk/tree/master/samples/hellosceneform)的场景表单演示上构建我的应用程序。 目前,该应用程序正在扫描环境中的锚点。用户可以通过点击锚点将对象放置在锚点上。是否可以使用这

  • 我正在尝试使用ARCore在屏幕上不点击的情况下显示对象。在Google提供的ARCore Sceneform的基本示例中,您需要在屏幕检测到表面后点击屏幕。 我想实现这一点,AR在不点击屏幕的情况下显示对象。 我试着在不点击屏幕的情况下进行显示。 如果有人知道怎么做,请帮助我。提前感谢

  • 问题内容: 选项1:无Javascript 我只想显示一个 静态 模板,该模板在任务运行时显示“请稍候…”。这是route函数的简化版本: 它不会让我不返回使用,从而跳过了我需要完成的处理。我需要它在进程运行 时 显示进度屏幕 , 然后在完成时显示“成功”。我该怎么做呢? 选项2:JavaScript 如果无法做到这一点, 必须 使用Javascript ,那么到目前为止,这是我尝试过的: htm

  • 问题内容: 如何使用jQuery在屏幕中央设置a ? 问题答案: 我喜欢向jQuery添加功能,因此该功能将有所帮助: 现在我们可以这样写:

  • 我有其他一切正确,但由于某种原因,这给我带来了问题。我想实现一个名为填充()的方法。我想在构造函数中被调用。我希望它的方法创建每种类型的对象的随机数量。这是我的代码。我的错误是“*强文本*构造函数在类中淡黄色不能是给定类型的。必需:int 找到:不是参数原因:实际和表单参数列表的长度不同。

  • 在 一到三个 。有没有办法在后始终将单元格放置在屏幕底部?