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

Unity中如何基于另一游戏对象调整旋转,实现AR棋盘网格对齐?

问题解决方案

核心问题原因

你当前生成网格时直接在世界空间计算顶点坐标,仅匹配了棋盘的放置位置,未适配棋盘放置时的旋转参数,因此无论怎么单独调整方格旋转都无法对齐。

具体修改步骤

1. 补全获取棋盘的旋转参数

放置棋盘时使用了placementPose.rotation叠加X轴-90度旋转,生成网格时需要同步使用该旋转值:

private float yAdjust = 0F;
// 提前获取放置脚本,同时拿到位置和旋转参数
private TapToPlaceObject placeScript = GameObject.Find("Interaction").GetComponent<TapToPlaceObject>();
private Vector3 boardCenter = placeScript.placementPose.position;
// 和放置棋盘的旋转参数完全保持一致
private Quaternion boardRotation = placeScript.placementPose.rotation * Quaternion.Euler(-90f, 0f, 0f);

2. 调整网格生成逻辑,改用局部坐标计算顶点

不要直接将世界坐标叠加到顶点上,将所有方格放在同一个父物体下,统一调整父物体的位置和旋转对齐棋盘:

private void GenerateSquares(float squareSize)
{
    // 仅保留局部坐标的中心偏移,不叠加世界坐标
    adjust = new Vector3(-4 * squareSize, 0, -4 * squareSize);
    // 统一设置父物体的位置、旋转和棋盘完全对齐,y轴偏移可在此处调整
    transform.position = boardCenter + new Vector3(0, yAdjust, 0);
    transform.rotation = boardRotation;

    squares = new GameObject[8,8];
    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            squares[i, j] = CreateSquare(squareSize,i,j);
        }
    }
}

3. 优化单个方格的生成逻辑

移除顶点中的世界坐标叠加,补全法线计算避免光照异常:

private GameObject CreateSquare(float squareSize, int i, int j)
{
    GameObject square = new GameObject(string.Format("{0},{1}", i, j));
    square.transform.parent = transform;

    Vector3[] vertices = new Vector3[4];
    vertices[0] = new Vector3(i * squareSize, 0, j * squareSize) + adjust;
    vertices[1] = new Vector3(i * squareSize, 0, (j + 1) * squareSize) + adjust;
    vertices[2] = new Vector3((i + 1) * squareSize, 0, j * squareSize) + adjust;
    vertices[3] = new Vector3((i + 1) * squareSize, 0, (j + 1) * squareSize) + adjust;

    int[] triangles = new int[] { 0, 1, 2, 1, 3, 2 };

    Mesh mesh = new Mesh();
    square.AddComponent<MeshFilter>().mesh = mesh;
    square.AddComponent<MeshRenderer>().material = squareMaterial;
    mesh.vertices = vertices;
    mesh.triangles = triangles;
    mesh.RecalculateNormals(); // 新增法线计算,修复光照显示问题
    square.AddComponent<BoxCollider>();

    return square;
}

验证说明

修改后所有方格的坐标都基于父物体的局部空间计算,父物体的位置、旋转和放置的棋盘完全一致,网格会自动适配棋盘的角度和位置,不需要再单独调整每个方格的旋转。

内容的提问来源于stack exchange,提问作者Hiddennord

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:45:01