Unity3D如何将GameObject放置在其他物体表面并匹配其旋转?
解决建造类游戏中放置物体的旋转匹配问题
你的问题出在仅设置transform.up = hit.normal只能保证物体的up轴对齐表面法线,但forward/right轴仍然沿用全局坐标系方向,没有和目标物体的局部旋转关联,所以当目标物体本身有旋转时,放置物的朝向就会出现偏差。
以下是两种针对性的修正方案:
方案一:匹配目标物体的局部旋转
该方案让放置物贴合表面的同时,尽可能对齐目标物体的局部方向:
RaycastHit hit; if (Physics.Raycast(cameraTransform.position, cameraTransform.TransformDirection(Vector3.forward), out hit, buildingRange, buildable.value)) { buildBall.SetActive(true); buildBall.transform.position = hit.point; if (Input.GetMouseButtonDown(0)) { // 实例化物体时直接传入位置,避免额外赋值 GameObject buildItem = Instantiate(currentItem, hit.point, Quaternion.identity); Transform targetTransform = hit.collider.transform; // 将目标物体的局部前方向投影到表面平面(垂直于法线) Vector3 targetForward = Vector3.ProjectOnPlane(targetTransform.forward, hit.normal).normalized; // 防止目标forward和法线平行导致零向量, fallback到right轴 if (targetForward.magnitude < 0.01f) { targetForward = Vector3.ProjectOnPlane(targetTransform.right, hit.normal).normalized; } // 构建正确的旋转:up轴为法线,forward轴为投影后的目标局部方向 Quaternion correctRotation = Quaternion.LookRotation(targetForward, hit.normal); buildItem.transform.rotation = correctRotation; // 将放置物挂载到目标物体下,继承其旋转(按需选择) buildItem.transform.SetParent(targetTransform); } }
方案二:朝向相机方向同时贴合表面
如果你的需求是放置物朝向相机的大致方向,而非完全匹配目标物体的局部旋转,可以用这个方案:
RaycastHit hit; if (Physics.Raycast(cameraTransform.position, cameraTransform.TransformDirection(Vector3.forward), out hit, buildingRange, buildable.value)) { buildBall.SetActive(true); buildBall.transform.position = hit.point; if (Input.GetMouseButtonDown(0)) { GameObject buildItem = Instantiate(currentItem, hit.point, Quaternion.identity); // 计算相机到放置点的方向,并投影到表面平面 Vector3 cameraToPoint = hit.point - cameraTransform.position; Vector3 forwardDir = Vector3.ProjectOnPlane(cameraToPoint, hit.normal).normalized; // 构建旋转:up轴对齐法线,forward轴朝向相机方向的平面投影 Quaternion correctRotation = Quaternion.LookRotation(forwardDir, hit.normal); buildItem.transform.rotation = correctRotation; buildItem.transform.SetParent(hit.collider.transform); } }
关键说明
Vector3.ProjectOnPlane的作用是把指定方向投影到垂直于法线的平面上,避免forward轴和up轴(法线)出现方向冲突- 加入零向量判断是为了处理目标物体表面法线和其局部forward/right轴平行的极端情况,防止旋转计算出错
内容的提问来源于stack exchange,提问作者BAMBanam
相关产品推荐
相关产品推荐

