Hololens2 Unity投篮模拟器:实现篮筐指定距离与高度移动
解决Hololens2投篮模拟器篮筐定位问题
首先明确核心需求:篮筐Y轴固定3米,在相机水平注视方向上与相机保持4.5米水平距离(符合罚球标准)。你之前的代码错误在于对transform.forward的理解和向量运算逻辑偏差,以下是修正方案:
正确实现代码
public GameObject hoop; // Hololens2推荐直接引用AR相机,避免用new GameObject覆盖内置camera变量 public Camera mainCamera; // 罚球标准参数 const float freeThrowHeight = 3f; const float freeThrowHorizontalDistance = 4.5f; public void ChangeHoopPosition() { // 获取相机当前位置 Vector3 cameraPos = mainCamera.transform.position; // 提取相机水平方向的注视向量(忽略Y轴俯仰,保证水平方向定位) Vector3 horizontalForward = new Vector3(mainCamera.transform.forward.x, 0f, mainCamera.transform.forward.z); // 归一化确保向量长度为1,避免因相机俯仰导致距离偏差 if (horizontalForward.magnitude > 0.01f) { horizontalForward.Normalize(); } else { // 极端情况:相机完全垂直俯视/仰视,默认沿Z轴正方向 horizontalForward = Vector3.forward; } // 计算篮筐位置:相机XZ位置 + 水平注视方向*距离,Y固定为3米 Vector3 hoopPos = new Vector3( cameraPos.x + horizontalForward.x * freeThrowHorizontalDistance, freeThrowHeight, cameraPos.z + horizontalForward.z * freeThrowHorizontalDistance ); hoop.transform.position = hoopPos; }
你之前代码的问题分析
- 第一段代码:
transform.position + camera.transform.forward * freeThrowY * freeThrowZ,错误地将Y高度和距离相乘,导致缩放倍数变成3*4.5=13.5,篮筐自然过远。 - 第二段和第三段代码:直接使用
camera.transform.forward(单位向量,长度为1)做加法运算,相当于只在相机前方1米范围内调整,所以篮筐移动幅度极小。
额外场景实现(可选)
如果需求是直线距离相机4.5米(包含垂直方向)且Y固定3米,可以用射线求平面交点的方式实现:
public void ChangeHoopPositionByRay() { // 创建从相机出发、沿注视方向的射线 Ray ray = new Ray(mainCamera.transform.position, mainCamera.transform.forward); // 定义Y=3的平面 Plane plane = new Plane(Vector3.up, new Vector3(0, freeThrowHeight, 0)); if (plane.Raycast(ray, out float distance)) { if (distance <= freeThrowHorizontalDistance) { // 交点过近时,沿射线延长到4.5米处并强制Y=3 Vector3 targetPos = ray.GetPoint(freeThrowHorizontalDistance); hoop.transform.position = new Vector3(targetPos.x, freeThrowHeight, targetPos.z); } else { // 交点在4.5米外,直接取交点位置 hoop.transform.position = ray.GetPoint(distance); } } }
内容的提问来源于stack exchange,提问作者Game Wame
相关产品推荐
相关产品推荐

