除非我的设备的位置和方向,否则如何在相机前面生成一个对象?

How can I spawn an object in front of the camera unless the position and direction of my device?

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

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

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

我用于在特定位置生成球的代码

[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);
}

很难说出你的相机和这个杯子对象是如何相关的,以及你的对象应该在哪里生成。

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

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;
...