首页 > 解决方案 > 除非我的设备的位置和方向,否则我如何在相机前生成一个对象?

问题描述

我正在使用 ARfoundation 创建一个 AR 游戏,玩家可以在其中向任何方向滑动球。

我遇到的问题是,当第一次生成球时,所有其他生成的球都会加载到与第一个球相同的位置,无论我用相机瞄准的方向。

无论我手机摄像头的位置、位置和方向如何,我都希望它始终在摄像头前生成。尝试使用标签来获取相机的位置以及需要将球扔进的杯子,但无论位置如何,球都不会被加载到相机前面。我想这不是实现这一目标的正确方法,我想知道是什么?

我用于在某个位置生成球的代码

[SerializeField]
GameObject ball;

public float distanceX;
public float distanceY;
public float distanceZ;

public float ballX;
public float ballY;
public float ballZ;

public void Spawn()
{
    distanceX = GameObject.FindGameObjectWithTag("Cup").transform.position.x - GameObject.FindGameObjectWithTag("MainCamera").transform.position.x;
    distanceY = GameObject.FindGameObjectWithTag("Cup").transform.position.y - GameObject.FindGameObjectWithTag("MainCamera").transform.position.y;
    distanceZ = GameObject.FindGameObjectWithTag("Cup").transform.position.z - GameObject.FindGameObjectWithTag("MainCamera").transform.position.z;

    ballX = distanceX / 4;
    ballY = distanceY / 4;
    ballZ = distanceZ / 4;

    Instantiate(ball, new Vector3(ballX, ballY, 10f), Quaternion.identity);
}

标签: androidunity3dcameracoordinatesaugmented-reality

解决方案


有点难以分辨你的相机和这个杯子对象是如何相关的,以及你的对象应该在哪里产生。

但一般来说,你可以在你的主摄像头前生成一些东西,例如

public void Spawn()
{
    // this basically does FindObjectWithTag("Main camera")
    var camera = Camera.main.transform;
   
    Instantiate(ball, camera.position + camera.forward * 10f, Quaternion.identity);
}

如果您需要不同的距离,则10例如基于该Cup对象,您只需替换该对象或添加另一个偏移矢量。

无论哪种方式,您都不应该将它存储在单独的浮点数中,只是为了再次构建一个新向量;)

例如,而不是

distanceX = GameObject.FindGameObjectWithTag("Cup").transform.position.x - GameObject.FindGameObjectWithTag("MainCamera").transform.position.x;
distanceY = GameObject.FindGameObjectWithTag("Cup").transform.position.y - GameObject.FindGameObjectWithTag("MainCamera").transform.position.y;
distanceZ = GameObject.FindGameObjectWithTag("Cup").transform.position.z - GameObject.FindGameObjectWithTag("MainCamera").transform.position.z;

ballX = distanceX / 4;
ballY = distanceY / 4;
ballZ = distanceZ / 4;

你宁愿做

Vevtor3 distance = GameObject.FindGameObjectWithTag("Cup").transform.position - GameObject.FindGameObjectWithTag("MainCamera").transform.position;

Vector3 ballDelta = distanceX / 4f;
...

推荐阅读