生成程序网格时出现旋转问题
本文关键字:旋转 问题 程序 网格 | 更新日期: 2023-09-27 18:35:35
我觉得我只是在弄清楚这个问题时遇到了心理障碍,所以我想我会检查一下我的代码建议。
我正在尝试生成一个相当简单/一致的形状的道路网格。问题是,在使用 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+ 时,这一切都可以毫无问题地工作。
感谢您的任何输入。
我终于找到了解决这个问题的方法。我已经发现计算(大部分)是正确的,但定位是错误的。它主要是在上面的计算以及中心变量中抛出 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 的网格系统似乎只适用于世界空间,但我使用变换的旋转进行其他检查(主要是创建路径时的流量方向)。所以这个解决方案似乎很好地解决了我的放置问题(我还使用:
_transform.InverseTransformPoint ( center );
当我将中心值发送到此函数时。
编辑:
将代码稍微修改为我当前的解决方案。 unitDirection 是一个字节值,用于判断旋转是 0 (0)、90 (1)、180 (2) 还是 270 (3)(所有部分仅旋转 90 度以使组合更简单(主要是交叉点))。顺序在 90 度和 270 度旋转时颠倒了,因此对 transformForward 和 transformRight 所做的调整将所有内容都放在了应有的位置。