You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 07:52:46