Unity中90度增量旋转后立方体面朝向获取方法问询
实现思路与代码
因为旋转都是90°的整数倍,不需要复杂的微积分计算,直接基于方向向量映射或预定义旋转规则表就能解决,以下是具体实现步骤:
1. 定义面的枚举与初始方向映射
先把立方体的6个面定义为枚举,同时每个面对应Unity世界空间中的初始方向向量(匹配默认朝向:北=Z轴正方向,南=Z轴负方向,东=X轴正方向,西=X轴负方向,上=Y轴正方向,下=Y轴负方向):
public enum CubeFace { North, South, East, West, Up, Down } // 初始面对应的世界方向向量 private static readonly Dictionary<CubeFace, Vector3> _faceToDirection = new Dictionary<CubeFace, Vector3> { { CubeFace.North, Vector3.forward }, { CubeFace.South, Vector3.back }, { CubeFace.East, Vector3.right }, { CubeFace.West, Vector3.left }, { CubeFace.Up, Vector3.up }, { CubeFace.Down, Vector3.down } }; // 方向向量对应的面(反向映射) private static readonly Dictionary<Vector3, CubeFace> _directionToFace = _faceToDirection.ToDictionary(kv => kv.Value, kv => kv.Key);
2. 实现旋转计算函数
利用Unity的Quaternion.Euler生成旋转四元数,将初始面的方向向量旋转后,匹配对应的新面:
public CubeFace GetFaceRotation(CubeFace initialFace, Vector3 rotationEuler) { // 获取初始面的方向向量 if (!_faceToDirection.TryGetValue(initialFace, out Vector3 initialDir)) throw new ArgumentException("无效的初始面"); // 生成旋转四元数(Unity欧拉角顺序为Z->X->Y,直接使用传入的(x,y,z)对应绕X、Y、Z轴的旋转) Quaternion rotation = Quaternion.Euler(rotationEuler); // 旋转方向向量,归一化后匹配对应面 Vector3 rotatedDir = rotation * initialDir; rotatedDir = Vector3.Normalize(rotatedDir); // 90度增量旋转后,向量必然与初始6个方向之一完全一致,直接匹配 if (_directionToFace.TryGetValue(rotatedDir, out CubeFace newFace)) return newFace; throw new InvalidOperationException("旋转结果无法匹配到有效面"); }
3. 测试示例
比如你提到的传入East和(0,90,0)(绕Y轴旋转90度):
- 初始East对应
Vector3.right(X正方向) - 绕Y轴转90度后,方向向量变为
Vector3.back(Z负方向),对应South,与预期一致。
替代方案:预定义旋转规则表
如果不想用Quaternion,也可以直接为每个面预定义不同旋转下的结果,比如用嵌套字典存储:
// 示例:绕Y轴旋转90度的面映射 private static readonly Dictionary<CubeFace, CubeFace> _y90Rotation = new Dictionary<CubeFace, CubeFace> { { CubeFace.North, CubeFace.East }, { CubeFace.East, CubeFace.South }, { CubeFace.South, CubeFace.West }, { CubeFace.West, CubeFace.North }, { CubeFace.Up, CubeFace.Up }, { CubeFace.Down, CubeFace.Down } };
然后根据旋转参数各轴的角度(90/180/270),多次应用对应的映射表即可,这种方式性能更高,适合不需要动态旋转角度的场景。
内容的提问来源于stack exchange,提问作者David Martin
相关产品推荐
相关产品推荐

