【问题标题】:Issue with rotation when generating a procedural mesh生成程序网格时出现旋转问题
【发布时间】:2016-02-22 02:39:12
【问题描述】:

我觉得我在解决这个问题时遇到了一个心理障碍,所以我想我应该检查一下关于我的代码的建议。

我正在尝试生成一个形状相当简单/一致的道路网格。问题是,在使用 Transform.forward 和 Transform.right 命令从中心调整点时,它不会正确旋转。

这是我计算顶点的简化版本(已删除斜率和倾斜):

CreateRoadPiece ( Transform _transform, Vector3 center )
    {
        Vector3 p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11;

        p0 = center + _transform.forward - ( _transform.right * 5.0f );
        p1 = center + _transform.forward + ( _transform.right * 5.0f );

        p2 = center + ( _transform.right * 5.0f );
        p3 = center - ( _transform.right * 5.0f );

        p4 = center - _transform.forward - ( _transform.right * 5.0f );
        p5 = center - _transform.forward + ( _transform.right * 5.0f );

        p6 = p0;
        p7 = p1;
        p8 = p2;
        p9 = p3;
        p10 = p4;
        p11 = p5;

        p0.y -= 0.1f;
        p1.y -= 0.1f;
        p2.y -= 0.1f;
        p3.y -= 0.1f;
        p4.y -= 0.1f;
        p5.y -= 0.1f;

        p6.y += 0.1f;
        p7.y += 0.1f;
        p8.y += 0.1f;
        p9.y += 0.1f;
        p10.y += 0.1f;
        p11.y += 0.1f;
    }

_transform 是具有网格组件的对象,它被旋转并定位为面向道路带应铺设的方向。

路段宽 10 个单位,高 0.2 个单位,深 2 个单位。

我曾假设使用 transform.forward 和 transform.right 可以解决旋转问题,但也许我遗漏了什么?

面对 Z+ 时一切正常。

感谢您的任何意见。

【问题讨论】:

  • 为什么会有人投票结束这个?这是一周内唯一一个很好的 Unity3D 问题

标签: c# unity3d


【解决方案1】:

我终于找到了解决办法。我发现计算(大部分)是正确的,但定位是关闭的。它主要是在上面的计算以及中心变量的计算中抛出 Transform.TransformPoint 和所有变体(方向、向量及其逆),但我最终设法达到了我需要的东西。

CreateRoadPiece ( Transform _transform, Vector3 center, byte unitDirection )
{

        Vector3 transformForward = _transform.TransformDirection( _transform.forward );
        Vector3 transformRight = _transform.TransformDirection( _transform.right);

        if( unitDirection == 1 || unitDirection == 3 )
        {
            transformForward = -transformForward;
            transformRight = -transformRight;
        }

        p0 = ( center + ( transformForward + ( -transformRight * 5.0f ) ) );
        p1 = ( center + ( transformForward + ( transformRight * 5.0f ) ) );
        p2 = ( center + ( transformRight * 5.0f ) );
        p3 = ( center + ( -transformRight * 5.0f ) );
        p4 = ( center + ( -transformForward + ( -transformRight * 5.0f ) ) );
        p5 = ( center + ( -transformForward + ( transformRight * 5.0f ) ) );
}

Unity 的 Mesh 系统似乎只在世界空间中工作,但我使用 Transform 的旋转进行其他检查(主要是创建路径时的交通方向)。所以这个解决方案似乎很好地解决了我的放置问题(我也使用:

_transform.InverseTransformPoint ( center );

当我将中心值发送到这个函数时。

编辑:

将代码稍微修改为我当前的解决方案。 unitDirection 是一个字节值,用于判断旋转是 0 (0)、90 (1)、180 (2) 还是 270 (3)(所有部分仅旋转 90 度以使组合更简单(主要是交叉点))。在 90 度和 270 度旋转时顺序颠倒了,因此对 transformForward 和 transformRight 所做的调整将所有内容放在应有的位置。

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2016-02-04
    • 1970-01-01
    相关资源
    最近更新 更多